diff options
author | Amir Goldstein <amir73il@gmail.com> | 2016-09-23 10:38:10 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@redhat.com> | 2016-12-16 11:02:54 +0100 |
commit | 913b86e92e1f68ab9db00ccb0fecf594732511e5 (patch) | |
tree | 5336fd4aef2feec90dc4c5fa25567813b6154332 /fs/ioctl.c | |
parent | vfs: no mnt_want_write_file() in vfs_{copy,clone}_file_range() (diff) | |
download | linux-913b86e92e1f68ab9db00ccb0fecf594732511e5.tar.xz linux-913b86e92e1f68ab9db00ccb0fecf594732511e5.zip |
vfs: allow vfs_clone_file_range() across mount points
FICLONE/FICLONERANGE ioctls return -EXDEV if src and dest
files are not on the same mount point.
Practically, clone only requires that src and dest files
are on the same file system.
Move the check for same mount point to ioctl handler and keep
only the check for same super block in the vfs helper.
A following patch is going to use the vfs_clone_file_range()
helper in overlayfs to copy up between lower and upper
mount points on the same file system.
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/ioctl.c')
-rw-r--r-- | fs/ioctl.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/ioctl.c b/fs/ioctl.c index c415668c86d4..6715b7208835 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -223,7 +223,11 @@ 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; ret = vfs_clone_file_range(src_file.file, off, dst_file, destoff, olen); +fdput: fdput(src_file); return ret; } |