1

NFSD: Short-circuit fh_verify tracepoints for LOCALIO

LOCALIO will be able to call fh_verify() with a NULL rqstp. In this
case, the existing trace points need to be skipped because they
want to dereference the address fields in the passed-in rqstp.

Temporarily make these trace points conditional to avoid a seg
fault in this case. Putting the "rqstp != NULL" check in the trace
points themselves makes the check more efficient.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
Acked-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: NeilBrown <neilb@suse.de>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
This commit is contained in:
Chuck Lever 2024-09-05 15:09:41 -04:00 committed by Anna Schumaker
parent 7c0b07b49b
commit 71c61a0077

View File

@ -193,7 +193,7 @@ TRACE_EVENT(nfsd_compound_encode_err,
{ S_IFIFO, "FIFO" }, \ { S_IFIFO, "FIFO" }, \
{ S_IFSOCK, "SOCK" }) { S_IFSOCK, "SOCK" })
TRACE_EVENT(nfsd_fh_verify, TRACE_EVENT_CONDITION(nfsd_fh_verify,
TP_PROTO( TP_PROTO(
const struct svc_rqst *rqstp, const struct svc_rqst *rqstp,
const struct svc_fh *fhp, const struct svc_fh *fhp,
@ -201,6 +201,7 @@ TRACE_EVENT(nfsd_fh_verify,
int access int access
), ),
TP_ARGS(rqstp, fhp, type, access), TP_ARGS(rqstp, fhp, type, access),
TP_CONDITION(rqstp != NULL),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(unsigned int, netns_ino) __field(unsigned int, netns_ino)
__sockaddr(server, rqstp->rq_xprt->xpt_remotelen) __sockaddr(server, rqstp->rq_xprt->xpt_remotelen)
@ -239,7 +240,7 @@ TRACE_EVENT_CONDITION(nfsd_fh_verify_err,
__be32 error __be32 error
), ),
TP_ARGS(rqstp, fhp, type, access, error), TP_ARGS(rqstp, fhp, type, access, error),
TP_CONDITION(error), TP_CONDITION(rqstp != NULL && error),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(unsigned int, netns_ino) __field(unsigned int, netns_ino)
__sockaddr(server, rqstp->rq_xprt->xpt_remotelen) __sockaddr(server, rqstp->rq_xprt->xpt_remotelen)
@ -295,12 +296,13 @@ DECLARE_EVENT_CLASS(nfsd_fh_err_class,
__entry->status) __entry->status)
) )
#define DEFINE_NFSD_FH_ERR_EVENT(name) \ #define DEFINE_NFSD_FH_ERR_EVENT(name) \
DEFINE_EVENT(nfsd_fh_err_class, nfsd_##name, \ DEFINE_EVENT_CONDITION(nfsd_fh_err_class, nfsd_##name, \
TP_PROTO(struct svc_rqst *rqstp, \ TP_PROTO(struct svc_rqst *rqstp, \
struct svc_fh *fhp, \ struct svc_fh *fhp, \
int status), \ int status), \
TP_ARGS(rqstp, fhp, status)) TP_ARGS(rqstp, fhp, status), \
TP_CONDITION(rqstp != NULL))
DEFINE_NFSD_FH_ERR_EVENT(set_fh_dentry_badexport); DEFINE_NFSD_FH_ERR_EVENT(set_fh_dentry_badexport);
DEFINE_NFSD_FH_ERR_EVENT(set_fh_dentry_badhandle); DEFINE_NFSD_FH_ERR_EVENT(set_fh_dentry_badhandle);