Commit 42672471 authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: bind together the front and back ends of the file range exchange code

So far, we've constructed the front end of the file range exchange code
that does all the checking; and the back end of the file mapping
exchange code that actually does the work.  Glue these two pieces
together so that we can turn on the functionality.
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 966ceafc
This diff is collapsed.
......@@ -40,6 +40,7 @@
#include "xfs_btree_mem.h"
#include "xfs_bmap.h"
#include "xfs_exchmaps.h"
#include "xfs_exchrange.h"
/*
* We include this last to have the helpers above available for the trace
......
......@@ -84,6 +84,7 @@ struct xfs_btree_ops;
struct xfs_bmap_intent;
struct xfs_exchmaps_intent;
struct xfs_exchmaps_req;
struct xfs_exchrange;
#define XFS_ATTR_FILTER_FLAGS \
{ XFS_ATTR_ROOT, "ROOT" }, \
......@@ -4785,6 +4786,114 @@ DEFINE_INODE_IREC_EVENT(xfs_exchmaps_mapping1);
DEFINE_INODE_IREC_EVENT(xfs_exchmaps_mapping2);
DEFINE_ITRUNC_EVENT(xfs_exchmaps_update_inode_size);
#define XFS_EXCHRANGE_INODES \
{ 1, "file1" }, \
{ 2, "file2" }
DECLARE_EVENT_CLASS(xfs_exchrange_inode_class,
TP_PROTO(struct xfs_inode *ip, int whichfile),
TP_ARGS(ip, whichfile),
TP_STRUCT__entry(
__field(dev_t, dev)
__field(int, whichfile)
__field(xfs_ino_t, ino)
__field(int, format)
__field(xfs_extnum_t, nex)
__field(int, broot_size)
__field(int, fork_off)
),
TP_fast_assign(
__entry->dev = VFS_I(ip)->i_sb->s_dev;
__entry->whichfile = whichfile;
__entry->ino = ip->i_ino;
__entry->format = ip->i_df.if_format;
__entry->nex = ip->i_df.if_nextents;
__entry->fork_off = xfs_inode_fork_boff(ip);
),
TP_printk("dev %d:%d ino 0x%llx whichfile %s format %s num_extents %llu forkoff 0x%x",
MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->ino,
__print_symbolic(__entry->whichfile, XFS_EXCHRANGE_INODES),
__print_symbolic(__entry->format, XFS_INODE_FORMAT_STR),
__entry->nex,
__entry->fork_off)
)
#define DEFINE_EXCHRANGE_INODE_EVENT(name) \
DEFINE_EVENT(xfs_exchrange_inode_class, name, \
TP_PROTO(struct xfs_inode *ip, int whichfile), \
TP_ARGS(ip, whichfile))
DEFINE_EXCHRANGE_INODE_EVENT(xfs_exchrange_before);
DEFINE_EXCHRANGE_INODE_EVENT(xfs_exchrange_after);
DEFINE_INODE_ERROR_EVENT(xfs_exchrange_error);
#define XFS_EXCHANGE_RANGE_FLAGS_STRS \
{ XFS_EXCHANGE_RANGE_TO_EOF, "TO_EOF" }, \
{ XFS_EXCHANGE_RANGE_DSYNC , "DSYNC" }, \
{ XFS_EXCHANGE_RANGE_DRY_RUN, "DRY_RUN" }, \
{ XFS_EXCHANGE_RANGE_FILE1_WRITTEN, "F1_WRITTEN" }, \
{ __XFS_EXCHANGE_RANGE_UPD_CMTIME1, "CMTIME1" }, \
{ __XFS_EXCHANGE_RANGE_UPD_CMTIME2, "CMTIME2" }
/* file exchange-range tracepoint class */
DECLARE_EVENT_CLASS(xfs_exchrange_class,
TP_PROTO(const struct xfs_exchrange *fxr, struct xfs_inode *ip1,
struct xfs_inode *ip2),
TP_ARGS(fxr, ip1, ip2),
TP_STRUCT__entry(
__field(dev_t, dev)
__field(xfs_ino_t, ip1_ino)
__field(loff_t, ip1_isize)
__field(loff_t, ip1_disize)
__field(xfs_ino_t, ip2_ino)
__field(loff_t, ip2_isize)
__field(loff_t, ip2_disize)
__field(loff_t, file1_offset)
__field(loff_t, file2_offset)
__field(unsigned long long, length)
__field(unsigned long long, flags)
),
TP_fast_assign(
__entry->dev = VFS_I(ip1)->i_sb->s_dev;
__entry->ip1_ino = ip1->i_ino;
__entry->ip1_isize = VFS_I(ip1)->i_size;
__entry->ip1_disize = ip1->i_disk_size;
__entry->ip2_ino = ip2->i_ino;
__entry->ip2_isize = VFS_I(ip2)->i_size;
__entry->ip2_disize = ip2->i_disk_size;
__entry->file1_offset = fxr->file1_offset;
__entry->file2_offset = fxr->file2_offset;
__entry->length = fxr->length;
__entry->flags = fxr->flags;
),
TP_printk("dev %d:%d flags %s bytecount 0x%llx "
"ino1 0x%llx isize 0x%llx disize 0x%llx pos 0x%llx -> "
"ino2 0x%llx isize 0x%llx disize 0x%llx pos 0x%llx",
MAJOR(__entry->dev), MINOR(__entry->dev),
__print_flags_u64(__entry->flags, "|", XFS_EXCHANGE_RANGE_FLAGS_STRS),
__entry->length,
__entry->ip1_ino,
__entry->ip1_isize,
__entry->ip1_disize,
__entry->file1_offset,
__entry->ip2_ino,
__entry->ip2_isize,
__entry->ip2_disize,
__entry->file2_offset)
)
#define DEFINE_EXCHRANGE_EVENT(name) \
DEFINE_EVENT(xfs_exchrange_class, name, \
TP_PROTO(const struct xfs_exchrange *fxr, struct xfs_inode *ip1, \
struct xfs_inode *ip2), \
TP_ARGS(fxr, ip1, ip2))
DEFINE_EXCHRANGE_EVENT(xfs_exchrange_prep);
DEFINE_EXCHRANGE_EVENT(xfs_exchrange_flush);
DEFINE_EXCHRANGE_EVENT(xfs_exchrange_mappings);
TRACE_EVENT(xfs_exchmaps_overhead,
TP_PROTO(struct xfs_mount *mp, unsigned long long bmbt_blocks,
unsigned long long rmapbt_blocks),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment