diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 065ed5930250..914eb3f2a233 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -358,9 +358,7 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 	struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 	bool reclaim = false;
 
-	dprintk("NFSD: nfsd4_open filename %.*s op_openowner %p\n",
-		(int)open->op_fname.len, open->op_fname.data,
-		open->op_openowner);
+	trace_nfsd4_open(rqstp, open);
 
 	/* This check required by spec. */
 	if (open->op_create && open->op_claim_type != NFS4_OPEN_CLAIM_NULL)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 0cc928328c22..47790c7a29a3 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -6184,8 +6184,7 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp,
 	struct nfs4_ol_stateid *stp;
 	struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
 
-	dprintk("NFSD: nfsd4_open_downgrade on file %pd\n", 
-			cstate->current_fh.fh_dentry);
+	trace_nfsd4_open_downgrade(rqstp, od);
 
 	/* We don't yet support WANT bits: */
 	if (od->od_deleg_want)
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index be5fc0ce3c13..18b359a04d96 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -594,6 +594,61 @@ TRACE_EVENT(nfsd4_getattr,
 #include "filecache.h"
 #include "vfs.h"
 
+TRACE_EVENT(nfsd4_open,
+	TP_PROTO(
+		const struct svc_rqst *rqstp,
+		const struct nfsd4_open *open
+	),
+	TP_ARGS(rqstp, open),
+	TP_STRUCT__entry(
+		__field(u32, xid)
+		__field(u32, seqid)
+		__field(unsigned long, create)
+		__field(unsigned long, claim)
+		__field(unsigned long, share)
+		__dynamic_array(unsigned char, name, open->op_fname.len + 1)
+	),
+	TP_fast_assign(
+		__entry->xid = be32_to_cpu(rqstp->rq_xid);
+		__entry->seqid = open->op_seqid;
+		__entry->create = open->op_create;
+		__entry->claim = open->op_claim_type;
+		__entry->share = open->op_share_access;
+		memcpy(__get_str(name), open->op_fname.data,
+		       open->op_fname.len);
+		__get_str(name)[open->op_fname.len] = '\0';
+	),
+	TP_printk("xid=0x%08x seqid=%u type=%s claim=%s share=%s name=%s",
+		__entry->xid, __entry->seqid,
+		show_nfs4_open_create(__entry->create),
+		show_nfs4_open_claimtype(__entry->claim),
+		show_nfs4_open_sharedeny_flags(__entry->share),
+		__get_str(name)
+	)
+);
+
+TRACE_EVENT(nfsd4_open_downgrade,
+	TP_PROTO(
+		const struct svc_rqst *rqstp,
+		const struct nfsd4_open_downgrade *open
+	),
+	TP_ARGS(rqstp, open),
+	TP_STRUCT__entry(
+		__field(u32, xid)
+		__field(u32, seqid)
+		__field(unsigned long, share)
+	),
+	TP_fast_assign(
+		__entry->xid = be32_to_cpu(rqstp->rq_xid);
+		__entry->seqid = open->od_seqid;
+		__entry->share = open->od_share_access;
+	),
+	TP_printk("xid=0x%08x seqid=%u share=%s",
+		__entry->xid, __entry->seqid,
+		show_nfs4_open_sharedeny_flags(__entry->share)
+	)
+);
+
 TRACE_EVENT(nfsd4_stateid_prep,
 	TP_PROTO(
 		const struct svc_rqst *rqstp,
diff --git a/include/trace/events/nfs.h b/include/trace/events/nfs.h
index 19f7444e4bb2..e6da77eb95b5 100644
--- a/include/trace/events/nfs.h
+++ b/include/trace/events/nfs.h
@@ -463,3 +463,35 @@ TRACE_DEFINE_ENUM(SP4_SSV);
 		{ FATTR4_WORD2_SECURITY_LABEL,		"SECURITY_LABEL" }, \
 		{ FATTR4_WORD2_MODE_UMASK,		"MODE_UMASK" }, \
 		{ FATTR4_WORD2_XATTR_SUPPORT,		"XATTR_SUPPORT" })
+
+TRACE_DEFINE_ENUM(NFS4_OPEN_NOCREATE);
+TRACE_DEFINE_ENUM(NFS4_OPEN_CREATE);
+
+#define show_nfs4_open_create(x) \
+	__print_symbolic(x, \
+		{ NFS4_OPEN_NOCREATE,			"NOCREATE" }, \
+		{ NFS4_OPEN_CREATE,			"CREATE" })
+
+TRACE_DEFINE_ENUM(NFS4_OPEN_CLAIM_NULL);
+TRACE_DEFINE_ENUM(NFS4_OPEN_CLAIM_PREVIOUS);
+TRACE_DEFINE_ENUM(NFS4_OPEN_CLAIM_DELEGATE_CUR);
+TRACE_DEFINE_ENUM(NFS4_OPEN_CLAIM_DELEGATE_PREV);
+TRACE_DEFINE_ENUM(NFS4_OPEN_CLAIM_FH);
+TRACE_DEFINE_ENUM(NFS4_OPEN_CLAIM_DELEG_CUR_FH);
+TRACE_DEFINE_ENUM(NFS4_OPEN_CLAIM_DELEG_PREV_FH);
+
+#define show_nfs4_open_claimtype(x) \
+	__print_symbolic(x, \
+		{ NFS4_OPEN_CLAIM_NULL,			"NULL" }, \
+		{ NFS4_OPEN_CLAIM_PREVIOUS,		"PREVIOUS" }, \
+		{ NFS4_OPEN_CLAIM_DELEGATE_CUR,		"DELEGATE_CUR" }, \
+		{ NFS4_OPEN_CLAIM_DELEGATE_PREV,	"DELEGATE_PREV" }, \
+		{ NFS4_OPEN_CLAIM_FH,			"FH" }, \
+		{ NFS4_OPEN_CLAIM_DELEG_CUR_FH,		"DELEG_CUR_FH" }, \
+		{ NFS4_OPEN_CLAIM_DELEG_PREV_FH,	"DELEG_PREV_FH" })
+
+#define show_nfs4_open_sharedeny_flags(x) \
+	__print_symbolic(x, \
+		{ NFS4_SHARE_ACCESS_READ,		"READ" }, \
+		{ NFS4_SHARE_ACCESS_WRITE,		"WRITE" }, \
+		{ NFS4_SHARE_ACCESS_BOTH,		"BOTH" })
