mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 22:26:55 +00:00
NFSD: Add an nfsd_file_fsync tracepoint
[ Upstream commit d7064eaf68
]
Add a tracepoint to capture the number of filecache-triggered fsync
calls and which files needed it. Also, record when an fsync triggers
a write verifier reset.
Examples:
<...>-97 [007] 262.505611: nfsd_file_free: inode=0xffff888171e08140 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d2400
<...>-97 [007] 262.505612: nfsd_file_fsync: inode=0xffff888171e08140 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d2400 ret=0
<...>-97 [007] 262.505623: nfsd_file_free: inode=0xffff888171e08dc0 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d1e00
<...>-97 [007] 262.505624: nfsd_file_fsync: inode=0xffff888171e08dc0 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d1e00 ret=0
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
8dafc61430
commit
2c1be5d65d
2 changed files with 35 additions and 1 deletions
|
@ -335,10 +335,13 @@ static void
|
||||||
nfsd_file_fsync(struct nfsd_file *nf)
|
nfsd_file_fsync(struct nfsd_file *nf)
|
||||||
{
|
{
|
||||||
struct file *file = nf->nf_file;
|
struct file *file = nf->nf_file;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (!file || !(file->f_mode & FMODE_WRITE))
|
if (!file || !(file->f_mode & FMODE_WRITE))
|
||||||
return;
|
return;
|
||||||
if (vfs_fsync(file, 1) != 0)
|
ret = vfs_fsync(file, 1);
|
||||||
|
trace_nfsd_file_fsync(nf, ret);
|
||||||
|
if (ret)
|
||||||
nfsd_reset_write_verifier(net_generic(nf->nf_net, nfsd_net_id));
|
nfsd_reset_write_verifier(net_generic(nf->nf_net, nfsd_net_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1237,6 +1237,37 @@ DEFINE_EVENT(nfsd_file_lruwalk_class, name, \
|
||||||
DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_gc_removed);
|
DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_gc_removed);
|
||||||
DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_shrinker_removed);
|
DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_shrinker_removed);
|
||||||
|
|
||||||
|
TRACE_EVENT(nfsd_file_fsync,
|
||||||
|
TP_PROTO(
|
||||||
|
const struct nfsd_file *nf,
|
||||||
|
int ret
|
||||||
|
),
|
||||||
|
TP_ARGS(nf, ret),
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(void *, nf_inode)
|
||||||
|
__field(int, nf_ref)
|
||||||
|
__field(int, ret)
|
||||||
|
__field(unsigned long, nf_flags)
|
||||||
|
__field(unsigned char, nf_may)
|
||||||
|
__field(struct file *, nf_file)
|
||||||
|
),
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->nf_inode = nf->nf_inode;
|
||||||
|
__entry->nf_ref = refcount_read(&nf->nf_ref);
|
||||||
|
__entry->ret = ret;
|
||||||
|
__entry->nf_flags = nf->nf_flags;
|
||||||
|
__entry->nf_may = nf->nf_may;
|
||||||
|
__entry->nf_file = nf->nf_file;
|
||||||
|
),
|
||||||
|
TP_printk("inode=%p ref=%d flags=%s may=%s nf_file=%p ret=%d",
|
||||||
|
__entry->nf_inode,
|
||||||
|
__entry->nf_ref,
|
||||||
|
show_nf_flags(__entry->nf_flags),
|
||||||
|
show_nfsd_may_flags(__entry->nf_may),
|
||||||
|
__entry->nf_file, __entry->ret
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
|
|
||||||
TRACE_DEFINE_ENUM(RC_DROPIT);
|
TRACE_DEFINE_ENUM(RC_DROPIT);
|
||||||
|
|
Loading…
Reference in a new issue