aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2008-04-02 14:40:53 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-04-19 16:53:45 -0400
commit6b4b3a752b3464f2fd9fe2837fb19270c23c1d6b (patch)
tree02c504fd397a5bb4f484e1205e2568bbcddfc2c5 /fs
parent8ec7ff74448f65ac963e330795d771ab14ec8408 (diff)
NLM/lockd: Ensure that nlmclnt_cancel() returns results of the CANCEL call
Currently, it returns success as long as the RPC call was sent. We'd like to know if the CANCEL operation succeeded on the server. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/lockd/clntproc.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c
index 5f13e0363b28..ea1a6940af22 100644
--- a/fs/lockd/clntproc.c
+++ b/fs/lockd/clntproc.c
@@ -699,6 +699,10 @@ static const struct rpc_call_ops nlmclnt_unlock_ops = {
699static int nlmclnt_cancel(struct nlm_host *host, int block, struct file_lock *fl) 699static int nlmclnt_cancel(struct nlm_host *host, int block, struct file_lock *fl)
700{ 700{
701 struct nlm_rqst *req; 701 struct nlm_rqst *req;
702 int status;
703
704 dprintk("lockd: blocking lock attempt was interrupted by a signal.\n"
705 " Attempting to cancel lock.\n");
702 706
703 req = nlm_alloc_call(nlm_get_host(host)); 707 req = nlm_alloc_call(nlm_get_host(host));
704 if (!req) 708 if (!req)
@@ -708,7 +712,12 @@ static int nlmclnt_cancel(struct nlm_host *host, int block, struct file_lock *fl
708 nlmclnt_setlockargs(req, fl); 712 nlmclnt_setlockargs(req, fl);
709 req->a_args.block = block; 713 req->a_args.block = block;
710 714
711 return nlmclnt_async_call(req, NLMPROC_CANCEL, &nlmclnt_cancel_ops); 715 atomic_inc(&req->a_count);
716 status = nlmclnt_async_call(req, NLMPROC_CANCEL, &nlmclnt_cancel_ops);
717 if (status == 0 && req->a_res.status == nlm_lck_denied)
718 status = -ENOLCK;
719 nlm_release_call(req);
720 return status;
712} 721}
713 722
714static void nlmclnt_cancel_callback(struct rpc_task *task, void *data) 723static void nlmclnt_cancel_callback(struct rpc_task *task, void *data)