Commit 4ce70ada authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Further cleanups

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 963d8fe5
...@@ -195,14 +195,13 @@ static void update_changeattr(struct inode *inode, struct nfs4_change_info *cinf ...@@ -195,14 +195,13 @@ static void update_changeattr(struct inode *inode, struct nfs4_change_info *cinf
} }
/* Helper for asynchronous RPC calls */ /* Helper for asynchronous RPC calls */
static int nfs4_call_async(struct rpc_clnt *clnt, rpc_action tk_begin, static int nfs4_call_async(struct rpc_clnt *clnt,
const struct rpc_call_ops *tk_ops, void *calldata) const struct rpc_call_ops *tk_ops, void *calldata)
{ {
struct rpc_task *task; struct rpc_task *task;
if (!(task = rpc_new_task(clnt, RPC_TASK_ASYNC, tk_ops, calldata))) if (!(task = rpc_new_task(clnt, RPC_TASK_ASYNC, tk_ops, calldata)))
return -ENOMEM; return -ENOMEM;
task->tk_action = tk_begin;
rpc_execute(task); rpc_execute(task);
return 0; return 0;
} }
...@@ -882,6 +881,8 @@ static void nfs4_close_done(struct rpc_task *task, void *data) ...@@ -882,6 +881,8 @@ static void nfs4_close_done(struct rpc_task *task, void *data)
struct nfs4_state *state = calldata->state; struct nfs4_state *state = calldata->state;
struct nfs_server *server = NFS_SERVER(calldata->inode); struct nfs_server *server = NFS_SERVER(calldata->inode);
if (RPC_ASSASSINATED(task))
return;
/* hmm. we are done with the inode, and in the process of freeing /* hmm. we are done with the inode, and in the process of freeing
* the state_owner. we keep this around to process errors * the state_owner. we keep this around to process errors
*/ */
...@@ -904,9 +905,9 @@ static void nfs4_close_done(struct rpc_task *task, void *data) ...@@ -904,9 +905,9 @@ static void nfs4_close_done(struct rpc_task *task, void *data)
nfs_refresh_inode(calldata->inode, calldata->res.fattr); nfs_refresh_inode(calldata->inode, calldata->res.fattr);
} }
static void nfs4_close_begin(struct rpc_task *task) static void nfs4_close_prepare(struct rpc_task *task, void *data)
{ {
struct nfs4_closedata *calldata = (struct nfs4_closedata *)task->tk_calldata; struct nfs4_closedata *calldata = data;
struct nfs4_state *state = calldata->state; struct nfs4_state *state = calldata->state;
struct rpc_message msg = { struct rpc_message msg = {
.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE], .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
...@@ -944,6 +945,7 @@ static void nfs4_close_begin(struct rpc_task *task) ...@@ -944,6 +945,7 @@ static void nfs4_close_begin(struct rpc_task *task)
} }
static const struct rpc_call_ops nfs4_close_ops = { static const struct rpc_call_ops nfs4_close_ops = {
.rpc_call_prepare = nfs4_close_prepare,
.rpc_call_done = nfs4_close_done, .rpc_call_done = nfs4_close_done,
.rpc_release = nfs4_free_closedata, .rpc_release = nfs4_free_closedata,
}; };
...@@ -980,8 +982,7 @@ int nfs4_do_close(struct inode *inode, struct nfs4_state *state) ...@@ -980,8 +982,7 @@ int nfs4_do_close(struct inode *inode, struct nfs4_state *state)
calldata->res.fattr = &calldata->fattr; calldata->res.fattr = &calldata->fattr;
calldata->res.server = server; calldata->res.server = server;
status = nfs4_call_async(server->client, nfs4_close_begin, status = nfs4_call_async(server->client, &nfs4_close_ops, calldata);
&nfs4_close_ops, calldata);
if (status == 0) if (status == 0)
goto out; goto out;
...@@ -2909,9 +2910,9 @@ static void nfs4_locku_done(struct rpc_task *task, void *data) ...@@ -2909,9 +2910,9 @@ static void nfs4_locku_done(struct rpc_task *task, void *data)
} }
} }
static void nfs4_locku_begin(struct rpc_task *task) static void nfs4_locku_prepare(struct rpc_task *task, void *data)
{ {
struct nfs4_unlockdata *calldata = (struct nfs4_unlockdata *)task->tk_calldata; struct nfs4_unlockdata *calldata = data;
struct rpc_message msg = { struct rpc_message msg = {
.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU], .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
.rpc_argp = &calldata->arg, .rpc_argp = &calldata->arg,
...@@ -2932,6 +2933,7 @@ static void nfs4_locku_begin(struct rpc_task *task) ...@@ -2932,6 +2933,7 @@ static void nfs4_locku_begin(struct rpc_task *task)
} }
static const struct rpc_call_ops nfs4_locku_ops = { static const struct rpc_call_ops nfs4_locku_ops = {
.rpc_call_prepare = nfs4_locku_prepare,
.rpc_call_done = nfs4_locku_done, .rpc_call_done = nfs4_locku_done,
.rpc_release = nfs4_locku_complete, .rpc_release = nfs4_locku_complete,
}; };
...@@ -2979,8 +2981,7 @@ static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock * ...@@ -2979,8 +2981,7 @@ static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *
atomic_set(&calldata->refcount, 2); atomic_set(&calldata->refcount, 2);
init_completion(&calldata->completion); init_completion(&calldata->completion);
status = nfs4_call_async(NFS_SERVER(inode)->client, nfs4_locku_begin, status = nfs4_call_async(NFS_SERVER(inode)->client, &nfs4_locku_ops, calldata);
&nfs4_locku_ops, calldata);
if (status == 0) if (status == 0)
wait_for_completion_interruptible(&calldata->completion); wait_for_completion_interruptible(&calldata->completion);
do_vfs_lock(request->fl_file, request); do_vfs_lock(request->fl_file, request);
......
...@@ -87,10 +87,9 @@ nfs_copy_dname(struct dentry *dentry, struct nfs_unlinkdata *data) ...@@ -87,10 +87,9 @@ nfs_copy_dname(struct dentry *dentry, struct nfs_unlinkdata *data)
* We delay initializing RPC info until after the call to dentry_iput() * We delay initializing RPC info until after the call to dentry_iput()
* in order to minimize races against rename(). * in order to minimize races against rename().
*/ */
static void static void nfs_async_unlink_init(struct rpc_task *task, void *calldata)
nfs_async_unlink_init(struct rpc_task *task)
{ {
struct nfs_unlinkdata *data = (struct nfs_unlinkdata *)task->tk_calldata; struct nfs_unlinkdata *data = calldata;
struct dentry *dir = data->dir; struct dentry *dir = data->dir;
struct rpc_message msg = { struct rpc_message msg = {
.rpc_cred = data->cred, .rpc_cred = data->cred,
...@@ -147,6 +146,7 @@ static void nfs_async_unlink_release(void *calldata) ...@@ -147,6 +146,7 @@ static void nfs_async_unlink_release(void *calldata)
} }
static const struct rpc_call_ops nfs_unlink_ops = { static const struct rpc_call_ops nfs_unlink_ops = {
.rpc_call_prepare = nfs_async_unlink_init,
.rpc_call_done = nfs_async_unlink_done, .rpc_call_done = nfs_async_unlink_done,
.rpc_release = nfs_async_unlink_release, .rpc_release = nfs_async_unlink_release,
}; };
...@@ -160,7 +160,6 @@ nfs_async_unlink(struct dentry *dentry) ...@@ -160,7 +160,6 @@ nfs_async_unlink(struct dentry *dentry)
{ {
struct dentry *dir = dentry->d_parent; struct dentry *dir = dentry->d_parent;
struct nfs_unlinkdata *data; struct nfs_unlinkdata *data;
struct rpc_task *task;
struct rpc_clnt *clnt = NFS_CLIENT(dir->d_inode); struct rpc_clnt *clnt = NFS_CLIENT(dir->d_inode);
int status = -ENOMEM; int status = -ENOMEM;
...@@ -181,15 +180,13 @@ nfs_async_unlink(struct dentry *dentry) ...@@ -181,15 +180,13 @@ nfs_async_unlink(struct dentry *dentry)
nfs_deletes = data; nfs_deletes = data;
data->count = 1; data->count = 1;
task = &data->task; rpc_init_task(&data->task, clnt, RPC_TASK_ASYNC, &nfs_unlink_ops, data);
rpc_init_task(task, clnt, RPC_TASK_ASYNC, &nfs_unlink_ops, data);
task->tk_action = nfs_async_unlink_init;
spin_lock(&dentry->d_lock); spin_lock(&dentry->d_lock);
dentry->d_flags |= DCACHE_NFSFS_RENAMED; dentry->d_flags |= DCACHE_NFSFS_RENAMED;
spin_unlock(&dentry->d_lock); spin_unlock(&dentry->d_lock);
rpc_sleep_on(&nfs_delete_queue, task, NULL, NULL); rpc_sleep_on(&nfs_delete_queue, &data->task, NULL, NULL);
status = 0; status = 0;
out: out:
return status; return status;
......
...@@ -112,6 +112,7 @@ struct rpc_task { ...@@ -112,6 +112,7 @@ struct rpc_task {
typedef void (*rpc_action)(struct rpc_task *); typedef void (*rpc_action)(struct rpc_task *);
struct rpc_call_ops { struct rpc_call_ops {
void (*rpc_call_prepare)(struct rpc_task *, void *);
void (*rpc_call_done)(struct rpc_task *, void *); void (*rpc_call_done)(struct rpc_task *, void *);
void (*rpc_release)(void *); void (*rpc_release)(void *);
}; };
......
...@@ -554,6 +554,14 @@ __rpc_atrun(struct rpc_task *task) ...@@ -554,6 +554,14 @@ __rpc_atrun(struct rpc_task *task)
rpc_wake_up_task(task); rpc_wake_up_task(task);
} }
/*
* Helper to call task->tk_ops->rpc_call_prepare
*/
static void rpc_prepare_task(struct rpc_task *task)
{
task->tk_ops->rpc_call_prepare(task, task->tk_calldata);
}
/* /*
* Helper that calls task->tk_ops->rpc_call_done if it exists * Helper that calls task->tk_ops->rpc_call_done if it exists
*/ */
...@@ -756,6 +764,8 @@ void rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt, int flags, cons ...@@ -756,6 +764,8 @@ void rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt, int flags, cons
task->tk_client = clnt; task->tk_client = clnt;
task->tk_flags = flags; task->tk_flags = flags;
task->tk_ops = tk_ops; task->tk_ops = tk_ops;
if (tk_ops->rpc_call_prepare != NULL)
task->tk_action = rpc_prepare_task;
task->tk_calldata = calldata; task->tk_calldata = calldata;
/* Initialize retry counters */ /* Initialize retry counters */
......
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