diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-02-01 12:18:25 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-02-01 12:52:23 -0500 |
commit | aaaa99423b4b1f9cfd33ea5643d9274c25f62491 (patch) | |
tree | dba6fb715156d9bc8fdf0ff57d9151e67fc1322c /fs/lockd/clntproc.c | |
parent | 16fb24252a8170799e7adf14d8fc31b817fcaf53 (diff) |
NLM: Ensure that nlmclnt_cancel_callback() doesn't loop forever
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>
Diffstat (limited to 'fs/lockd/clntproc.c')
-rw-r--r-- | fs/lockd/clntproc.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c index b8ecfa1168f3..220058d8616d 100644 --- a/fs/lockd/clntproc.c +++ b/fs/lockd/clntproc.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #define NLMDBG_FACILITY NLMDBG_CLIENT | 22 | #define NLMDBG_FACILITY NLMDBG_CLIENT |
23 | #define NLMCLNT_GRACE_WAIT (5*HZ) | 23 | #define NLMCLNT_GRACE_WAIT (5*HZ) |
24 | #define NLMCLNT_POLL_TIMEOUT (30*HZ) | 24 | #define NLMCLNT_POLL_TIMEOUT (30*HZ) |
25 | #define NLMCLNT_MAX_RETRIES 3 | ||
25 | 26 | ||
26 | static int nlmclnt_test(struct nlm_rqst *, struct file_lock *); | 27 | static int nlmclnt_test(struct nlm_rqst *, struct file_lock *); |
27 | static int nlmclnt_lock(struct nlm_rqst *, struct file_lock *); | 28 | static int nlmclnt_lock(struct nlm_rqst *, struct file_lock *); |
@@ -802,6 +803,9 @@ die: | |||
802 | return; | 803 | return; |
803 | 804 | ||
804 | retry_cancel: | 805 | retry_cancel: |
806 | /* Don't ever retry more than 3 times */ | ||
807 | if (req->a_retries++ >= NLMCLNT_MAX_RETRIES) | ||
808 | goto die; | ||
805 | nlm_rebind_host(req->a_host); | 809 | nlm_rebind_host(req->a_host); |
806 | rpc_restart_call(task); | 810 | rpc_restart_call(task); |
807 | rpc_delay(task, 30 * HZ); | 811 | rpc_delay(task, 30 * HZ); |