}
 
 /* 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)
 {
        struct rpc_task *task;
 
        if (!(task = rpc_new_task(clnt, RPC_TASK_ASYNC, tk_ops, calldata)))
                return -ENOMEM;
-       task->tk_action = tk_begin;
        rpc_execute(task);
        return 0;
 }
        struct nfs4_state *state = calldata->state;
        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
         * the state_owner. we keep this around to process errors
         */
        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 rpc_message msg = {
                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
 }
 
 static const struct rpc_call_ops nfs4_close_ops = {
+       .rpc_call_prepare = nfs4_close_prepare,
        .rpc_call_done = nfs4_close_done,
        .rpc_release = nfs4_free_closedata,
 };
        calldata->res.fattr = &calldata->fattr;
        calldata->res.server = server;
 
-       status = nfs4_call_async(server->client, nfs4_close_begin,
-                       &nfs4_close_ops, calldata);
+       status = nfs4_call_async(server->client, &nfs4_close_ops, calldata);
        if (status == 0)
                goto out;
 
        }
 }
 
-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 = {
                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
                .rpc_argp       = &calldata->arg,
 }
 
 static const struct rpc_call_ops nfs4_locku_ops = {
+       .rpc_call_prepare = nfs4_locku_prepare,
        .rpc_call_done = nfs4_locku_done,
        .rpc_release = nfs4_locku_complete,
 };
        atomic_set(&calldata->refcount, 2);
        init_completion(&calldata->completion);
 
-       status = nfs4_call_async(NFS_SERVER(inode)->client, nfs4_locku_begin,
-                       &nfs4_locku_ops, calldata);
+       status = nfs4_call_async(NFS_SERVER(inode)->client, &nfs4_locku_ops, calldata);
        if (status == 0)
                wait_for_completion_interruptible(&calldata->completion);
        do_vfs_lock(request->fl_file, request);
 
  * We delay initializing RPC info until after the call to dentry_iput()
  * in order to minimize races against rename().
  */
-static void
-nfs_async_unlink_init(struct rpc_task *task)
+static void nfs_async_unlink_init(struct rpc_task *task, void *calldata)
 {
-       struct nfs_unlinkdata   *data = (struct nfs_unlinkdata *)task->tk_calldata;
+       struct nfs_unlinkdata   *data = calldata;
        struct dentry           *dir = data->dir;
        struct rpc_message      msg = {
                .rpc_cred       = data->cred,
 }
 
 static const struct rpc_call_ops nfs_unlink_ops = {
+       .rpc_call_prepare = nfs_async_unlink_init,
        .rpc_call_done = nfs_async_unlink_done,
        .rpc_release = nfs_async_unlink_release,
 };
 {
        struct dentry   *dir = dentry->d_parent;
        struct nfs_unlinkdata   *data;
-       struct rpc_task *task;
        struct rpc_clnt *clnt = NFS_CLIENT(dir->d_inode);
        int             status = -ENOMEM;
 
        nfs_deletes = data;
        data->count = 1;
 
-       task = &data->task;
-       rpc_init_task(task, clnt, RPC_TASK_ASYNC, &nfs_unlink_ops, data);
-       task->tk_action = nfs_async_unlink_init;
+       rpc_init_task(&data->task, clnt, RPC_TASK_ASYNC, &nfs_unlink_ops, data);
 
        spin_lock(&dentry->d_lock);
        dentry->d_flags |= DCACHE_NFSFS_RENAMED;
        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;
  out:
        return status;