On Wed, Feb 16, 2022 at 03:21:23PM -0500, Josef Bacik wrote: > Currently we disallow reflink and dedupe if the two files aren't on the > same vfsmount. However we really only need to disallow it if they're > not on the same super block. It is very common for btrfs to have a main > subvolume that is mounted and then different subvolumes mounted at > different locations. It's allowed to reflink between these volumes, but > the vfsmount check disallows this. Instead fix dedupe to check for the > same superblock, and simply remove the vfsmount check for reflink as it > already does the superblock check. > > Signed-off-by: Josef Bacik <josef@xxxxxxxxxxxxxx> Seems pretty spiffy to /me/... ;) Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > fs/ioctl.c | 4 ---- > fs/remap_range.c | 7 +------ > 2 files changed, 1 insertion(+), 10 deletions(-) > > diff --git a/fs/ioctl.c b/fs/ioctl.c > index 1ed097e94af2..090bf47606ab 100644 > --- a/fs/ioctl.c > +++ b/fs/ioctl.c > @@ -236,9 +236,6 @@ static long ioctl_file_clone(struct file *dst_file, unsigned long srcfd, > > if (!src_file.file) > return -EBADF; > - ret = -EXDEV; > - if (src_file.file->f_path.mnt != dst_file->f_path.mnt) > - goto fdput; > cloned = vfs_clone_file_range(src_file.file, off, dst_file, destoff, > olen, 0); > if (cloned < 0) > @@ -247,7 +244,6 @@ static long ioctl_file_clone(struct file *dst_file, unsigned long srcfd, > ret = -EINVAL; > else > ret = 0; > -fdput: > fdput(src_file); > return ret; > } > diff --git a/fs/remap_range.c b/fs/remap_range.c > index 231159682907..bc5fb006dc79 100644 > --- a/fs/remap_range.c > +++ b/fs/remap_range.c > @@ -362,11 +362,6 @@ loff_t do_clone_file_range(struct file *file_in, loff_t pos_in, > > WARN_ON_ONCE(remap_flags & REMAP_FILE_DEDUP); > > - /* > - * FICLONE/FICLONERANGE ioctls enforce that src and dest files are on > - * the same mount. Practically, they only need to be on the same file > - * system. > - */ > if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) > return -EXDEV; > > @@ -458,7 +453,7 @@ loff_t vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos, > goto out_drop_write; > > ret = -EXDEV; > - if (src_file->f_path.mnt != dst_file->f_path.mnt) > + if (file_inode(src_file)->i_sb != file_inode(dst_file)->i_sb) > goto out_drop_write; > > ret = -EISDIR; > -- > 2.26.3 >