aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/vfs.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-07-05 17:35:57 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-07-05 17:35:57 -0400
commit89fbf5384ddf666a595eb6562dc63fcbfeb8f6a5 (patch)
treefc2de270b1dae61f850e9aff0784a672667e2acc /fs/nfsd/vfs.c
parent4be95131bf3bca97b6a7db9c6fb63db2cb94da06 (diff)
parenta4058c5bce8aded1a12a59990e84e481a96fb490 (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.c34
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
924static __be32 920 return nfsd_finish_read(file, count, host_err);
925nfsd_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)