@@ -12,6 +12,64 @@
#include "export.h"
#include "nfsfh.h"
+/*
+ * from include/linux/fs.h
+ */
+#define ATTR_VALID_LIST \
+ attr_valid_list(MODE) \
+ attr_valid_list(UID) \
+ attr_valid_list(GID) \
+ attr_valid_list(SIZE) \
+ attr_valid_list(ATIME) \
+ attr_valid_list(MTIME) \
+ attr_valid_list(CTIME) \
+ attr_valid_list(ATIME_SET) \
+ attr_valid_list(MTIME_SET) \
+ attr_valid_list(FORCE) \
+ attr_valid_list(KILL_SUID) \
+ attr_valid_list(KILL_SGID) \
+ attr_valid_list(FILE) \
+ attr_valid_list(KILL_PRIV) \
+ attr_valid_list(OPEN) \
+ attr_valid_list(TIMES_SET) \
+ attr_valid_list_end(TOUCH)
+
+#undef attr_valid_list
+#undef attr_valid_list_end
+#define attr_valid_list(x) TRACE_DEFINE_ENUM(ATTR_##x);
+#define attr_valid_list_end(x) TRACE_DEFINE_ENUM(ATTR_##x);
+
+ATTR_VALID_LIST
+
+#undef attr_valid_list
+#undef attr_valid_list_end
+#define attr_valid_list(x) { ATTR_##x, #x },
+#define attr_valid_list_end(x) { ATTR_##x, #x }
+
+#define show_attr_valid_flags(x) __print_flags(x, "|", ATTR_VALID_LIST)
+
+/*
+ * from include/uapi/linux/stat.h
+ */
+TRACE_DEFINE_ENUM(S_IFSOCK);
+TRACE_DEFINE_ENUM(S_IFLNK);
+TRACE_DEFINE_ENUM(S_IFREG);
+TRACE_DEFINE_ENUM(S_IFBLK);
+TRACE_DEFINE_ENUM(S_IFDIR);
+TRACE_DEFINE_ENUM(S_IFCHR);
+TRACE_DEFINE_ENUM(S_IFIFO);
+
+#define show_inode_type(x) \
+ __print_symbolic(x, \
+ { S_IFSOCK, "SOCK" }, \
+ { S_IFLNK, "LNK" }, \
+ { S_IFREG, "REG" }, \
+ { S_IFBLK, "BLK" }, \
+ { S_IFDIR, "DIR" }, \
+ { S_IFCHR, "CHR" }, \
+ { S_IFIFO, "FIFO" }, \
+ { 0, "NONE" })
+
/*
* from fs/nfsd/vfs.h
*/
@@ -805,6 +863,29 @@ TRACE_EVENT(nfsd_cb_done,
__entry->status)
);
+TRACE_EVENT(nfsd_setattr_args,
+ TP_PROTO(
+ const struct svc_rqst *rqstp,
+ const struct svc_fh *fhp,
+ unsigned int valid
+ ),
+ TP_ARGS(rqstp, fhp, valid),
+ TP_STRUCT__entry(
+ __field(u32, xid)
+ __field(u32, fh_hash)
+ __field(unsigned long, valid)
+ ),
+ TP_fast_assign(
+ __entry->xid = be32_to_cpu(rqstp->rq_xid);
+ __entry->fh_hash = knfsd_fh_hash(&fhp->fh_handle);
+ __entry->valid = valid;
+ ),
+ TP_printk("xid=0x%08x fh_hash=0x%08x valid=%s",
+ __entry->xid, __entry->fh_hash,
+ show_attr_valid_flags(__entry->valid)
+ )
+);
+
#endif /* _NFSD_TRACE_H */
#undef TRACE_INCLUDE_PATH
@@ -375,6 +375,8 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
bool get_write_count;
bool size_change = (iap->ia_valid & ATTR_SIZE);
+ trace_nfsd_setattr_args(rqstp, fhp, iap->ia_valid);
+
if (iap->ia_valid & ATTR_SIZE) {
accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE;
ftype = S_IFREG;
Capture especially the XID, file handle, and attr mask for troubleshooting. So for example: nfsd-1025 [002] 256.807363: nfsd_setattr: xid=0x12147d7a fh_hash=0x6085d6fb valid=MODE|ATIME|MTIME Signed-off-by: Chuck Lever <chuck.lever@oracle.com> --- fs/nfsd/trace.h | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/nfsd/vfs.c | 2 + 2 files changed, 83 insertions(+)