Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

nfsd: add a tracepoint for nfsd_setattr

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>

authored by

Jeff Layton and committed by
Chuck Lever
adbdd746 218927aa

+62
+39
fs/nfsd/trace.h
··· 11 11 #include <linux/tracepoint.h> 12 12 #include <linux/sunrpc/clnt.h> 13 13 #include <linux/sunrpc/xprt.h> 14 + #include <trace/misc/fs.h> 14 15 #include <trace/misc/nfs.h> 15 16 #include <trace/misc/sunrpc.h> 16 17 ··· 2355 2354 2356 2355 DEFINE_COPY_ASYNC_DONE_EVENT(done); 2357 2356 DEFINE_COPY_ASYNC_DONE_EVENT(cancel); 2357 + 2358 + TRACE_EVENT(nfsd_vfs_setattr, 2359 + TP_PROTO( 2360 + const struct svc_rqst *rqstp, 2361 + const struct svc_fh *fhp, 2362 + const struct iattr *iap, 2363 + const struct timespec64 *guardtime 2364 + ), 2365 + TP_ARGS(rqstp, fhp, iap, guardtime), 2366 + TP_STRUCT__entry( 2367 + NFSD_TRACE_PROC_CALL_FIELDS(rqstp) 2368 + __field(u32, fh_hash) 2369 + __field(s64, gtime_tv_sec) 2370 + __field(u32, gtime_tv_nsec) 2371 + __field(unsigned int, ia_valid) 2372 + __field(loff_t, ia_size) 2373 + __field(uid_t, ia_uid) 2374 + __field(gid_t, ia_gid) 2375 + __field(umode_t, ia_mode) 2376 + ), 2377 + TP_fast_assign( 2378 + NFSD_TRACE_PROC_CALL_ASSIGNMENTS(rqstp); 2379 + __entry->fh_hash = knfsd_fh_hash(&fhp->fh_handle); 2380 + __entry->gtime_tv_sec = guardtime ? guardtime->tv_sec : 0; 2381 + __entry->gtime_tv_nsec = guardtime ? guardtime->tv_nsec : 0; 2382 + __entry->ia_valid = iap->ia_valid; 2383 + __entry->ia_size = iap->ia_size; 2384 + __entry->ia_uid = __kuid_val(iap->ia_uid); 2385 + __entry->ia_gid = __kgid_val(iap->ia_gid); 2386 + __entry->ia_mode = iap->ia_mode; 2387 + ), 2388 + TP_printk( 2389 + "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", 2390 + __entry->xid, __entry->fh_hash, show_ia_valid_flags(__entry->ia_valid), 2391 + __entry->ia_size, __entry->ia_mode, __entry->ia_uid, __entry->ia_gid, 2392 + __entry->gtime_tv_sec, __entry->gtime_tv_nsec 2393 + ) 2394 + ) 2358 2395 2359 2396 #endif /* _NFSD_TRACE_H */ 2360 2397
+2
fs/nfsd/vfs.c
··· 501 501 bool size_change = (iap->ia_valid & ATTR_SIZE); 502 502 int retries; 503 503 504 + trace_nfsd_vfs_setattr(rqstp, fhp, iap, guardtime); 505 + 504 506 if (iap->ia_valid & ATTR_SIZE) { 505 507 accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE; 506 508 ftype = S_IFREG;
+21
include/trace/misc/fs.h
··· 120 120 { LOOKUP_BENEATH, "BENEATH" }, \ 121 121 { LOOKUP_IN_ROOT, "IN_ROOT" }, \ 122 122 { LOOKUP_CACHED, "CACHED" }) 123 + 124 + #define show_ia_valid_flags(flags) \ 125 + __print_flags(flags, "|", \ 126 + { ATTR_MODE, "MODE" }, \ 127 + { ATTR_UID, "UID" }, \ 128 + { ATTR_GID, "GID" }, \ 129 + { ATTR_SIZE, "SIZE" }, \ 130 + { ATTR_ATIME, "ATIME" }, \ 131 + { ATTR_MTIME, "MTIME" }, \ 132 + { ATTR_CTIME, "CTIME" }, \ 133 + { ATTR_ATIME_SET, "ATIME_SET" }, \ 134 + { ATTR_MTIME_SET, "MTIME_SET" }, \ 135 + { ATTR_FORCE, "FORCE" }, \ 136 + { ATTR_KILL_SUID, "KILL_SUID" }, \ 137 + { ATTR_KILL_SGID, "KILL_SGID" }, \ 138 + { ATTR_FILE, "FILE" }, \ 139 + { ATTR_KILL_PRIV, "KILL_PRIV" }, \ 140 + { ATTR_OPEN, "OPEN" }, \ 141 + { ATTR_TIMES_SET, "TIMES_SET" }, \ 142 + { ATTR_TOUCH, "TOUCH"}, \ 143 + { ATTR_DELEG, "DELEG"})