nfsd: minor 4.1 callback cleanup
authorTrond Myklebust <trondmy@gmail.com>
Thu, 7 Nov 2019 22:11:57 +0000 (17:11 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Fri, 8 Nov 2019 17:32:44 +0000 (12:32 -0500)
Move all the cb_holds_slot management into helper functions.  No change
in behavior.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4callback.c

index 524111420b48c2deb9de7a536bd0eeae43fb88d2..1542e1d6dd1aea3e142fdb3eea80fb1104116790 100644 (file)
@@ -975,9 +975,12 @@ void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *conn)
  * If the slot is available, then mark it busy.  Otherwise, set the
  * thread for sleeping on the callback RPC wait queue.
  */
-static bool nfsd41_cb_get_slot(struct nfs4_client *clp, struct rpc_task *task)
+static bool nfsd41_cb_get_slot(struct nfsd4_callback *cb, struct rpc_task *task)
 {
-       if (test_and_set_bit(0, &clp->cl_cb_slot_busy) != 0) {
+       struct nfs4_client *clp = cb->cb_clp;
+
+       if (!cb->cb_holds_slot &&
+           test_and_set_bit(0, &clp->cl_cb_slot_busy) != 0) {
                rpc_sleep_on(&clp->cl_cb_waitq, task, NULL);
                /* Race breaker */
                if (test_and_set_bit(0, &clp->cl_cb_slot_busy) != 0) {
@@ -986,9 +989,21 @@ static bool nfsd41_cb_get_slot(struct nfs4_client *clp, struct rpc_task *task)
                }
                rpc_wake_up_queued_task(&clp->cl_cb_waitq, task);
        }
+       cb->cb_holds_slot = true;
        return true;
 }
 
+static void nfsd41_cb_release_slot(struct nfsd4_callback *cb)
+{
+       struct nfs4_client *clp = cb->cb_clp;
+
+       if (cb->cb_holds_slot) {
+               cb->cb_holds_slot = false;
+               clear_bit(0, &clp->cl_cb_slot_busy);
+               rpc_wake_up_next(&clp->cl_cb_waitq);
+       }
+}
+
 /*
  * TODO: cb_sequence should support referring call lists, cachethis, multiple
  * slots, and mark callback channel down on communication errors.
@@ -1005,11 +1020,8 @@ static void nfsd4_cb_prepare(struct rpc_task *task, void *calldata)
         */
        cb->cb_seq_status = 1;
        cb->cb_status = 0;
-       if (minorversion) {
-               if (!cb->cb_holds_slot && !nfsd41_cb_get_slot(clp, task))
-                       return;
-               cb->cb_holds_slot = true;
-       }
+       if (minorversion && !nfsd41_cb_get_slot(cb, task))
+               return;
        rpc_call_start(task);
 }
 
@@ -1076,9 +1088,7 @@ static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback
                        cb->cb_seq_status);
        }
 
-       cb->cb_holds_slot = false;
-       clear_bit(0, &clp->cl_cb_slot_busy);
-       rpc_wake_up_next(&clp->cl_cb_waitq);
+       nfsd41_cb_release_slot(cb);
        dprintk("%s: freed slot, new seqid=%d\n", __func__,
                clp->cl_cb_session->se_cb_seq_nr);