SUNRPC: clean up rpc_call_async/rpc_call_sync/rpc_run_task
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
188fef11db
commit
6e5b70e9d1
@ -474,73 +474,96 @@ void rpc_clnt_sigunmask(struct rpc_clnt *clnt, sigset_t *oldset)
|
|||||||
rpc_restore_sigmask(oldset);
|
rpc_restore_sigmask(oldset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static
|
||||||
* New rpc_call implementation
|
struct rpc_task *rpc_do_run_task(struct rpc_clnt *clnt,
|
||||||
|
struct rpc_message *msg,
|
||||||
|
int flags,
|
||||||
|
const struct rpc_call_ops *ops,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
struct rpc_task *task, *ret;
|
||||||
|
sigset_t oldset;
|
||||||
|
|
||||||
|
task = rpc_new_task(clnt, flags, ops, data);
|
||||||
|
if (task == NULL) {
|
||||||
|
rpc_release_calldata(ops, data);
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mask signals on synchronous RPC calls and RPCSEC_GSS upcalls */
|
||||||
|
rpc_task_sigmask(task, &oldset);
|
||||||
|
if (msg != NULL) {
|
||||||
|
rpc_call_setup(task, msg, 0);
|
||||||
|
if (task->tk_status != 0) {
|
||||||
|
ret = ERR_PTR(task->tk_status);
|
||||||
|
rpc_put_task(task);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
atomic_inc(&task->tk_count);
|
||||||
|
rpc_execute(task);
|
||||||
|
ret = task;
|
||||||
|
out:
|
||||||
|
rpc_restore_sigmask(&oldset);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rpc_call_sync - Perform a synchronous RPC call
|
||||||
|
* @clnt: pointer to RPC client
|
||||||
|
* @msg: RPC call parameters
|
||||||
|
* @flags: RPC call flags
|
||||||
*/
|
*/
|
||||||
int rpc_call_sync(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
|
int rpc_call_sync(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
|
||||||
{
|
{
|
||||||
struct rpc_task *task;
|
struct rpc_task *task;
|
||||||
sigset_t oldset;
|
int status;
|
||||||
int status;
|
|
||||||
|
|
||||||
BUG_ON(flags & RPC_TASK_ASYNC);
|
BUG_ON(flags & RPC_TASK_ASYNC);
|
||||||
|
|
||||||
task = rpc_new_task(clnt, flags, &rpc_default_ops, NULL);
|
task = rpc_do_run_task(clnt, msg, flags, &rpc_default_ops, NULL);
|
||||||
if (task == NULL)
|
if (IS_ERR(task))
|
||||||
return -ENOMEM;
|
return PTR_ERR(task);
|
||||||
|
|
||||||
/* Mask signals on RPC calls _and_ GSS_AUTH upcalls */
|
|
||||||
rpc_task_sigmask(task, &oldset);
|
|
||||||
|
|
||||||
/* Set up the call info struct and execute the task */
|
|
||||||
rpc_call_setup(task, msg, 0);
|
|
||||||
if (task->tk_status == 0) {
|
|
||||||
atomic_inc(&task->tk_count);
|
|
||||||
rpc_execute(task);
|
|
||||||
}
|
|
||||||
status = task->tk_status;
|
status = task->tk_status;
|
||||||
rpc_put_task(task);
|
rpc_put_task(task);
|
||||||
rpc_restore_sigmask(&oldset);
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* New rpc_call implementation
|
* rpc_call_async - Perform an asynchronous RPC call
|
||||||
|
* @clnt: pointer to RPC client
|
||||||
|
* @msg: RPC call parameters
|
||||||
|
* @flags: RPC call flags
|
||||||
|
* @ops: RPC call ops
|
||||||
|
* @data: user call data
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags,
|
rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags,
|
||||||
const struct rpc_call_ops *tk_ops, void *data)
|
const struct rpc_call_ops *tk_ops, void *data)
|
||||||
{
|
{
|
||||||
struct rpc_task *task;
|
struct rpc_task *task;
|
||||||
sigset_t oldset;
|
|
||||||
int status;
|
|
||||||
|
|
||||||
flags |= RPC_TASK_ASYNC;
|
task = rpc_do_run_task(clnt, msg, flags|RPC_TASK_ASYNC, tk_ops, data);
|
||||||
|
if (IS_ERR(task))
|
||||||
/* Create/initialize a new RPC task */
|
return PTR_ERR(task);
|
||||||
status = -ENOMEM;
|
rpc_put_task(task);
|
||||||
if (!(task = rpc_new_task(clnt, flags, tk_ops, data)))
|
return 0;
|
||||||
goto out_release;
|
|
||||||
|
|
||||||
/* Mask signals on GSS_AUTH upcalls */
|
|
||||||
rpc_task_sigmask(task, &oldset);
|
|
||||||
|
|
||||||
rpc_call_setup(task, msg, 0);
|
|
||||||
|
|
||||||
/* Set up the call info struct and execute the task */
|
|
||||||
status = task->tk_status;
|
|
||||||
if (status == 0)
|
|
||||||
rpc_execute(task);
|
|
||||||
else
|
|
||||||
rpc_put_task(task);
|
|
||||||
|
|
||||||
rpc_restore_sigmask(&oldset);
|
|
||||||
return status;
|
|
||||||
out_release:
|
|
||||||
rpc_release_calldata(tk_ops, data);
|
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rpc_run_task - Allocate a new RPC task, then run rpc_execute against it
|
||||||
|
* @clnt: pointer to RPC client
|
||||||
|
* @flags: RPC flags
|
||||||
|
* @ops: RPC call ops
|
||||||
|
* @data: user call data
|
||||||
|
*/
|
||||||
|
struct rpc_task *rpc_run_task(struct rpc_clnt *clnt, int flags,
|
||||||
|
const struct rpc_call_ops *tk_ops,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
return rpc_do_run_task(clnt, NULL, flags, tk_ops, data);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(rpc_run_task);
|
||||||
|
|
||||||
void
|
void
|
||||||
rpc_call_setup(struct rpc_task *task, struct rpc_message *msg, int flags)
|
rpc_call_setup(struct rpc_task *task, struct rpc_message *msg, int flags)
|
||||||
|
@ -933,29 +933,6 @@ static void rpc_release_task(struct rpc_task *task)
|
|||||||
rpc_put_task(task);
|
rpc_put_task(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* rpc_run_task - Allocate a new RPC task, then run rpc_execute against it
|
|
||||||
* @clnt: pointer to RPC client
|
|
||||||
* @flags: RPC flags
|
|
||||||
* @ops: RPC call ops
|
|
||||||
* @data: user call data
|
|
||||||
*/
|
|
||||||
struct rpc_task *rpc_run_task(struct rpc_clnt *clnt, int flags,
|
|
||||||
const struct rpc_call_ops *ops,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
struct rpc_task *task;
|
|
||||||
task = rpc_new_task(clnt, flags, ops, data);
|
|
||||||
if (task == NULL) {
|
|
||||||
rpc_release_calldata(ops, data);
|
|
||||||
return ERR_PTR(-ENOMEM);
|
|
||||||
}
|
|
||||||
atomic_inc(&task->tk_count);
|
|
||||||
rpc_execute(task);
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(rpc_run_task);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kill all tasks for the given client.
|
* Kill all tasks for the given client.
|
||||||
* XXX: kill their descendants as well?
|
* XXX: kill their descendants as well?
|
||||||
|
Loading…
Reference in New Issue
Block a user