[DLM] fix loop in grant_after_purge
authorDavid Teigland <teigland@redhat.com>
Tue, 25 Jul 2006 18:59:48 +0000 (13:59 -0500)
committerSteven Whitehouse <swhiteho@redhat.com>
Wed, 26 Jul 2006 12:42:26 +0000 (08:42 -0400)
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>
fs/dlm/lock.c

index 227443218167226763cd6e28dc67bf763a9a2e3e..eaad28e51ec99474c8226d47977d19f555971864 100644 (file)
@@ -3366,12 +3366,16 @@ static struct dlm_rsb *find_purged_rsb(struct dlm_ls *ls, int bucket)
 void dlm_grant_after_purge(struct dlm_ls *ls)
 {
        struct dlm_rsb *r;
-       int i;
+       int bucket = 0;
 
-       for (i = 0; i < ls->ls_rsbtbl_size; i++) {
-               r = find_purged_rsb(ls, i);
-               if (!r)
+       while (1) {
+               r = find_purged_rsb(ls, bucket);
+               if (!r) {
+                       if (bucket == ls->ls_rsbtbl_size - 1)
+                               break;
+                       bucket++;
                        continue;
+               }
                lock_rsb(r);
                if (is_master(r)) {
                        grant_pending_locks(r);
@@ -3379,6 +3383,7 @@ void dlm_grant_after_purge(struct dlm_ls *ls)
                }
                unlock_rsb(r);
                put_rsb(r);
+               schedule();
        }
 }