diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index a718097b5330..6206ba7b1ac7 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -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;
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 8da691b642ac..48250610dfa4 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -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,
