Commit 948755ef authored by Chuck Lever's avatar Chuck Lever
Browse files

NFSD: Replace dprintk() call site in fh_verify()



Record permission errors in the trace log. Note that the new trace
event is conditional, so it will only record non-zero return values
from nfsd_permission().

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
parent 18224dc5
Loading
Loading
Loading
Loading
+1 −7
Original line number Diff line number Diff line
@@ -392,13 +392,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type, int access)
skip_pseudoflavor_check:
	/* Finally, check access permissions. */
	error = nfsd_permission(rqstp, exp, dentry, access);

	if (error) {
		dprintk("fh_verify: %pd2 permission failure, "
			"acc=%x, error=%d\n",
			dentry,
			access, ntohl(error));
	}
	trace_nfsd_fh_verify_err(rqstp, fhp, type, access, error);
out:
	if (error == nfserr_stale)
		nfsd_stats_fh_stale_inc(exp);
+45 −3
Original line number Diff line number Diff line
@@ -195,7 +195,7 @@ TRACE_EVENT(nfsd_fh_verify,
		__sockaddr(client, rqstp->rq_xprt->xpt_remotelen)
		__field(u32, xid)
		__field(u32, fh_hash)
		__field(void *, inode)
		__field(const void *, inode)
		__field(unsigned long, type)
		__field(unsigned long, access)
	),
@@ -211,13 +211,55 @@ TRACE_EVENT(nfsd_fh_verify,
		__entry->type = type;
		__entry->access = access;
	),
	TP_printk("xid=0x%08x fh_hash=0x%08x inode=%p type=%s access=%s",
		__entry->xid, __entry->fh_hash, __entry->inode,
	TP_printk("xid=0x%08x fh_hash=0x%08x type=%s access=%s",
		__entry->xid, __entry->fh_hash,
		show_fs_file_type(__entry->type),
		show_nfsd_may_flags(__entry->access)
	)
);

TRACE_EVENT_CONDITION(nfsd_fh_verify_err,
	TP_PROTO(
		const struct svc_rqst *rqstp,
		const struct svc_fh *fhp,
		umode_t type,
		int access,
		__be32 error
	),
	TP_ARGS(rqstp, fhp, type, access, error),
	TP_CONDITION(error),
	TP_STRUCT__entry(
		__field(unsigned int, netns_ino)
		__sockaddr(server, rqstp->rq_xprt->xpt_remotelen)
		__sockaddr(client, rqstp->rq_xprt->xpt_remotelen)
		__field(u32, xid)
		__field(u32, fh_hash)
		__field(const void *, inode)
		__field(unsigned long, type)
		__field(unsigned long, access)
		__field(int, error)
	),
	TP_fast_assign(
		__entry->netns_ino = SVC_NET(rqstp)->ns.inum;
		__assign_sockaddr(server, &rqstp->rq_xprt->xpt_local,
		       rqstp->rq_xprt->xpt_locallen);
		__assign_sockaddr(client, &rqstp->rq_xprt->xpt_remote,
				  rqstp->rq_xprt->xpt_remotelen);
		__entry->xid = be32_to_cpu(rqstp->rq_xid);
		__entry->fh_hash = knfsd_fh_hash(&fhp->fh_handle);
		__entry->inode = d_inode(fhp->fh_dentry);
		__entry->type = type;
		__entry->access = access;
		__entry->error = be32_to_cpu(error);
	),
	TP_printk("xid=0x%08x fh_hash=0x%08x type=%s access=%s error=%d",
		__entry->xid, __entry->fh_hash,
		show_fs_file_type(__entry->type),
		show_nfsd_may_flags(__entry->access),
		__entry->error
	)
);

DECLARE_EVENT_CLASS(nfsd_fh_err_class,
	TP_PROTO(struct svc_rqst *rqstp,
		 struct svc_fh	*fhp,