nfsd: add a tracepoint for nfsd_setattr
authorJeff Layton <jlayton@kernel.org>
Sat, 3 May 2025 19:59:21 +0000 (15:59 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Sun, 11 May 2025 23:48:30 +0000 (19:48 -0400)
Turn Sargun's internal kprobe based implementation of this into a normal
static tracepoint. Also, remove the dprintk's that got added recently
with the fix for zero-length ACLs.

Cc: Sargun Dillon <sargun@sargun.me>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/trace.h
fs/nfsd/vfs.c
include/trace/misc/fs.h

index fc373c4d5fdd6c75d48230306937accd4eb8ad08..b435276a1aaaa880b8c9b10f332752dd7973d0b9 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/tracepoint.h>
 #include <linux/sunrpc/clnt.h>
 #include <linux/sunrpc/xprt.h>
+#include <trace/misc/fs.h>
 #include <trace/misc/nfs.h>
 #include <trace/misc/sunrpc.h>
 
@@ -2355,6 +2356,44 @@ DEFINE_EVENT(nfsd_copy_async_done_class,         \
 DEFINE_COPY_ASYNC_DONE_EVENT(done);
 DEFINE_COPY_ASYNC_DONE_EVENT(cancel);
 
+TRACE_EVENT(nfsd_vfs_setattr,
+       TP_PROTO(
+               const struct svc_rqst *rqstp,
+               const struct svc_fh *fhp,
+               const struct iattr *iap,
+               const struct timespec64 *guardtime
+       ),
+       TP_ARGS(rqstp, fhp, iap, guardtime),
+       TP_STRUCT__entry(
+               NFSD_TRACE_PROC_CALL_FIELDS(rqstp)
+               __field(u32, fh_hash)
+               __field(s64, gtime_tv_sec)
+               __field(u32, gtime_tv_nsec)
+               __field(unsigned int, ia_valid)
+               __field(loff_t, ia_size)
+               __field(uid_t, ia_uid)
+               __field(gid_t, ia_gid)
+               __field(umode_t, ia_mode)
+       ),
+       TP_fast_assign(
+               NFSD_TRACE_PROC_CALL_ASSIGNMENTS(rqstp);
+               __entry->fh_hash = knfsd_fh_hash(&fhp->fh_handle);
+               __entry->gtime_tv_sec = guardtime ? guardtime->tv_sec : 0;
+               __entry->gtime_tv_nsec = guardtime ? guardtime->tv_nsec : 0;
+               __entry->ia_valid = iap->ia_valid;
+               __entry->ia_size = iap->ia_size;
+               __entry->ia_uid = __kuid_val(iap->ia_uid);
+               __entry->ia_gid = __kgid_val(iap->ia_gid);
+               __entry->ia_mode = iap->ia_mode;
+       ),
+       TP_printk(
+               "xid=0x%08x fh_hash=0x%08x ia_valid=%s ia_size=%llu ia_mode=0%o ia_uid=%u ia_gid=%u guard_time=%lld.%u",
+               __entry->xid, __entry->fh_hash, show_ia_valid_flags(__entry->ia_valid),
+               __entry->ia_size, __entry->ia_mode, __entry->ia_uid, __entry->ia_gid,
+               __entry->gtime_tv_sec, __entry->gtime_tv_nsec
+       )
+)
+
 #endif /* _NFSD_TRACE_H */
 
 #undef TRACE_INCLUDE_PATH
index 68f7d0094b067166b0cf91b1411827333a78e2cf..9e0a858d21299c1373c24d9d719dff52159284fb 100644 (file)
@@ -501,6 +501,8 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp,
        bool            size_change = (iap->ia_valid & ATTR_SIZE);
        int             retries;
 
+       trace_nfsd_vfs_setattr(rqstp, fhp, iap, guardtime);
+
        if (iap->ia_valid & ATTR_SIZE) {
                accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE;
                ftype = S_IFREG;
index 738b97f22f3651f2370830037a8f4bfdf9a42ad4..0406ebe2a80a499dfcadb7e63db4d9e4a84d4d64 100644 (file)
                { LOOKUP_BENEATH,       "BENEATH" }, \
                { LOOKUP_IN_ROOT,       "IN_ROOT" }, \
                { LOOKUP_CACHED,        "CACHED" })
+
+#define show_ia_valid_flags(flags)                     \
+       __print_flags(flags, "|",                       \
+               { ATTR_MODE,            "MODE" },       \
+               { ATTR_UID,             "UID" },        \
+               { ATTR_GID,             "GID" },        \
+               { ATTR_SIZE,            "SIZE" },       \
+               { ATTR_ATIME,           "ATIME" },      \
+               { ATTR_MTIME,           "MTIME" },      \
+               { ATTR_CTIME,           "CTIME" },      \
+               { ATTR_ATIME_SET,       "ATIME_SET" },  \
+               { ATTR_MTIME_SET,       "MTIME_SET" },  \
+               { ATTR_FORCE,           "FORCE" },      \
+               { ATTR_KILL_SUID,       "KILL_SUID" },  \
+               { ATTR_KILL_SGID,       "KILL_SGID" },  \
+               { ATTR_FILE,            "FILE" },       \
+               { ATTR_KILL_PRIV,       "KILL_PRIV" },  \
+               { ATTR_OPEN,            "OPEN" },       \
+               { ATTR_TIMES_SET,       "TIMES_SET" },  \
+               { ATTR_TOUCH,           "TOUCH"},       \
+               { ATTR_DELEG,           "DELEG"})