diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-05 17:35:57 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-05 17:35:57 -0400 |
commit | 89fbf5384ddf666a595eb6562dc63fcbfeb8f6a5 (patch) | |
tree | fc2de270b1dae61f850e9aff0784a672667e2acc /fs/nfsd/vfs.c | |
parent | 4be95131bf3bca97b6a7db9c6fb63db2cb94da06 (diff) | |
parent | a4058c5bce8aded1a12a59990e84e481a96fb490 (diff) |
Merge branch 'work.read_write' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull read/write updates from Al Viro:
"Christoph's fs/read_write.c series - consolidation and cleanups"
* 'work.read_write' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
nfsd: remove nfsd_vfs_read
nfsd: use vfs_iter_read/write
fs: implement vfs_iter_write using do_iter_write
fs: implement vfs_iter_read using do_iter_read
fs: move more code into do_iter_read/do_iter_write
fs: remove __do_readv_writev
fs: remove do_compat_readv_writev
fs: remove do_readv_writev
Diffstat (limited to 'fs/nfsd/vfs.c')
-rw-r--r-- | fs/nfsd/vfs.c | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 6eef95c585e3..38d0383dc7f9 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -911,24 +911,13 @@ __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); | ||
920 | set_fs(oldfs); | ||
921 | return nfsd_finish_read(file, count, host_err); | ||
922 | } | ||
923 | 919 | ||
924 | static __be32 | 920 | return nfsd_finish_read(file, count, host_err); |
925 | nfsd_vfs_read(struct svc_rqst *rqstp, struct file *file, | ||
926 | loff_t offset, struct kvec *vec, int vlen, unsigned long *count) | ||
927 | { | ||
928 | if (file->f_op->splice_read && test_bit(RQ_SPLICE_OK, &rqstp->rq_flags)) | ||
929 | return nfsd_splice_read(rqstp, file, offset, count); | ||
930 | else | ||
931 | return nfsd_readv(file, offset, vec, vlen, count); | ||
932 | } | 921 | } |
933 | 922 | ||
934 | /* | 923 | /* |
@@ -974,7 +963,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, | |||
974 | unsigned long *cnt, int stable) | 963 | unsigned long *cnt, int stable) |
975 | { | 964 | { |
976 | struct svc_export *exp; | 965 | struct svc_export *exp; |
977 | mm_segment_t oldfs; | 966 | struct iov_iter iter; |
978 | __be32 err = 0; | 967 | __be32 err = 0; |
979 | int host_err; | 968 | int host_err; |
980 | int use_wgather; | 969 | int use_wgather; |
@@ -1000,10 +989,8 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, | |||
1000 | if (stable && !use_wgather) | 989 | if (stable && !use_wgather) |
1001 | flags |= RWF_SYNC; | 990 | flags |= RWF_SYNC; |
1002 | 991 | ||
1003 | /* Write the data. */ | 992 | iov_iter_kvec(&iter, WRITE | ITER_KVEC, vec, vlen, *cnt); |
1004 | oldfs = get_fs(); set_fs(KERNEL_DS); | 993 | 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) | 994 | if (host_err < 0) |
1008 | goto out_nfserr; | 995 | goto out_nfserr; |
1009 | *cnt = host_err; | 996 | *cnt = host_err; |
@@ -1044,7 +1031,12 @@ __be32 nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1044 | ra = nfsd_init_raparms(file); | 1031 | ra = nfsd_init_raparms(file); |
1045 | 1032 | ||
1046 | trace_read_opened(rqstp, fhp, offset, vlen); | 1033 | trace_read_opened(rqstp, fhp, offset, vlen); |
1047 | err = nfsd_vfs_read(rqstp, file, offset, vec, vlen, count); | 1034 | |
1035 | if (file->f_op->splice_read && test_bit(RQ_SPLICE_OK, &rqstp->rq_flags)) | ||
1036 | err = nfsd_splice_read(rqstp, file, offset, count); | ||
1037 | else | ||
1038 | err = nfsd_readv(file, offset, vec, vlen, count); | ||
1039 | |||
1048 | trace_read_io_done(rqstp, fhp, offset, vlen); | 1040 | trace_read_io_done(rqstp, fhp, offset, vlen); |
1049 | 1041 | ||
1050 | if (ra) | 1042 | if (ra) |