NFSD: Capture every CB state transition
authorChuck Lever <chuck.lever@oracle.com>
Fri, 14 May 2021 19:56:31 +0000 (15:56 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 18 May 2021 17:44:03 +0000 (13:44 -0400)
We were missing one.

As a clean-up, add a helper that sets the new CB state and fires
a tracepoint. The tracepoint fires only when the state changes, to
help reduce trace log noise.

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

index 7325592b456e5186b8bf3c5ac7f39544e78bf30d..b6cc51a9f37ca2016808908f3bcf01008dd122ab 100644 (file)
@@ -945,20 +945,26 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c
        return 0;
 }
 
+static void nfsd4_mark_cb_state(struct nfs4_client *clp, int newstate)
+{
+       if (clp->cl_cb_state != newstate) {
+               clp->cl_cb_state = newstate;
+               trace_nfsd_cb_state(clp);
+       }
+}
+
 static void nfsd4_mark_cb_down(struct nfs4_client *clp, int reason)
 {
        if (test_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags))
                return;
-       clp->cl_cb_state = NFSD4_CB_DOWN;
-       trace_nfsd_cb_state(clp);
+       nfsd4_mark_cb_state(clp, NFSD4_CB_DOWN);
 }
 
 static void nfsd4_mark_cb_fault(struct nfs4_client *clp, int reason)
 {
        if (test_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags))
                return;
-       clp->cl_cb_state = NFSD4_CB_FAULT;
-       trace_nfsd_cb_state(clp);
+       nfsd4_mark_cb_state(clp, NFSD4_CB_FAULT);
 }
 
 static void nfsd4_cb_probe_done(struct rpc_task *task, void *calldata)
@@ -968,10 +974,8 @@ static void nfsd4_cb_probe_done(struct rpc_task *task, void *calldata)
        trace_nfsd_cb_done(clp, task->tk_status);
        if (task->tk_status)
                nfsd4_mark_cb_down(clp, task->tk_status);
-       else {
-               clp->cl_cb_state = NFSD4_CB_UP;
-               trace_nfsd_cb_state(clp);
-       }
+       else
+               nfsd4_mark_cb_state(clp, NFSD4_CB_UP);
 }
 
 static void nfsd4_cb_probe_release(void *calldata)
@@ -995,8 +999,7 @@ static const struct rpc_call_ops nfsd4_cb_probe_ops = {
  */
 void nfsd4_probe_callback(struct nfs4_client *clp)
 {
-       clp->cl_cb_state = NFSD4_CB_UNKNOWN;
-       trace_nfsd_cb_state(clp);
+       nfsd4_mark_cb_state(clp, NFSD4_CB_UNKNOWN);
        set_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags);
        nfsd4_run_cb(&clp->cl_cb_null);
 }
@@ -1009,11 +1012,10 @@ void nfsd4_probe_callback_sync(struct nfs4_client *clp)
 
 void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *conn)
 {
-       clp->cl_cb_state = NFSD4_CB_UNKNOWN;
+       nfsd4_mark_cb_state(clp, NFSD4_CB_UNKNOWN);
        spin_lock(&clp->cl_lock);
        memcpy(&clp->cl_cb_conn, conn, sizeof(struct nfs4_cb_conn));
        spin_unlock(&clp->cl_lock);
-       trace_nfsd_cb_state(clp);
 }
 
 /*
@@ -1345,7 +1347,7 @@ nfsd4_run_cb_work(struct work_struct *work)
         * Don't send probe messages for 4.1 or later.
         */
        if (!cb->cb_ops && clp->cl_minorversion) {
-               clp->cl_cb_state = NFSD4_CB_UP;
+               nfsd4_mark_cb_state(clp, NFSD4_CB_UP);
                nfsd41_destroy_cb(cb);
                return;
        }