diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2018-03-28 13:29:11 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2018-04-03 15:08:15 -0400 |
commit | 87c5942e8fae81ac296267654a047eb2db81592b (patch) | |
tree | de00193297b93692cfc86f475fe7cb6d6dbdc56a /fs/nfsd/vfs.c | |
parent | d890be159a71395bd4ceca09233a8a56d7da69ee (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.c | 34 |
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 | ||
884 | static __be32 | 884 | static __be32 nfsd_finish_read(struct svc_rqst *rqstp, struct svc_fh *fhp, |
885 | nfsd_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); |