aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/vfs.c
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2018-03-28 13:29:11 -0400
committerJ. Bruce Fields <bfields@redhat.com>2018-04-03 15:08:15 -0400
commit87c5942e8fae81ac296267654a047eb2db81592b (patch)
treede00193297b93692cfc86f475fe7cb6d6dbdc56a /fs/nfsd/vfs.c
parentd890be159a71395bd4ceca09233a8a56d7da69ee (diff)
nfsd: Add I/O trace points in the NFSv4 read proc
NFSv4 read compound processing invokes nfsd_splice_read and nfs_readv directly, so the trace points currently in nfsd_read are not invoked for NFSv4 reads. Move the NFSD READ trace points to common helpers so that NFSv4 reads are captured. Also, record any local I/O error that occurs, the total count of bytes that were actually returned, and whether splice or vectored read was used. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/vfs.c')
-rw-r--r--fs/nfsd/vfs.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index ee59a0b24fab..2410b093a2e6 100644
--- a/fs/nfsd/vfs.c
+++ b/fs/nfsd/vfs.c
@@ -881,20 +881,24 @@ static int nfsd_direct_splice_actor(struct pipe_inode_info *pipe,
881 return __splice_from_pipe(pipe, sd, nfsd_splice_actor); 881 return __splice_from_pipe(pipe, sd, nfsd_splice_actor);
882} 882}
883 883
884static __be32 884static __be32 nfsd_finish_read(struct svc_rqst *rqstp, struct svc_fh *fhp,
885nfsd_finish_read(struct file *file, unsigned long *count, int host_err) 885 struct file *file, loff_t offset,
886 unsigned long *count, int host_err)
886{ 887{
887 if (host_err >= 0) { 888 if (host_err >= 0) {
888 nfsdstats.io_read += host_err; 889 nfsdstats.io_read += host_err;
889 *count = host_err; 890 *count = host_err;
890 fsnotify_access(file); 891 fsnotify_access(file);
892 trace_nfsd_read_io_done(rqstp, fhp, offset, *count);
891 return 0; 893 return 0;
892 } else 894 } else {
895 trace_nfsd_read_err(rqstp, fhp, offset, host_err);
893 return nfserrno(host_err); 896 return nfserrno(host_err);
897 }
894} 898}
895 899
896__be32 nfsd_splice_read(struct svc_rqst *rqstp, 900__be32 nfsd_splice_read(struct svc_rqst *rqstp, struct svc_fh *fhp,
897 struct file *file, loff_t offset, unsigned long *count) 901 struct file *file, loff_t offset, unsigned long *count)
898{ 902{
899 struct splice_desc sd = { 903 struct splice_desc sd = {
900 .len = 0, 904 .len = 0,
@@ -904,21 +908,23 @@ __be32 nfsd_splice_read(struct svc_rqst *rqstp,
904 }; 908 };
905 int host_err; 909 int host_err;
906 910
911 trace_nfsd_read_splice(rqstp, fhp, offset, *count);
907 rqstp->rq_next_page = rqstp->rq_respages + 1; 912 rqstp->rq_next_page = rqstp->rq_respages + 1;
908 host_err = splice_direct_to_actor(file, &sd, nfsd_direct_splice_actor); 913 host_err = splice_direct_to_actor(file, &sd, nfsd_direct_splice_actor);
909 return nfsd_finish_read(file, count, host_err); 914 return nfsd_finish_read(rqstp, fhp, file, offset, count, host_err);
910} 915}
911 916
912__be32 nfsd_readv(struct file *file, loff_t offset, struct kvec *vec, int vlen, 917__be32 nfsd_readv(struct svc_rqst *rqstp, struct svc_fh *fhp,
913 unsigned long *count) 918 struct file *file, loff_t offset,
919 struct kvec *vec, int vlen, unsigned long *count)
914{ 920{
915 struct iov_iter iter; 921 struct iov_iter iter;
916 int host_err; 922 int host_err;
917 923
924 trace_nfsd_read_vector(rqstp, fhp, offset, *count);
918 iov_iter_kvec(&iter, READ | ITER_KVEC, vec, vlen, *count); 925 iov_iter_kvec(&iter, READ | ITER_KVEC, vec, vlen, *count);
919 host_err = vfs_iter_read(file, &iter, &offset, 0); 926 host_err = vfs_iter_read(file, &iter, &offset, 0);
920 927 return nfsd_finish_read(rqstp, fhp, file, offset, count, host_err);
921 return nfsd_finish_read(file, count, host_err);
922} 928}
923 929
924/* 930/*
@@ -1034,14 +1040,10 @@ __be32 nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp,
1034 1040
1035 ra = nfsd_init_raparms(file); 1041 ra = nfsd_init_raparms(file);
1036 1042
1037 trace_nfsd_read_opened(rqstp, fhp, offset, *count);
1038
1039 if (file->f_op->splice_read && test_bit(RQ_SPLICE_OK, &rqstp->rq_flags)) 1043 if (file->f_op->splice_read && test_bit(RQ_SPLICE_OK, &rqstp->rq_flags))
1040 err = nfsd_splice_read(rqstp, file, offset, count); 1044 err = nfsd_splice_read(rqstp, fhp, file, offset, count);
1041 else 1045 else
1042 err = nfsd_readv(file, offset, vec, vlen, count); 1046 err = nfsd_readv(rqstp, fhp, file, offset, vec, vlen, count);
1043
1044 trace_nfsd_read_io_done(rqstp, fhp, offset, *count);
1045 1047
1046 if (ra) 1048 if (ra)
1047 nfsd_put_raparams(file, ra); 1049 nfsd_put_raparams(file, ra);