aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/fs
diff options
context:
space:
mode:
authorAmir Goldstein <amir73il@gmail.com>2016-09-23 11:38:11 +0300
committerMiklos Szeredi <mszeredi@redhat.com>2016-12-16 11:02:54 +0100
commit031a072a0b8ac2646def77aa310a95016c884bb0 (patch)
tree26e34c8c636fe13aa0d4e14cf16226333f6f43dd /fs
parentvfs: allow vfs_clone_file_range() across mount points (diff)
downloadwireguard-linux-031a072a0b8ac2646def77aa310a95016c884bb0.tar.xz
wireguard-linux-031a072a0b8ac2646def77aa310a95016c884bb0.zip
vfs: call vfs_clone_file_range() under freeze protection
Move sb_start_write()/sb_end_write() out of the vfs helper and up into the ioctl handler. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/ioctl.c2
-rw-r--r--fs/nfsd/vfs.c3
-rw-r--r--fs/read_write.c3
3 files changed, 2 insertions, 6 deletions
diff --git a/fs/ioctl.c b/fs/ioctl.c
index 6715b7208835..cb9b02940805 100644
--- a/fs/ioctl.c
+++ b/fs/ioctl.c
@@ -226,7 +226,7 @@ static long ioctl_file_clone(struct file *dst_file, unsigned long srcfd,
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);
+ ret = do_clone_file_range(src_file.file, off, dst_file, destoff, olen);
fdput:
fdput(src_file);
return ret;
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index 8ca642fe9b21..357e844aee84 100644
--- a/fs/nfsd/vfs.c
+++ b/fs/nfsd/vfs.c
@@ -509,8 +509,7 @@ __be32 nfsd4_set_nfs4_label(struct svc_rqst *rqstp, struct svc_fh *fhp,
__be32 nfsd4_clone_file_range(struct file *src, u64 src_pos, struct file *dst,
u64 dst_pos, u64 count)
{
- return nfserrno(vfs_clone_file_range(src, src_pos, dst, dst_pos,
- count));
+ return nfserrno(do_clone_file_range(src, src_pos, dst, dst_pos, count));
}
ssize_t nfsd_copy_file_range(struct file *src, u64 src_pos, struct file *dst,
diff --git a/fs/read_write.c b/fs/read_write.c
index 175d30e3b603..c4e206b875d0 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -1687,8 +1687,6 @@ int vfs_clone_file_range(struct file *file_in, loff_t pos_in,
if (pos_in + len > i_size_read(inode_in))
return -EINVAL;
- sb_start_write(inode_out->i_sb);
-
ret = file_in->f_op->clone_file_range(file_in, pos_in,
file_out, pos_out, len);
if (!ret) {
@@ -1696,7 +1694,6 @@ int vfs_clone_file_range(struct file *file_in, loff_t pos_in,
fsnotify_modify(file_out);
}
- sb_end_write(inode_out->i_sb);
return ret;
}
EXPORT_SYMBOL(vfs_clone_file_range);