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: Jeff Layton <jlayton@kernel.org> Reviewed-by: Benjamin Coddington <bcodding@redhat.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
961b4b5e86
commit
fe0e9580e2
@ -887,7 +887,7 @@ static struct workqueue_struct *callback_wq;
|
||||
|
||||
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)
|
||||
@ -1370,7 +1370,7 @@ static void
|
||||
nfsd4_run_cb_work(struct work_struct *work)
|
||||
{
|
||||
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 rpc_clnt *clnt;
|
||||
int flags;
|
||||
@ -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_resp = cb;
|
||||
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_status = 0;
|
||||
cb->cb_need_restart = false;
|
||||
|
@ -68,7 +68,7 @@ struct nfsd4_callback {
|
||||
struct nfs4_client *cb_clp;
|
||||
struct rpc_message cb_msg;
|
||||
const struct nfsd4_callback_ops *cb_ops;
|
||||
struct work_struct cb_work;
|
||||
struct delayed_work cb_work;
|
||||
int cb_seq_status;
|
||||
int cb_status;
|
||||
bool cb_need_restart;
|
||||
|
Loading…
Reference in New Issue
Block a user