Commit fe0e9580 authored by Chuck Lever's avatar Chuck Lever

NFSD: Convert the callback workqueue to use delayed_work

Normally, NFSv4 callback operations are supposed to be sent to the
client as soon as they are queued up.

In a moment, I will introduce a recovery path where the server has
to wait for the client to reconnect. We don't want a hard busy wait
here -- the callback should be requeued to try again in several
milliseconds.

For now, convert nfsd4_callback from struct work_struct to struct
delayed_work, and queue with a zero delay argument. This should
avoid behavior changes for current operation.
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Reviewed-by: default avatarBenjamin Coddington <bcodding@redhat.com>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 961b4b5e
...@@ -887,7 +887,7 @@ static struct workqueue_struct *callback_wq; ...@@ -887,7 +887,7 @@ static struct workqueue_struct *callback_wq;
static bool nfsd4_queue_cb(struct nfsd4_callback *cb) static bool nfsd4_queue_cb(struct nfsd4_callback *cb)
{ {
return queue_work(callback_wq, &cb->cb_work); return queue_delayed_work(callback_wq, &cb->cb_work, 0);
} }
static void nfsd41_cb_inflight_begin(struct nfs4_client *clp) static void nfsd41_cb_inflight_begin(struct nfs4_client *clp)
...@@ -1370,7 +1370,7 @@ static void ...@@ -1370,7 +1370,7 @@ static void
nfsd4_run_cb_work(struct work_struct *work) nfsd4_run_cb_work(struct work_struct *work)
{ {
struct nfsd4_callback *cb = struct nfsd4_callback *cb =
container_of(work, struct nfsd4_callback, cb_work); container_of(work, struct nfsd4_callback, cb_work.work);
struct nfs4_client *clp = cb->cb_clp; struct nfs4_client *clp = cb->cb_clp;
struct rpc_clnt *clnt; struct rpc_clnt *clnt;
int flags; int flags;
...@@ -1415,7 +1415,7 @@ void nfsd4_init_cb(struct nfsd4_callback *cb, struct nfs4_client *clp, ...@@ -1415,7 +1415,7 @@ void nfsd4_init_cb(struct nfsd4_callback *cb, struct nfs4_client *clp,
cb->cb_msg.rpc_argp = cb; cb->cb_msg.rpc_argp = cb;
cb->cb_msg.rpc_resp = cb; cb->cb_msg.rpc_resp = cb;
cb->cb_ops = ops; cb->cb_ops = ops;
INIT_WORK(&cb->cb_work, nfsd4_run_cb_work); INIT_DELAYED_WORK(&cb->cb_work, nfsd4_run_cb_work);
cb->cb_seq_status = 1; cb->cb_seq_status = 1;
cb->cb_status = 0; cb->cb_status = 0;
cb->cb_need_restart = false; cb->cb_need_restart = false;
......
...@@ -68,7 +68,7 @@ struct nfsd4_callback { ...@@ -68,7 +68,7 @@ struct nfsd4_callback {
struct nfs4_client *cb_clp; struct nfs4_client *cb_clp;
struct rpc_message cb_msg; struct rpc_message cb_msg;
const struct nfsd4_callback_ops *cb_ops; const struct nfsd4_callback_ops *cb_ops;
struct work_struct cb_work; struct delayed_work cb_work;
int cb_seq_status; int cb_seq_status;
int cb_status; int cb_status;
bool cb_need_restart; bool cb_need_restart;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment