xfs: implement the GETFSMAP ioctl
Introduce a new ioctl that uses the reverse mapping btree to return information about the physical layout of the filesystem. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:
@@ -40,6 +40,8 @@ struct xfs_inode_log_format;
|
||||
struct xfs_bmbt_irec;
|
||||
struct xfs_btree_cur;
|
||||
struct xfs_refcount_irec;
|
||||
struct xfs_fsmap;
|
||||
struct xfs_rmap_irec;
|
||||
|
||||
DECLARE_EVENT_CLASS(xfs_attr_list_class,
|
||||
TP_PROTO(struct xfs_attr_list_context *ctx),
|
||||
@@ -3267,6 +3269,88 @@ DEFINE_INODE_IREC_EVENT(xfs_swap_extent_rmap_remap);
|
||||
DEFINE_INODE_IREC_EVENT(xfs_swap_extent_rmap_remap_piece);
|
||||
DEFINE_INODE_ERROR_EVENT(xfs_swap_extent_rmap_error);
|
||||
|
||||
/* fsmap traces */
|
||||
DECLARE_EVENT_CLASS(xfs_fsmap_class,
|
||||
TP_PROTO(struct xfs_mount *mp, u32 keydev, xfs_agnumber_t agno,
|
||||
struct xfs_rmap_irec *rmap),
|
||||
TP_ARGS(mp, keydev, agno, rmap),
|
||||
TP_STRUCT__entry(
|
||||
__field(dev_t, dev)
|
||||
__field(dev_t, keydev)
|
||||
__field(xfs_agnumber_t, agno)
|
||||
__field(xfs_fsblock_t, bno)
|
||||
__field(xfs_filblks_t, len)
|
||||
__field(__uint64_t, owner)
|
||||
__field(__uint64_t, offset)
|
||||
__field(unsigned int, flags)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->dev = mp->m_super->s_dev;
|
||||
__entry->keydev = new_decode_dev(keydev);
|
||||
__entry->agno = agno;
|
||||
__entry->bno = rmap->rm_startblock;
|
||||
__entry->len = rmap->rm_blockcount;
|
||||
__entry->owner = rmap->rm_owner;
|
||||
__entry->offset = rmap->rm_offset;
|
||||
__entry->flags = rmap->rm_flags;
|
||||
),
|
||||
TP_printk("dev %d:%d keydev %d:%d agno %u bno %llu len %llu owner %lld offset %llu flags 0x%x\n",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
MAJOR(__entry->keydev), MINOR(__entry->keydev),
|
||||
__entry->agno,
|
||||
__entry->bno,
|
||||
__entry->len,
|
||||
__entry->owner,
|
||||
__entry->offset,
|
||||
__entry->flags)
|
||||
)
|
||||
#define DEFINE_FSMAP_EVENT(name) \
|
||||
DEFINE_EVENT(xfs_fsmap_class, name, \
|
||||
TP_PROTO(struct xfs_mount *mp, u32 keydev, xfs_agnumber_t agno, \
|
||||
struct xfs_rmap_irec *rmap), \
|
||||
TP_ARGS(mp, keydev, agno, rmap))
|
||||
DEFINE_FSMAP_EVENT(xfs_fsmap_low_key);
|
||||
DEFINE_FSMAP_EVENT(xfs_fsmap_high_key);
|
||||
DEFINE_FSMAP_EVENT(xfs_fsmap_mapping);
|
||||
|
||||
DECLARE_EVENT_CLASS(xfs_getfsmap_class,
|
||||
TP_PROTO(struct xfs_mount *mp, struct xfs_fsmap *fsmap),
|
||||
TP_ARGS(mp, fsmap),
|
||||
TP_STRUCT__entry(
|
||||
__field(dev_t, dev)
|
||||
__field(dev_t, keydev)
|
||||
__field(xfs_daddr_t, block)
|
||||
__field(xfs_daddr_t, len)
|
||||
__field(__uint64_t, owner)
|
||||
__field(__uint64_t, offset)
|
||||
__field(__uint64_t, flags)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->dev = mp->m_super->s_dev;
|
||||
__entry->keydev = new_decode_dev(fsmap->fmr_device);
|
||||
__entry->block = fsmap->fmr_physical;
|
||||
__entry->len = fsmap->fmr_length;
|
||||
__entry->owner = fsmap->fmr_owner;
|
||||
__entry->offset = fsmap->fmr_offset;
|
||||
__entry->flags = fsmap->fmr_flags;
|
||||
),
|
||||
TP_printk("dev %d:%d keydev %d:%d block %llu len %llu owner %lld offset %llu flags 0x%llx\n",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
MAJOR(__entry->keydev), MINOR(__entry->keydev),
|
||||
__entry->block,
|
||||
__entry->len,
|
||||
__entry->owner,
|
||||
__entry->offset,
|
||||
__entry->flags)
|
||||
)
|
||||
#define DEFINE_GETFSMAP_EVENT(name) \
|
||||
DEFINE_EVENT(xfs_getfsmap_class, name, \
|
||||
TP_PROTO(struct xfs_mount *mp, struct xfs_fsmap *fsmap), \
|
||||
TP_ARGS(mp, fsmap))
|
||||
DEFINE_GETFSMAP_EVENT(xfs_getfsmap_low_key);
|
||||
DEFINE_GETFSMAP_EVENT(xfs_getfsmap_high_key);
|
||||
DEFINE_GETFSMAP_EVENT(xfs_getfsmap_mapping);
|
||||
|
||||
#endif /* _TRACE_XFS_H */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
|
||||
Reference in New Issue
Block a user