SUNRPC: Kill rpc_clnt->cl_oneshot
Replace it with explicit calls to rpc_shutdown_client() or rpc_destroy_client() (for the case of asynchronous calls). Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Родитель
848f1fe6be
Коммит
90c5755ff5
|
@ -61,6 +61,7 @@ nsm_mon_unmon(struct nsm_handle *nsm, u32 proc, struct nsm_res *res)
|
||||||
status);
|
status);
|
||||||
else
|
else
|
||||||
status = 0;
|
status = 0;
|
||||||
|
rpc_shutdown_client(clnt);
|
||||||
out:
|
out:
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -138,7 +139,6 @@ nsm_create(void)
|
||||||
.program = &nsm_program,
|
.program = &nsm_program,
|
||||||
.version = SM_VERSION,
|
.version = SM_VERSION,
|
||||||
.authflavor = RPC_AUTH_NULL,
|
.authflavor = RPC_AUTH_NULL,
|
||||||
.flags = (RPC_CLNT_CREATE_ONESHOT),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return rpc_create(&args);
|
return rpc_create(&args);
|
||||||
|
|
|
@ -69,6 +69,7 @@ nfsroot_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh,
|
||||||
msg.rpc_proc = &mnt_clnt->cl_procinfo[MNTPROC_MNT];
|
msg.rpc_proc = &mnt_clnt->cl_procinfo[MNTPROC_MNT];
|
||||||
|
|
||||||
status = rpc_call_sync(mnt_clnt, &msg, 0);
|
status = rpc_call_sync(mnt_clnt, &msg, 0);
|
||||||
|
rpc_shutdown_client(mnt_clnt);
|
||||||
return status < 0? status : (result.status? -EACCES : 0);
|
return status < 0? status : (result.status? -EACCES : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,8 +85,7 @@ mnt_create(char *hostname, struct sockaddr_in *srvaddr, int version,
|
||||||
.program = &mnt_program,
|
.program = &mnt_program,
|
||||||
.version = version,
|
.version = version,
|
||||||
.authflavor = RPC_AUTH_UNIX,
|
.authflavor = RPC_AUTH_UNIX,
|
||||||
.flags = (RPC_CLNT_CREATE_ONESHOT |
|
.flags = RPC_CLNT_CREATE_INTR,
|
||||||
RPC_CLNT_CREATE_INTR),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return rpc_create(&args);
|
return rpc_create(&args);
|
||||||
|
|
|
@ -44,8 +44,7 @@ struct rpc_clnt {
|
||||||
unsigned int cl_softrtry : 1,/* soft timeouts */
|
unsigned int cl_softrtry : 1,/* soft timeouts */
|
||||||
cl_intr : 1,/* interruptible */
|
cl_intr : 1,/* interruptible */
|
||||||
cl_discrtry : 1,/* disconnect before retry */
|
cl_discrtry : 1,/* disconnect before retry */
|
||||||
cl_autobind : 1,/* use getport() */
|
cl_autobind : 1;/* use getport() */
|
||||||
cl_oneshot : 1;/* dispose after use */
|
|
||||||
|
|
||||||
struct rpc_rtt * cl_rtt; /* RTO estimator data */
|
struct rpc_rtt * cl_rtt; /* RTO estimator data */
|
||||||
|
|
||||||
|
@ -112,10 +111,9 @@ struct rpc_create_args {
|
||||||
#define RPC_CLNT_CREATE_HARDRTRY (1UL << 0)
|
#define RPC_CLNT_CREATE_HARDRTRY (1UL << 0)
|
||||||
#define RPC_CLNT_CREATE_INTR (1UL << 1)
|
#define RPC_CLNT_CREATE_INTR (1UL << 1)
|
||||||
#define RPC_CLNT_CREATE_AUTOBIND (1UL << 2)
|
#define RPC_CLNT_CREATE_AUTOBIND (1UL << 2)
|
||||||
#define RPC_CLNT_CREATE_ONESHOT (1UL << 3)
|
#define RPC_CLNT_CREATE_NONPRIVPORT (1UL << 3)
|
||||||
#define RPC_CLNT_CREATE_NONPRIVPORT (1UL << 4)
|
#define RPC_CLNT_CREATE_NOPING (1UL << 4)
|
||||||
#define RPC_CLNT_CREATE_NOPING (1UL << 5)
|
#define RPC_CLNT_CREATE_DISCRTRY (1UL << 5)
|
||||||
#define RPC_CLNT_CREATE_DISCRTRY (1UL << 6)
|
|
||||||
|
|
||||||
struct rpc_clnt *rpc_create(struct rpc_create_args *args);
|
struct rpc_clnt *rpc_create(struct rpc_create_args *args);
|
||||||
struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *,
|
struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *,
|
||||||
|
|
|
@ -249,8 +249,6 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
|
||||||
clnt->cl_intr = 1;
|
clnt->cl_intr = 1;
|
||||||
if (args->flags & RPC_CLNT_CREATE_AUTOBIND)
|
if (args->flags & RPC_CLNT_CREATE_AUTOBIND)
|
||||||
clnt->cl_autobind = 1;
|
clnt->cl_autobind = 1;
|
||||||
if (args->flags & RPC_CLNT_CREATE_ONESHOT)
|
|
||||||
clnt->cl_oneshot = 1;
|
|
||||||
if (args->flags & RPC_CLNT_CREATE_DISCRTRY)
|
if (args->flags & RPC_CLNT_CREATE_DISCRTRY)
|
||||||
clnt->cl_discrtry = 1;
|
clnt->cl_discrtry = 1;
|
||||||
|
|
||||||
|
@ -285,7 +283,6 @@ rpc_clone_client(struct rpc_clnt *clnt)
|
||||||
new->cl_xprt = xprt_get(clnt->cl_xprt);
|
new->cl_xprt = xprt_get(clnt->cl_xprt);
|
||||||
/* Turn off autobind on clones */
|
/* Turn off autobind on clones */
|
||||||
new->cl_autobind = 0;
|
new->cl_autobind = 0;
|
||||||
new->cl_oneshot = 0;
|
|
||||||
INIT_LIST_HEAD(&new->cl_tasks);
|
INIT_LIST_HEAD(&new->cl_tasks);
|
||||||
spin_lock_init(&new->cl_lock);
|
spin_lock_init(&new->cl_lock);
|
||||||
rpc_init_rtt(&new->cl_rtt_default, clnt->cl_xprt->timeout.to_initval);
|
rpc_init_rtt(&new->cl_rtt_default, clnt->cl_xprt->timeout.to_initval);
|
||||||
|
@ -304,8 +301,7 @@ out_no_clnt:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Properly shut down an RPC client, terminating all outstanding
|
* Properly shut down an RPC client, terminating all outstanding
|
||||||
* requests. Note that we must be certain that cl_oneshot is cleared,
|
* requests.
|
||||||
* or else the client would be destroyed when the last task releases it.
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
rpc_shutdown_client(struct rpc_clnt *clnt)
|
rpc_shutdown_client(struct rpc_clnt *clnt)
|
||||||
|
@ -314,8 +310,6 @@ rpc_shutdown_client(struct rpc_clnt *clnt)
|
||||||
clnt->cl_protname, clnt->cl_server);
|
clnt->cl_protname, clnt->cl_server);
|
||||||
|
|
||||||
while (!list_empty(&clnt->cl_tasks)) {
|
while (!list_empty(&clnt->cl_tasks)) {
|
||||||
/* Don't let rpc_release_client destroy us */
|
|
||||||
clnt->cl_oneshot = 0;
|
|
||||||
rpc_killall_tasks(clnt);
|
rpc_killall_tasks(clnt);
|
||||||
wait_event_timeout(destroy_wait,
|
wait_event_timeout(destroy_wait,
|
||||||
list_empty(&clnt->cl_tasks), 1*HZ);
|
list_empty(&clnt->cl_tasks), 1*HZ);
|
||||||
|
@ -366,8 +360,6 @@ rpc_release_client(struct rpc_clnt *clnt)
|
||||||
|
|
||||||
if (list_empty(&clnt->cl_tasks))
|
if (list_empty(&clnt->cl_tasks))
|
||||||
wake_up(&destroy_wait);
|
wake_up(&destroy_wait);
|
||||||
if (clnt->cl_oneshot)
|
|
||||||
rpc_destroy_client(clnt);
|
|
||||||
kref_put(&clnt->cl_kref, rpc_free_client);
|
kref_put(&clnt->cl_kref, rpc_free_client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -184,8 +184,7 @@ static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr,
|
||||||
.program = &rpcb_program,
|
.program = &rpcb_program,
|
||||||
.version = version,
|
.version = version,
|
||||||
.authflavor = RPC_AUTH_UNIX,
|
.authflavor = RPC_AUTH_UNIX,
|
||||||
.flags = (RPC_CLNT_CREATE_ONESHOT |
|
.flags = RPC_CLNT_CREATE_NOPING,
|
||||||
RPC_CLNT_CREATE_NOPING),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
((struct sockaddr_in *)srvaddr)->sin_port = htons(RPCBIND_PORT);
|
((struct sockaddr_in *)srvaddr)->sin_port = htons(RPCBIND_PORT);
|
||||||
|
@ -238,6 +237,7 @@ int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
|
||||||
|
|
||||||
error = rpc_call_sync(rpcb_clnt, &msg, 0);
|
error = rpc_call_sync(rpcb_clnt, &msg, 0);
|
||||||
|
|
||||||
|
rpc_shutdown_client(rpcb_clnt);
|
||||||
if (error < 0)
|
if (error < 0)
|
||||||
printk(KERN_WARNING "RPC: failed to contact local rpcbind "
|
printk(KERN_WARNING "RPC: failed to contact local rpcbind "
|
||||||
"server (errno %d).\n", -error);
|
"server (errno %d).\n", -error);
|
||||||
|
@ -286,6 +286,7 @@ int rpcb_getport_external(struct sockaddr_in *sin, __u32 prog,
|
||||||
return PTR_ERR(rpcb_clnt);
|
return PTR_ERR(rpcb_clnt);
|
||||||
|
|
||||||
status = rpc_call_sync(rpcb_clnt, &msg, 0);
|
status = rpc_call_sync(rpcb_clnt, &msg, 0);
|
||||||
|
rpc_shutdown_client(rpcb_clnt);
|
||||||
|
|
||||||
if (status >= 0) {
|
if (status >= 0) {
|
||||||
if (map.r_port != 0)
|
if (map.r_port != 0)
|
||||||
|
@ -379,6 +380,7 @@ void rpcb_getport(struct rpc_task *task)
|
||||||
}
|
}
|
||||||
|
|
||||||
child = rpc_run_task(rpcb_clnt, RPC_TASK_ASYNC, &rpcb_getport_ops, map);
|
child = rpc_run_task(rpcb_clnt, RPC_TASK_ASYNC, &rpcb_getport_ops, map);
|
||||||
|
rpc_destroy_client(rpcb_clnt);
|
||||||
if (IS_ERR(child)) {
|
if (IS_ERR(child)) {
|
||||||
status = -EIO;
|
status = -EIO;
|
||||||
dprintk("RPC: %5u rpcb_getport rpc_run_task failed\n",
|
dprintk("RPC: %5u rpcb_getport rpc_run_task failed\n",
|
||||||
|
|
|
@ -876,9 +876,7 @@ static void rpc_free_task(struct rcu_head *rcu)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a new task for the specified client. We have to
|
* Create a new task for the specified client.
|
||||||
* clean up after an allocation failure, as the client may
|
|
||||||
* have specified "oneshot".
|
|
||||||
*/
|
*/
|
||||||
struct rpc_task *rpc_new_task(struct rpc_clnt *clnt, int flags, const struct rpc_call_ops *tk_ops, void *calldata)
|
struct rpc_task *rpc_new_task(struct rpc_clnt *clnt, int flags, const struct rpc_call_ops *tk_ops, void *calldata)
|
||||||
{
|
{
|
||||||
|
@ -886,7 +884,7 @@ struct rpc_task *rpc_new_task(struct rpc_clnt *clnt, int flags, const struct rpc
|
||||||
|
|
||||||
task = rpc_alloc_task();
|
task = rpc_alloc_task();
|
||||||
if (!task)
|
if (!task)
|
||||||
goto cleanup;
|
goto out;
|
||||||
|
|
||||||
rpc_init_task(task, clnt, flags, tk_ops, calldata);
|
rpc_init_task(task, clnt, flags, tk_ops, calldata);
|
||||||
|
|
||||||
|
@ -894,14 +892,6 @@ struct rpc_task *rpc_new_task(struct rpc_clnt *clnt, int flags, const struct rpc
|
||||||
task->tk_flags |= RPC_TASK_DYNAMIC;
|
task->tk_flags |= RPC_TASK_DYNAMIC;
|
||||||
out:
|
out:
|
||||||
return task;
|
return task;
|
||||||
|
|
||||||
cleanup:
|
|
||||||
/* Check whether to release the client */
|
|
||||||
if (clnt) {
|
|
||||||
kref_get(&clnt->cl_kref); /* pretend we were used ... */
|
|
||||||
rpc_release_client(clnt);
|
|
||||||
}
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче