}
 }
 
-/* Helper for asynchronous RPC calls */
-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;
-       rpc_execute(task);
-       return 0;
-}
-
 static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task)
 {
        sigset_t oldset;
 {
        struct nfs_server *server = NFS_SERVER(state->inode);
        struct nfs4_closedata *calldata;
+       struct nfs4_state_owner *sp = state->owner;
+       struct rpc_task *task;
        int status = -ENOMEM;
 
        calldata = kmalloc(sizeof(*calldata), GFP_KERNEL);
        calldata->path.mnt = mntget(path->mnt);
        calldata->path.dentry = dget(path->dentry);
 
-       status = nfs4_call_async(server->client, &nfs4_close_ops, calldata);
-       if (status == 0)
-               goto out;
-
-       nfs_free_seqid(calldata->arg.seqid);
+       task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_close_ops, calldata);
+       if (IS_ERR(task))
+               return PTR_ERR(task);
+       rpc_put_task(task);
+       return 0;
 out_free_calldata:
        kfree(calldata);
 out:
+       nfs4_put_open_state(state);
+       nfs4_put_state_owner(sp);
        return status;
 }
 
 
        spin_unlock(&inode->i_lock);
        spin_unlock(&owner->so_lock);
 
-       if (oldstate != newstate && nfs4_do_close(path, state) == 0)
-               return;
-       nfs4_put_open_state(state);
-       nfs4_put_state_owner(owner);
+       if (oldstate == newstate) {
+               nfs4_put_open_state(state);
+               nfs4_put_state_owner(owner);
+       } else
+               nfs4_do_close(path, state);
 }
 
 /*
 
 EXPORT_SYMBOL(rpc_wake_up_task);
 EXPORT_SYMBOL(rpciod_down);
 EXPORT_SYMBOL(rpciod_up);
-EXPORT_SYMBOL(rpc_new_task);
 EXPORT_SYMBOL(rpc_wake_up_status);
 
 /* RPC client functions */