NLM: Ensure that nlmclnt_cancel_callback() doesn't loop forever
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 1 Feb 2006 17:18:25 +0000 (12:18 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 1 Feb 2006 17:52:23 +0000 (12:52 -0500)
 If the server returns NLM_LCK_DENIED_NOLOCKS, we currently retry the
 entire NLM_CANCEL request. This may end up looping forever unless the
 server changes its mind (why would it do that, though?).

 Ensure that we limit the number of retries (to 3).

 See bug# 5957 in bugzilla.kernel.org.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/lockd/clntproc.c
include/linux/lockd/lockd.h

index b8ecfa1168f3eed3ab4f549e6d3c144a988259b9..220058d8616d143d7afb386a395b818b60a855aa 100644 (file)
@@ -22,6 +22,7 @@
 #define NLMDBG_FACILITY                NLMDBG_CLIENT
 #define NLMCLNT_GRACE_WAIT     (5*HZ)
 #define NLMCLNT_POLL_TIMEOUT   (30*HZ)
+#define NLMCLNT_MAX_RETRIES    3
 
 static int     nlmclnt_test(struct nlm_rqst *, struct file_lock *);
 static int     nlmclnt_lock(struct nlm_rqst *, struct file_lock *);
@@ -802,6 +803,9 @@ die:
        return;
 
 retry_cancel:
+       /* Don't ever retry more than 3 times */
+       if (req->a_retries++ >= NLMCLNT_MAX_RETRIES)
+               goto die;
        nlm_rebind_host(req->a_host);
        rpc_restart_call(task);
        rpc_delay(task, 30 * HZ);
index afe9a8f5c5aed71f0cf4531b4c74fccf313b559a..920766cea79cbc15634411e4c9633c27f6c8fd61 100644 (file)
@@ -84,6 +84,7 @@ struct nlm_rqst {
        struct nlm_args         a_args;         /* arguments */
        struct nlm_res          a_res;          /* result */
        struct nlm_wait *       a_block;
+       unsigned int            a_retries;      /* Retry count */
        char                    a_owner[NLMCLNT_OHSIZE];
 };