nfsd: introduce a generic nfsd4_cb
[firefly-linux-kernel-4.4.55.git] / fs / nfsd / nfs4callback.c
index 06e07e18ea78d8129606e43898e6652824332779..03d9f4f298ec04b160f46ed6939fbe54bc7292d8 100644 (file)
@@ -49,12 +49,6 @@ static void nfsd4_mark_cb_fault(struct nfs4_client *, int reason);
 
 /* Index of predefined Linux callback client operations */
 
-enum {
-       NFSPROC4_CLNT_CB_NULL = 0,
-       NFSPROC4_CLNT_CB_RECALL,
-       NFSPROC4_CLNT_CB_SEQUENCE,
-};
-
 #define to_delegation(cb) \
        container_of(cb, struct nfs4_delegation, dl_recall)
 
@@ -749,24 +743,9 @@ static const struct rpc_call_ops nfsd4_cb_probe_ops = {
 
 static struct workqueue_struct *callback_wq;
 
-static void run_nfsd4_cb(struct nfsd4_callback *cb)
-{
-       queue_work(callback_wq, &cb->cb_work);
-}
-
 static void do_probe_callback(struct nfs4_client *clp)
 {
-       struct nfsd4_callback *cb = &clp->cl_cb_null;
-
-       cb->cb_clp = clp;
-
-       cb->cb_msg.rpc_proc = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_NULL];
-       cb->cb_msg.rpc_argp = NULL;
-       cb->cb_msg.rpc_resp = NULL;
-
-       cb->cb_ops = &nfsd4_cb_probe_ops;
-
-       run_nfsd4_cb(cb);
+       return nfsd4_cb(&clp->cl_cb_null, clp, NFSPROC4_CLNT_CB_NULL);
 }
 
 /*
@@ -1005,7 +984,7 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb)
        }
        /* Yay, the callback channel's back! Restart any callbacks: */
        list_for_each_entry(cb, &clp->cl_callbacks, cb_per_client)
-               run_nfsd4_cb(cb);
+               queue_work(callback_wq, &cb->cb_work);
 }
 
 static void
@@ -1046,21 +1025,19 @@ nfsd4_run_cb_recall(struct work_struct *w)
        nfsd4_run_callback_rpc(cb);
 }
 
-void nfsd4_cb_recall(struct nfs4_delegation *dp)
+void nfsd4_cb(struct nfsd4_callback *cb, struct nfs4_client *clp,
+               enum nfsd4_cb_op op)
 {
-       struct nfsd4_callback *cb = &dp->dl_recall;
-       struct nfs4_client *clp = dp->dl_stid.sc_client;
-
-       dp->dl_retries = 1;
        cb->cb_clp = clp;
-       cb->cb_msg.rpc_proc = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_RECALL];
+       cb->cb_msg.rpc_proc = &nfs4_cb_procedures[op];
        cb->cb_msg.rpc_argp = cb;
        cb->cb_msg.rpc_resp = cb;
-
-       cb->cb_ops = &nfsd4_cb_recall_ops;
-
+       if (op == NFSPROC4_CLNT_CB_NULL)
+               cb->cb_ops = &nfsd4_cb_probe_ops;
+       else
+               cb->cb_ops = &nfsd4_cb_recall_ops;
        INIT_LIST_HEAD(&cb->cb_per_client);
        cb->cb_done = true;
 
-       run_nfsd4_cb(&dp->dl_recall);
+       queue_work(callback_wq, &cb->cb_work);
 }