OSDN Git Service

NFSD: Add nfsd_clid_cred_mismatch tracepoint
authorChuck Lever <chuck.lever@oracle.com>
Fri, 14 May 2021 19:55:29 +0000 (15:55 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 18 May 2021 17:44:02 +0000 (13:44 -0400)
Record when a client tries to establish a lease record but uses an
unexpected credential. This is often a sign of a configuration
problem.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c
fs/nfsd/trace.h

index 6abe48d..84c4021 100644 (file)
@@ -3181,6 +3181,7 @@ nfsd4_exchange_id(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                if (!creds_match) { /* case 3 */
                        if (client_has_state(conf)) {
                                status = nfserr_clid_inuse;
+                               trace_nfsd_clid_cred_mismatch(conf, rqstp);
                                goto out;
                        }
                        goto out_new;
@@ -3425,9 +3426,10 @@ nfsd4_create_session(struct svc_rqst *rqstp,
                        goto out_free_conn;
                }
        } else if (unconf) {
+               status = nfserr_clid_inuse;
                if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) ||
                    !rpc_cmp_addr(sa, (struct sockaddr *) &unconf->cl_addr)) {
-                       status = nfserr_clid_inuse;
+                       trace_nfsd_clid_cred_mismatch(unconf, rqstp);
                        goto out_free_conn;
                }
                status = nfserr_wrong_cred;
@@ -3976,7 +3978,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                if (clp_used_exchangeid(conf))
                        goto out;
                if (!same_creds(&conf->cl_cred, &rqstp->rq_cred)) {
-                       trace_nfsd_clid_inuse_err(conf);
+                       trace_nfsd_clid_cred_mismatch(conf, rqstp);
                        goto out;
                }
        }
@@ -4034,10 +4036,14 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
         * Nevertheless, RFC 7530 recommends INUSE for this case:
         */
        status = nfserr_clid_inuse;
-       if (unconf && !same_creds(&unconf->cl_cred, &rqstp->rq_cred))
+       if (unconf && !same_creds(&unconf->cl_cred, &rqstp->rq_cred)) {
+               trace_nfsd_clid_cred_mismatch(unconf, rqstp);
                goto out;
-       if (conf && !same_creds(&conf->cl_cred, &rqstp->rq_cred))
+       }
+       if (conf && !same_creds(&conf->cl_cred, &rqstp->rq_cred)) {
+               trace_nfsd_clid_cred_mismatch(conf, rqstp);
                goto out;
+       }
        /* cases below refer to rfc 3530 section 14.2.34: */
        if (!unconf || !same_verf(&confirm, &unconf->cl_confirm)) {
                if (conf && same_verf(&confirm, &conf->cl_confirm)) {
index 1b50640..820a542 100644 (file)
@@ -536,6 +536,34 @@ DEFINE_EVENT(nfsd_net_class, nfsd_##name, \
 DEFINE_NET_EVENT(grace_start);
 DEFINE_NET_EVENT(grace_complete);
 
+TRACE_EVENT(nfsd_clid_cred_mismatch,
+       TP_PROTO(
+               const struct nfs4_client *clp,
+               const struct svc_rqst *rqstp
+       ),
+       TP_ARGS(clp, rqstp),
+       TP_STRUCT__entry(
+               __field(u32, cl_boot)
+               __field(u32, cl_id)
+               __field(unsigned long, cl_flavor)
+               __field(unsigned long, new_flavor)
+               __array(unsigned char, addr, sizeof(struct sockaddr_in6))
+       ),
+       TP_fast_assign(
+               __entry->cl_boot = clp->cl_clientid.cl_boot;
+               __entry->cl_id = clp->cl_clientid.cl_id;
+               __entry->cl_flavor = clp->cl_cred.cr_flavor;
+               __entry->new_flavor = rqstp->rq_cred.cr_flavor;
+               memcpy(__entry->addr, &rqstp->rq_xprt->xpt_remote,
+                       sizeof(struct sockaddr_in6));
+       ),
+       TP_printk("client %08x:%08x flavor=%s, conflict=%s from addr=%pISpc",
+               __entry->cl_boot, __entry->cl_id,
+               show_nfsd_authflavor(__entry->cl_flavor),
+               show_nfsd_authflavor(__entry->new_flavor), __entry->addr
+       )
+)
+
 TRACE_EVENT(nfsd_clid_inuse_err,
        TP_PROTO(const struct nfs4_client *clp),
        TP_ARGS(clp),