On Fri, Aug 09, 2024 at 05:02:26PM +0800, liuhuan01@xxxxxxxxxx wrote: > From: liuh <liuhuan01@xxxxxxxxxx> > > Use FICLONE/FICLONERANGE/FIDEDUPERANGE instead of XFS_IOC_CLONE/XFS_IOC_CLONE_RANGE/XFS_IOC_FILE_EXTENT_SAME. > And remove dead code. Where was the dead code? > Signed-off-by: liuh <liuhuan01@xxxxxxxxxx> > --- > include/xfs_fs_compat.h | 54 ----------------------------------------- > io/reflink.c | 52 +++++++++++++++++++-------------------- > 2 files changed, 26 insertions(+), 80 deletions(-) > > diff --git a/include/xfs_fs_compat.h b/include/xfs_fs_compat.h > index 0077f00c..e53dcc6e 100644 > --- a/include/xfs_fs_compat.h > +++ b/include/xfs_fs_compat.h > @@ -31,60 +31,6 @@ > #define XFS_XFLAG_FILESTREAM FS_XFLAG_FILESTREAM > #define XFS_XFLAG_HASATTR FS_XFLAG_HASATTR > > -/* > - * Don't use this. > - * Use struct file_clone_range > - */ > -struct xfs_clone_args { > - __s64 src_fd; > - __u64 src_offset; > - __u64 src_length; > - __u64 dest_offset; > -}; > - > -/* > - * Don't use these. > - * Use FILE_DEDUPE_RANGE_SAME / FILE_DEDUPE_RANGE_DIFFERS > - */ > -#define XFS_EXTENT_DATA_SAME 0 > -#define XFS_EXTENT_DATA_DIFFERS 1 > - > -/* Don't use this. Use file_dedupe_range_info */ > -struct xfs_extent_data_info { > - __s64 fd; /* in - destination file */ > - __u64 logical_offset; /* in - start of extent in destination */ > - __u64 bytes_deduped; /* out - total # of bytes we were able > - * to dedupe from this file */ > - /* status of this dedupe operation: > - * < 0 for error > - * == XFS_EXTENT_DATA_SAME if dedupe succeeds > - * == XFS_EXTENT_DATA_DIFFERS if data differs > - */ > - __s32 status; /* out - see above description */ > - __u32 reserved; > -}; > - > -/* > - * Don't use this. > - * Use struct file_dedupe_range > - */ > -struct xfs_extent_data { > - __u64 logical_offset; /* in - start of extent in source */ > - __u64 length; /* in - length of extent */ > - __u16 dest_count; /* in - total elements in info array */ > - __u16 reserved1; > - __u32 reserved2; > - struct xfs_extent_data_info info[0]; > -}; > - > -/* > - * Don't use these. > - * Use FICLONE/FICLONERANGE/FIDEDUPERANGE > - */ > -#define XFS_IOC_CLONE _IOW (0x94, 9, int) > -#define XFS_IOC_CLONE_RANGE _IOW (0x94, 13, struct xfs_clone_args) > -#define XFS_IOC_FILE_EXTENT_SAME _IOWR(0x94, 54, struct xfs_extent_data) > - > /* 64-bit seconds counter that works independently of the C library time_t. */ > typedef long long int time64_t; > > diff --git a/io/reflink.c b/io/reflink.c > index b6a3c05a..154ca65b 100644 > --- a/io/reflink.c > +++ b/io/reflink.c > @@ -43,49 +43,49 @@ dedupe_ioctl( > uint64_t len, > int *ops) > { > - struct xfs_extent_data *args; > - struct xfs_extent_data_info *info; > + struct file_dedupe_range *args; > + struct file_dedupe_range_info *info; > int error; > uint64_t deduped = 0; > > - args = calloc(1, sizeof(struct xfs_extent_data) + > - sizeof(struct xfs_extent_data_info)); > + args = calloc(1, sizeof(struct file_dedupe_range) + > + sizeof(struct file_dedupe_range_info)); > if (!args) > goto done; > - info = (struct xfs_extent_data_info *)(args + 1); > - args->logical_offset = soffset; > - args->length = len; > + info = (struct file_dedupe_range_info *)(args + 1); > + args->src_offset = soffset; > + args->src_length = len; > args->dest_count = 1; > - info->fd = file->fd; > - info->logical_offset = doffset; > + info->dest_fd = file->fd; > + info->dest_offset = doffset; > > - while (args->length > 0 || !*ops) { > - error = ioctl(fd, XFS_IOC_FILE_EXTENT_SAME, args); > + while (args->src_length > 0 || !*ops) { > + error = ioctl(fd, FIDEDUPERANGE, args); > if (error) { > - perror("XFS_IOC_FILE_EXTENT_SAME"); > + perror("FIDEDUPERANGE"); If you update these error message prefixes, you'll likely need to update fstests too: tests/generic/122.out:7:XFS_IOC_FILE_EXTENT_SAME: Extents did not match. tests/generic/136.out:10:XFS_IOC_FILE_EXTENT_SAME: Extents did not match. tests/generic/157.out:5:XFS_IOC_CLONE_RANGE: Invalid cross-device link tests/generic/157.out:7:XFS_IOC_CLONE_RANGE: Invalid argument tests/generic/157.out:9:XFS_IOC_CLONE_RANGE: Invalid argument tests/generic/157.out:11:XFS_IOC_CLONE_RANGE: Invalid argument tests/generic/157.out:13:XFS_IOC_CLONE_RANGE: Is a directory tests/generic/157.out:15:XFS_IOC_CLONE_RANGE: Invalid argument tests/generic/157.out:19:XFS_IOC_CLONE_RANGE: Invalid argument tests/generic/157.out:21:XFS_IOC_CLONE_RANGE: Invalid argument tests/generic/157.out:23:XFS_IOC_CLONE_RANGE: Bad file descriptor tests/generic/158.out:5:XFS_IOC_FILE_EXTENT_SAME: Invalid cross-device link tests/generic/158.out:7:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/158.out:9:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/158.out:11:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/158.out:13:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/158.out:15:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/158.out:17:XFS_IOC_FILE_EXTENT_SAME: Is a directory tests/generic/158.out:19:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/158.out:23:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/158.out:25:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/303.out:7:XFS_IOC_CLONE_RANGE: Invalid argument tests/generic/303.out:10:XFS_IOC_CLONE_RANGE: Invalid argument tests/generic/303.out:12:XFS_IOC_CLONE_RANGE: Invalid argument tests/generic/303.out:14:XFS_IOC_CLONE_RANGE: Invalid argument tests/generic/304.out:5:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/304.out:7:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/304.out:9:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/304.out:11:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/304.out:13:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/304.out:15:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/304.out:17:XFS_IOC_FILE_EXTENT_SAME: Invalid argument tests/generic/493.out:5:XFS_IOC_FILE_EXTENT_SAME: Text file busy tests/generic/493.out:6:XFS_IOC_FILE_EXTENT_SAME: Text file busy tests/generic/516.out:7:XFS_IOC_FILE_EXTENT_SAME: Extents did not match. tests/generic/518.out:6:XFS_IOC_CLONE_RANGE: Invalid argument tests/xfs/319.out:10:XFS_IOC_CLONE_RANGE: Input/output error tests/xfs/321.out:9:XFS_IOC_CLONE_RANGE: Input/output error tests/xfs/322.out:9:XFS_IOC_CLONE_RANGE: Input/output error tests/xfs/323.out:9:XFS_IOC_CLONE_RANGE: Input/output error (or leave the prefixes alone) --D > exitcode = 1; > goto done; > } > if (info->status < 0) { > - fprintf(stderr, "XFS_IOC_FILE_EXTENT_SAME: %s\n", > + fprintf(stderr, "FIDEDUPERANGE: %s\n", > _(strerror(-info->status))); > goto done; > } > - if (info->status == XFS_EXTENT_DATA_DIFFERS) { > - fprintf(stderr, "XFS_IOC_FILE_EXTENT_SAME: %s\n", > + if (info->status == FILE_DEDUPE_RANGE_DIFFERS) { > + fprintf(stderr, "FIDEDUPERANGE: %s\n", > _("Extents did not match.")); > goto done; > } > - if (args->length != 0 && > + if (args->src_length != 0 && > (info->bytes_deduped == 0 || > - info->bytes_deduped > args->length)) > + info->bytes_deduped > args->src_length)) > break; > > (*ops)++; > - args->logical_offset += info->bytes_deduped; > - info->logical_offset += info->bytes_deduped; > - if (args->length >= info->bytes_deduped) > - args->length -= info->bytes_deduped; > + args->src_offset += info->bytes_deduped; > + info->dest_offset += info->bytes_deduped; > + if (args->src_length >= info->bytes_deduped) > + args->src_length -= info->bytes_deduped; > deduped += info->bytes_deduped; > } > done: > @@ -200,21 +200,21 @@ reflink_ioctl( > uint64_t len, > int *ops) > { > - struct xfs_clone_args args; > + struct file_clone_range args; > int error; > > if (soffset == 0 && doffset == 0 && len == 0) { > - error = ioctl(file->fd, XFS_IOC_CLONE, fd); > + error = ioctl(file->fd, FICLONE, fd); > if (error) > - perror("XFS_IOC_CLONE"); > + perror("FICLONE"); > } else { > args.src_fd = fd; > args.src_offset = soffset; > args.src_length = len; > args.dest_offset = doffset; > - error = ioctl(file->fd, XFS_IOC_CLONE_RANGE, &args); > + error = ioctl(file->fd, FICLONERANGE, &args); > if (error) > - perror("XFS_IOC_CLONE_RANGE"); > + perror("FICLONERANGE"); > } > if (!error) > (*ops)++; > -- > 2.43.0 > >