diff options
author | David Teigland <teigland@redhat.com> | 2006-07-25 14:59:48 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-07-26 08:42:26 -0400 |
commit | 2b4e926aab7c854a536beee6ba8b9a78a9e00316 (patch) | |
tree | 52cf392546f0a5c0453abdf3e38a89059b04a3a8 | |
parent | f7da790d743d2f0b4f39e4fa442079b3b54f3bef (diff) |
[DLM] fix loop in grant_after_purge
The loop in grant_after_purge is intended to find all rsb's in each hash
bucket that have the LOCKS_PURGED flag set. The loop was quitting the
current bucket after finding just one rsb instead of going until there are
no more.
Signed-off-by: David Teigland <teigland@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r-- | fs/dlm/lock.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c index 227443218167..eaad28e51ec9 100644 --- a/fs/dlm/lock.c +++ b/fs/dlm/lock.c | |||
@@ -3366,12 +3366,16 @@ static struct dlm_rsb *find_purged_rsb(struct dlm_ls *ls, int bucket) | |||
3366 | void dlm_grant_after_purge(struct dlm_ls *ls) | 3366 | void dlm_grant_after_purge(struct dlm_ls *ls) |
3367 | { | 3367 | { |
3368 | struct dlm_rsb *r; | 3368 | struct dlm_rsb *r; |
3369 | int i; | 3369 | int bucket = 0; |
3370 | 3370 | ||
3371 | for (i = 0; i < ls->ls_rsbtbl_size; i++) { | 3371 | while (1) { |
3372 | r = find_purged_rsb(ls, i); | 3372 | r = find_purged_rsb(ls, bucket); |
3373 | if (!r) | 3373 | if (!r) { |
3374 | if (bucket == ls->ls_rsbtbl_size - 1) | ||
3375 | break; | ||
3376 | bucket++; | ||
3374 | continue; | 3377 | continue; |
3378 | } | ||
3375 | lock_rsb(r); | 3379 | lock_rsb(r); |
3376 | if (is_master(r)) { | 3380 | if (is_master(r)) { |
3377 | grant_pending_locks(r); | 3381 | grant_pending_locks(r); |
@@ -3379,6 +3383,7 @@ void dlm_grant_after_purge(struct dlm_ls *ls) | |||
3379 | } | 3383 | } |
3380 | unlock_rsb(r); | 3384 | unlock_rsb(r); |
3381 | put_rsb(r); | 3385 | put_rsb(r); |
3386 | schedule(); | ||
3382 | } | 3387 | } |
3383 | } | 3388 | } |
3384 | 3389 | ||