mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
xfs: port the perag discard code to handle generic groups
Port xfs_discard_extents and its tracepoints to handle generic groups instead of just perags. This is needed to enable busy extent tracking for rtgroups. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
e0b5b97dde
commit
0c271d906e
@ -101,6 +101,24 @@ xfs_discard_endio(
|
||||
bio_put(bio);
|
||||
}
|
||||
|
||||
static inline struct block_device *
|
||||
xfs_group_bdev(
|
||||
const struct xfs_group *xg)
|
||||
{
|
||||
struct xfs_mount *mp = xg->xg_mount;
|
||||
|
||||
switch (xg->xg_type) {
|
||||
case XG_TYPE_AG:
|
||||
return mp->m_ddev_targp->bt_bdev;
|
||||
case XG_TYPE_RTG:
|
||||
return mp->m_rtdev_targp->bt_bdev;
|
||||
default:
|
||||
ASSERT(0);
|
||||
break;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Walk the discard list and issue discards on all the busy extents in the
|
||||
* list. We plug and chain the bios so that we only need a single completion
|
||||
@ -118,12 +136,11 @@ xfs_discard_extents(
|
||||
|
||||
blk_start_plug(&plug);
|
||||
list_for_each_entry(busyp, &extents->extent_list, list) {
|
||||
struct xfs_perag *pag = to_perag(busyp->group);
|
||||
trace_xfs_discard_extent(busyp->group, busyp->bno,
|
||||
busyp->length);
|
||||
|
||||
trace_xfs_discard_extent(pag, busyp->bno, busyp->length);
|
||||
|
||||
error = __blkdev_issue_discard(mp->m_ddev_targp->bt_bdev,
|
||||
xfs_agbno_to_daddr(pag, busyp->bno),
|
||||
error = __blkdev_issue_discard(xfs_group_bdev(busyp->group),
|
||||
xfs_gbno_to_daddr(busyp->group, busyp->bno),
|
||||
XFS_FSB_TO_BB(mp, busyp->length),
|
||||
GFP_KERNEL, &bio);
|
||||
if (error && error != -EOPNOTSUPP) {
|
||||
@ -241,11 +258,11 @@ xfs_trim_gather_extents(
|
||||
* overlapping ranges for now.
|
||||
*/
|
||||
if (fbno + flen < tcur->start) {
|
||||
trace_xfs_discard_exclude(pag, fbno, flen);
|
||||
trace_xfs_discard_exclude(pag_group(pag), fbno, flen);
|
||||
goto next_extent;
|
||||
}
|
||||
if (fbno > tcur->end) {
|
||||
trace_xfs_discard_exclude(pag, fbno, flen);
|
||||
trace_xfs_discard_exclude(pag_group(pag), fbno, flen);
|
||||
if (tcur->by_bno) {
|
||||
tcur->count = 0;
|
||||
break;
|
||||
@ -263,7 +280,7 @@ xfs_trim_gather_extents(
|
||||
|
||||
/* Too small? Give up. */
|
||||
if (flen < tcur->minlen) {
|
||||
trace_xfs_discard_toosmall(pag, fbno, flen);
|
||||
trace_xfs_discard_toosmall(pag_group(pag), fbno, flen);
|
||||
if (tcur->by_bno)
|
||||
goto next_extent;
|
||||
tcur->count = 0;
|
||||
@ -275,7 +292,7 @@ xfs_trim_gather_extents(
|
||||
* discard and try again the next time.
|
||||
*/
|
||||
if (xfs_extent_busy_search(pag_group(pag), fbno, flen)) {
|
||||
trace_xfs_discard_busy(pag, fbno, flen);
|
||||
trace_xfs_discard_busy(pag_group(pag), fbno, flen);
|
||||
goto next_extent;
|
||||
}
|
||||
|
||||
|
@ -2475,23 +2475,26 @@ DEFINE_LOG_RECOVER_ICREATE_ITEM(xfs_log_recover_icreate_cancel);
|
||||
DEFINE_LOG_RECOVER_ICREATE_ITEM(xfs_log_recover_icreate_recover);
|
||||
|
||||
DECLARE_EVENT_CLASS(xfs_discard_class,
|
||||
TP_PROTO(const struct xfs_perag *pag, xfs_agblock_t agbno,
|
||||
TP_PROTO(const struct xfs_group *xg, xfs_agblock_t agbno,
|
||||
xfs_extlen_t len),
|
||||
TP_ARGS(pag, agbno, len),
|
||||
TP_ARGS(xg, agbno, len),
|
||||
TP_STRUCT__entry(
|
||||
__field(dev_t, dev)
|
||||
__field(enum xfs_group_type, type)
|
||||
__field(xfs_agnumber_t, agno)
|
||||
__field(xfs_agblock_t, agbno)
|
||||
__field(xfs_extlen_t, len)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->dev = pag_mount(pag)->m_super->s_dev;
|
||||
__entry->agno = pag_agno(pag);
|
||||
__entry->dev = xg->xg_mount->m_super->s_dev;
|
||||
__entry->type = xg->xg_type;
|
||||
__entry->agno = xg->xg_gno;
|
||||
__entry->agbno = agbno;
|
||||
__entry->len = len;
|
||||
),
|
||||
TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
|
||||
TP_printk("dev %d:%d %sno 0x%x gbno 0x%x fsbcount 0x%x",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
__print_symbolic(__entry->type, XG_TYPE_STRINGS),
|
||||
__entry->agno,
|
||||
__entry->agbno,
|
||||
__entry->len)
|
||||
@ -2499,9 +2502,9 @@ DECLARE_EVENT_CLASS(xfs_discard_class,
|
||||
|
||||
#define DEFINE_DISCARD_EVENT(name) \
|
||||
DEFINE_EVENT(xfs_discard_class, name, \
|
||||
TP_PROTO(const struct xfs_perag *pag, xfs_agblock_t agbno, \
|
||||
xfs_extlen_t len), \
|
||||
TP_ARGS(pag, agbno, len))
|
||||
TP_PROTO(const struct xfs_group *xg, xfs_agblock_t agbno, \
|
||||
xfs_extlen_t len), \
|
||||
TP_ARGS(xg, agbno, len))
|
||||
DEFINE_DISCARD_EVENT(xfs_discard_extent);
|
||||
DEFINE_DISCARD_EVENT(xfs_discard_toosmall);
|
||||
DEFINE_DISCARD_EVENT(xfs_discard_exclude);
|
||||
|
Loading…
Reference in New Issue
Block a user