]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-5.15/nfsd-add-an-nfsd_file_fsync-tracepoint.patch
Fixes for 5.15
[thirdparty/kernel/stable-queue.git] / queue-5.15 / nfsd-add-an-nfsd_file_fsync-tracepoint.patch
1 From c0629d6013d038d0c6d484c0c5905274a4fe775f Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Thu, 3 Nov 2022 16:22:48 -0400
4 Subject: NFSD: Add an nfsd_file_fsync tracepoint
5
6 From: Chuck Lever <chuck.lever@oracle.com>
7
8 [ Upstream commit d7064eaf688cfe454c50db9f59298463d80d403c ]
9
10 Add a tracepoint to capture the number of filecache-triggered fsync
11 calls and which files needed it. Also, record when an fsync triggers
12 a write verifier reset.
13
14 Examples:
15
16 <...>-97 [007] 262.505611: nfsd_file_free: inode=0xffff888171e08140 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d2400
17 <...>-97 [007] 262.505612: nfsd_file_fsync: inode=0xffff888171e08140 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d2400 ret=0
18 <...>-97 [007] 262.505623: nfsd_file_free: inode=0xffff888171e08dc0 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d1e00
19 <...>-97 [007] 262.505624: nfsd_file_fsync: inode=0xffff888171e08dc0 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d1e00 ret=0
20
21 Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
22 Reviewed-by: Jeff Layton <jlayton@kernel.org>
23 Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
24 ---
25 fs/nfsd/filecache.c | 5 ++++-
26 fs/nfsd/trace.h | 31 +++++++++++++++++++++++++++++++
27 2 files changed, 35 insertions(+), 1 deletion(-)
28
29 diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c
30 index 522e900a88605..6b8873b0c2c38 100644
31 --- a/fs/nfsd/filecache.c
32 +++ b/fs/nfsd/filecache.c
33 @@ -335,10 +335,13 @@ static void
34 nfsd_file_fsync(struct nfsd_file *nf)
35 {
36 struct file *file = nf->nf_file;
37 + int ret;
38
39 if (!file || !(file->f_mode & FMODE_WRITE))
40 return;
41 - if (vfs_fsync(file, 1) != 0)
42 + ret = vfs_fsync(file, 1);
43 + trace_nfsd_file_fsync(nf, ret);
44 + if (ret)
45 nfsd_reset_write_verifier(net_generic(nf->nf_net, nfsd_net_id));
46 }
47
48 diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
49 index 2c72a666aa9c2..eb155e98a9dc2 100644
50 --- a/fs/nfsd/trace.h
51 +++ b/fs/nfsd/trace.h
52 @@ -1237,6 +1237,37 @@ DEFINE_EVENT(nfsd_file_lruwalk_class, name, \
53 DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_gc_removed);
54 DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_shrinker_removed);
55
56 +TRACE_EVENT(nfsd_file_fsync,
57 + TP_PROTO(
58 + const struct nfsd_file *nf,
59 + int ret
60 + ),
61 + TP_ARGS(nf, ret),
62 + TP_STRUCT__entry(
63 + __field(void *, nf_inode)
64 + __field(int, nf_ref)
65 + __field(int, ret)
66 + __field(unsigned long, nf_flags)
67 + __field(unsigned char, nf_may)
68 + __field(struct file *, nf_file)
69 + ),
70 + TP_fast_assign(
71 + __entry->nf_inode = nf->nf_inode;
72 + __entry->nf_ref = refcount_read(&nf->nf_ref);
73 + __entry->ret = ret;
74 + __entry->nf_flags = nf->nf_flags;
75 + __entry->nf_may = nf->nf_may;
76 + __entry->nf_file = nf->nf_file;
77 + ),
78 + TP_printk("inode=%p ref=%d flags=%s may=%s nf_file=%p ret=%d",
79 + __entry->nf_inode,
80 + __entry->nf_ref,
81 + show_nf_flags(__entry->nf_flags),
82 + show_nfsd_may_flags(__entry->nf_may),
83 + __entry->nf_file, __entry->ret
84 + )
85 +);
86 +
87 #include "cache.h"
88
89 TRACE_DEFINE_ENUM(RC_DROPIT);
90 --
91 2.43.0
92