diff options
author | Christoph Hellwig <hch@lst.de> | 2017-05-27 04:16:53 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-29 17:49:24 -0400 |
commit | 73da852e3831bdc7a38d8d5fba178f35c923b264 (patch) | |
tree | a6a6d7628fd4ba9e7950ff127a4c62e67782953c | |
parent | abbb65899aecfc97bda64b6816d1e501754cfe1f (diff) |
nfsd: use vfs_iter_read/write
Instead of messing with the address limit to use vfs_read/vfs_writev.
Note that this requires that exported file implement ->read_iter and
->write_iter. All currently exportable file systems do this.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/nfsd/vfs.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 2be32955d7f2..37a03c456b38 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -911,13 +911,12 @@ __be32 nfsd_splice_read(struct svc_rqst *rqstp, | |||
911 | __be32 nfsd_readv(struct file *file, loff_t offset, struct kvec *vec, int vlen, | 911 | __be32 nfsd_readv(struct file *file, loff_t offset, struct kvec *vec, int vlen, |
912 | unsigned long *count) | 912 | unsigned long *count) |
913 | { | 913 | { |
914 | mm_segment_t oldfs; | 914 | struct iov_iter iter; |
915 | int host_err; | 915 | int host_err; |
916 | 916 | ||
917 | oldfs = get_fs(); | 917 | iov_iter_kvec(&iter, READ | ITER_KVEC, vec, vlen, *count); |
918 | set_fs(KERNEL_DS); | 918 | host_err = vfs_iter_read(file, &iter, &offset, 0); |
919 | host_err = vfs_readv(file, (struct iovec __user *)vec, vlen, &offset, 0); | 919 | |
920 | set_fs(oldfs); | ||
921 | return nfsd_finish_read(file, count, host_err); | 920 | return nfsd_finish_read(file, count, host_err); |
922 | } | 921 | } |
923 | 922 | ||
@@ -974,7 +973,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, | |||
974 | unsigned long *cnt, int stable) | 973 | unsigned long *cnt, int stable) |
975 | { | 974 | { |
976 | struct svc_export *exp; | 975 | struct svc_export *exp; |
977 | mm_segment_t oldfs; | 976 | struct iov_iter iter; |
978 | __be32 err = 0; | 977 | __be32 err = 0; |
979 | int host_err; | 978 | int host_err; |
980 | int use_wgather; | 979 | int use_wgather; |
@@ -1000,10 +999,8 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, | |||
1000 | if (stable && !use_wgather) | 999 | if (stable && !use_wgather) |
1001 | flags |= RWF_SYNC; | 1000 | flags |= RWF_SYNC; |
1002 | 1001 | ||
1003 | /* Write the data. */ | 1002 | iov_iter_kvec(&iter, WRITE | ITER_KVEC, vec, vlen, *cnt); |
1004 | oldfs = get_fs(); set_fs(KERNEL_DS); | 1003 | host_err = vfs_iter_write(file, &iter, &pos, flags); |
1005 | host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &pos, flags); | ||
1006 | set_fs(oldfs); | ||
1007 | if (host_err < 0) | 1004 | if (host_err < 0) |
1008 | goto out_nfserr; | 1005 | goto out_nfserr; |
1009 | *cnt = host_err; | 1006 | *cnt = host_err; |