NFSD: Short-circuit fh_verify tracepoints for LOCALIO
authorChuck Lever <chuck.lever@oracle.com>
Thu, 5 Sep 2024 19:09:41 +0000 (15:09 -0400)
committerAnna Schumaker <anna.schumaker@oracle.com>
Mon, 23 Sep 2024 19:03:30 +0000 (15:03 -0400)
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>
fs/nfsd/trace.h

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