@@ -706,6 +706,8 @@ nfsd4_getattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
struct nfsd4_getattr *getattr = &u->getattr;
__be32 status;
+ trace_nfsd4_getattr(rqstp, getattr->ga_bmval);
+
status = fh_verify(rqstp, &cstate->current_fh, 0, NFSD_MAY_NOP);
if (status)
return status;
@@ -918,6 +918,149 @@ TRACE_EVENT(nfsd4_fh_current,
__entry->xid, __entry->fh_hash, __get_str(name))
);
+/*
+ * from include/linux/nfs4.h
+ */
+#define FATTR4_WORD0_FLAGS \
+ fattr4_word0_bit(SUPPORTED_ATTRS) \
+ fattr4_word0_bit(TYPE) \
+ fattr4_word0_bit(FH_EXPIRE_TYPE) \
+ fattr4_word0_bit(CHANGE) \
+ fattr4_word0_bit(SIZE) \
+ fattr4_word0_bit(LINK_SUPPORT) \
+ fattr4_word0_bit(SYMLINK_SUPPORT) \
+ fattr4_word0_bit(NAMED_ATTR) \
+ fattr4_word0_bit(FSID) \
+ fattr4_word0_bit(UNIQUE_HANDLES) \
+ fattr4_word0_bit(LEASE_TIME) \
+ fattr4_word0_bit(RDATTR_ERROR) \
+ fattr4_word0_bit(ACL) \
+ fattr4_word0_bit(ACLSUPPORT) \
+ fattr4_word0_bit(ARCHIVE) \
+ fattr4_word0_bit(CANSETTIME) \
+ fattr4_word0_bit(CASE_INSENSITIVE) \
+ fattr4_word0_bit(CASE_PRESERVING) \
+ fattr4_word0_bit(CHOWN_RESTRICTED) \
+ fattr4_word0_bit(FILEHANDLE) \
+ fattr4_word0_bit(FILEID) \
+ fattr4_word0_bit(FILES_AVAIL) \
+ fattr4_word0_bit(FILES_FREE) \
+ fattr4_word0_bit(FILES_TOTAL) \
+ fattr4_word0_bit(FS_LOCATIONS) \
+ fattr4_word0_bit(HIDDEN) \
+ fattr4_word0_bit(HOMOGENEOUS) \
+ fattr4_word0_bit(MAXFILESIZE) \
+ fattr4_word0_bit(MAXLINK) \
+ fattr4_word0_bit(MAXNAME) \
+ fattr4_word0_bit(MAXREAD) \
+ fattr4_word0_bit_end(MAXWRITE)
+
+#undef fattr4_word0_bit
+#undef fattr4_word0_bit_end
+#define fattr4_word0_bit(x) TRACE_DEFINE_ENUM(FATTR4_WORD0_##x);
+#define fattr4_word0_bit_end(x) TRACE_DEFINE_ENUM(FATTR4_WORD0_##x);
+
+FATTR4_WORD0_FLAGS
+
+#undef fattr4_word0_bit
+#undef fattr4_word0_bit_end
+#define fattr4_word0_bit(x) { FATTR4_WORD0_##x, #x },
+#define fattr4_word0_bit_end(x) { FATTR4_WORD0_##x, #x }
+
+#define show_fattr4_bm_word0(x) __print_flags(x, "|", FATTR4_WORD0_FLAGS)
+
+#define FATTR4_WORD1_FLAGS \
+ fattr4_word1_bit(MIMETYPE) \
+ fattr4_word1_bit(MODE) \
+ fattr4_word1_bit(NO_TRUNC) \
+ fattr4_word1_bit(NUMLINKS) \
+ fattr4_word1_bit(OWNER) \
+ fattr4_word1_bit(OWNER_GROUP) \
+ fattr4_word1_bit(QUOTA_HARD) \
+ fattr4_word1_bit(QUOTA_SOFT) \
+ fattr4_word1_bit(QUOTA_USED) \
+ fattr4_word1_bit(RAWDEV) \
+ fattr4_word1_bit(SPACE_AVAIL) \
+ fattr4_word1_bit(SPACE_FREE) \
+ fattr4_word1_bit(SPACE_TOTAL) \
+ fattr4_word1_bit(SPACE_USED) \
+ fattr4_word1_bit(SYSTEM) \
+ fattr4_word1_bit(TIME_ACCESS) \
+ fattr4_word1_bit(TIME_ACCESS_SET) \
+ fattr4_word1_bit(TIME_BACKUP) \
+ fattr4_word1_bit(TIME_CREATE) \
+ fattr4_word1_bit(TIME_DELTA) \
+ fattr4_word1_bit(TIME_METADATA) \
+ fattr4_word1_bit(TIME_MODIFY) \
+ fattr4_word1_bit(TIME_MODIFY_SET) \
+ fattr4_word1_bit(MOUNTED_ON_FILEID) \
+ fattr4_word1_bit_end(FS_LAYOUT_TYPES)
+
+#undef fattr4_word1_bit
+#undef fattr4_word1_bit_end
+#define fattr4_word1_bit(x) TRACE_DEFINE_ENUM(FATTR4_WORD1_##x);
+#define fattr4_word1_bit_end(x) TRACE_DEFINE_ENUM(FATTR4_WORD1_##x);
+
+FATTR4_WORD1_FLAGS
+
+#undef fattr4_word1_bit
+#undef fattr4_word1_bit_end
+#define fattr4_word1_bit(x) { FATTR4_WORD1_##x, #x },
+#define fattr4_word1_bit_end(x) { FATTR4_WORD1_##x, #x }
+
+#define show_fattr4_bm_word1(x) __print_flags(x, "|", FATTR4_WORD1_FLAGS)
+
+#define FATTR4_WORD2_FLAGS \
+ fattr4_word2_bit(LAYOUT_TYPES) \
+ fattr4_word2_bit(LAYOUT_BLKSIZE) \
+ fattr4_word2_bit(MDSTHRESHOLD) \
+ fattr4_word2_bit(SUPPATTR_EXCLCREAT) \
+ fattr4_word2_bit(CLONE_BLKSIZE) \
+ fattr4_word2_bit(CHANGE_ATTR_TYPE) \
+ fattr4_word2_bit(SECURITY_LABEL) \
+ fattr4_word2_bit(MODE_UMASK) \
+ fattr4_word2_bit_end(XATTR_SUPPORT)
+
+#undef fattr4_word2_bit
+#undef fattr4_word2_bit_end
+#define fattr4_word2_bit(x) TRACE_DEFINE_ENUM(FATTR4_WORD2_##x);
+#define fattr4_word2_bit_end(x) TRACE_DEFINE_ENUM(FATTR4_WORD2_##x);
+
+FATTR4_WORD2_FLAGS
+
+#undef fattr4_word2_bit
+#undef fattr4_word2_bit_end
+#define fattr4_word2_bit(x) { FATTR4_WORD2_##x, #x },
+#define fattr4_word2_bit_end(x) { FATTR4_WORD2_##x, #x }
+
+#define show_fattr4_bm_word2(x) __print_flags(x, "|", FATTR4_WORD2_FLAGS)
+
+TRACE_EVENT(nfsd4_getattr,
+ TP_PROTO(
+ const struct svc_rqst *rqstp,
+ const u32 *bitmask
+ ),
+ TP_ARGS(rqstp, bitmask),
+ TP_STRUCT__entry(
+ __field(u32, xid)
+ __field(unsigned long, bm0)
+ __field(unsigned long, bm1)
+ __field(unsigned long, bm2)
+ ),
+ TP_fast_assign(
+ __entry->xid = be32_to_cpu(rqstp->rq_xid);
+ __entry->bm0 = bitmask[0];
+ __entry->bm1 = bitmask[1];
+ __entry->bm2 = bitmask[2];
+ ),
+ TP_printk("xid=0x%08x bm[0]=%s bm[1]=%s bm[2]=%s",
+ __entry->xid,
+ show_fattr4_bm_word0(__entry->bm0),
+ show_fattr4_bm_word1(__entry->bm1),
+ show_fattr4_bm_word2(__entry->bm2)
+ )
+);
+
TRACE_EVENT(nfsd_setattr_args,
TP_PROTO(
const struct svc_rqst *rqstp,
Record the set of attributes requested by an NFSv4 client in an NFSv4 GETATTR request. nfsd-1034 [002] 164.067026: nfsd_get_fattr4: xid=0xcb4c4e33 bm[0]=TYPE|CHANGE|SIZE|FSID|FILEID bm[1]=MODE|NUMLINKS|OWNER|OWNER_GROUP|RAWDEV|SPACE_USED|TIME_ACCESS|TIME_METADATA|TIME_MODIFY|MOUNTED_ON_FILEID bm[2]= Signed-off-by: Chuck Lever <chuck.lever@oracle.com> --- fs/nfsd/nfs4proc.c | 2 + fs/nfsd/trace.h | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+)