aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/dlm/dlmmaster.c
diff options
context:
space:
mode:
authorKurt Hackel <kurt.hackel@oracle.com>2007-01-17 17:59:12 -0500
committerMark Fasheh <mark.fasheh@oracle.com>2007-02-07 15:05:19 -0500
commita6fa36402aba96362311318200d710ea1719e59b (patch)
tree59c52d0437c99f55a89dfa08dc25508b2414bbcb /fs/ocfs2/dlm/dlmmaster.c
parent28b72d9c92ed43e01e4094f57bcad1814b002779 (diff)
ocfs2_dlm: wake up sleepers on the lockres waitqueue
The dlm was not waking up threads waiting on the lockres wait queue, waiting for the lockres to be no longer be in the DLM_LOCK_RES_IN_PROGRESS and the DLM_LOCK_RES_MIGRATING states. Signed-off-by: Kurt Hackel <kurt.hackel@oracle.com> Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Diffstat (limited to 'fs/ocfs2/dlm/dlmmaster.c')
-rw-r--r--fs/ocfs2/dlm/dlmmaster.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
index b36cce034ea0..6cfbdf282d46 100644
--- a/fs/ocfs2/dlm/dlmmaster.c
+++ b/fs/ocfs2/dlm/dlmmaster.c
@@ -1967,6 +1967,7 @@ ok:
1967 spin_unlock(&mle->spinlock); 1967 spin_unlock(&mle->spinlock);
1968 1968
1969 if (res) { 1969 if (res) {
1970 int wake = 0;
1970 spin_lock(&res->spinlock); 1971 spin_lock(&res->spinlock);
1971 if (mle->type == DLM_MLE_MIGRATION) { 1972 if (mle->type == DLM_MLE_MIGRATION) {
1972 mlog(0, "finishing off migration of lockres %.*s, " 1973 mlog(0, "finishing off migration of lockres %.*s, "
@@ -1974,6 +1975,7 @@ ok:
1974 res->lockname.len, res->lockname.name, 1975 res->lockname.len, res->lockname.name,
1975 dlm->node_num, mle->new_master); 1976 dlm->node_num, mle->new_master);
1976 res->state &= ~DLM_LOCK_RES_MIGRATING; 1977 res->state &= ~DLM_LOCK_RES_MIGRATING;
1978 wake = 1;
1977 dlm_change_lockres_owner(dlm, res, mle->new_master); 1979 dlm_change_lockres_owner(dlm, res, mle->new_master);
1978 BUG_ON(res->state & DLM_LOCK_RES_DIRTY); 1980 BUG_ON(res->state & DLM_LOCK_RES_DIRTY);
1979 } else { 1981 } else {
@@ -1981,6 +1983,8 @@ ok:
1981 } 1983 }
1982 spin_unlock(&res->spinlock); 1984 spin_unlock(&res->spinlock);
1983 have_lockres_ref = 1; 1985 have_lockres_ref = 1;
1986 if (wake)
1987 wake_up(&res->wq);
1984 } 1988 }
1985 1989
1986 /* master is known, detach if not already detached. 1990 /* master is known, detach if not already detached.
@@ -2342,7 +2346,7 @@ static int dlm_migrate_lockres(struct dlm_ctxt *dlm,
2342 struct list_head *queue, *iter; 2346 struct list_head *queue, *iter;
2343 int i; 2347 int i;
2344 struct dlm_lock *lock; 2348 struct dlm_lock *lock;
2345 int empty = 1; 2349 int empty = 1, wake = 0;
2346 2350
2347 if (!dlm_grab(dlm)) 2351 if (!dlm_grab(dlm))
2348 return -EINVAL; 2352 return -EINVAL;
@@ -2467,6 +2471,7 @@ static int dlm_migrate_lockres(struct dlm_ctxt *dlm,
2467 res->lockname.name, target); 2471 res->lockname.name, target);
2468 spin_lock(&res->spinlock); 2472 spin_lock(&res->spinlock);
2469 res->state &= ~DLM_LOCK_RES_MIGRATING; 2473 res->state &= ~DLM_LOCK_RES_MIGRATING;
2474 wake = 1;
2470 spin_unlock(&res->spinlock); 2475 spin_unlock(&res->spinlock);
2471 ret = -EINVAL; 2476 ret = -EINVAL;
2472 } 2477 }
@@ -2525,6 +2530,7 @@ fail:
2525 dlm_put_mle_inuse(mle); 2530 dlm_put_mle_inuse(mle);
2526 spin_lock(&res->spinlock); 2531 spin_lock(&res->spinlock);
2527 res->state &= ~DLM_LOCK_RES_MIGRATING; 2532 res->state &= ~DLM_LOCK_RES_MIGRATING;
2533 wake = 1;
2528 spin_unlock(&res->spinlock); 2534 spin_unlock(&res->spinlock);
2529 goto leave; 2535 goto leave;
2530 } 2536 }
@@ -2567,6 +2573,7 @@ fail:
2567 dlm_put_mle_inuse(mle); 2573 dlm_put_mle_inuse(mle);
2568 spin_lock(&res->spinlock); 2574 spin_lock(&res->spinlock);
2569 res->state &= ~DLM_LOCK_RES_MIGRATING; 2575 res->state &= ~DLM_LOCK_RES_MIGRATING;
2576 wake = 1;
2570 spin_unlock(&res->spinlock); 2577 spin_unlock(&res->spinlock);
2571 goto leave; 2578 goto leave;
2572 } 2579 }
@@ -2595,6 +2602,11 @@ leave:
2595 if (ret < 0) 2602 if (ret < 0)
2596 dlm_kick_thread(dlm, res); 2603 dlm_kick_thread(dlm, res);
2597 2604
2605 /* wake up waiters if the MIGRATING flag got set
2606 * but migration failed */
2607 if (wake)
2608 wake_up(&res->wq);
2609
2598 /* TODO: cleanup */ 2610 /* TODO: cleanup */
2599 if (mres) 2611 if (mres)
2600 free_page((unsigned long)mres); 2612 free_page((unsigned long)mres);