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: Chuck Lever <chuck.lever@oracle.com> Reviewed-by: Jeff Layton <jlayton@kernel.org>
This commit is contained in:
parent
18224dc58d
commit
948755efc9
@ -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);
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user