aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/dlm
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
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')
-rw-r--r--fs/ocfs2/dlm/dlmconvert.c5
-rw-r--r--fs/ocfs2/dlm/dlmmaster.c14
-rw-r--r--fs/ocfs2/dlm/dlmrecovery.c1
3 files changed, 18 insertions, 2 deletions
diff --git a/fs/ocfs2/dlm/dlmconvert.c b/fs/ocfs2/dlm/dlmconvert.c
index c764dc8e40a2..42c177444850 100644
--- a/fs/ocfs2/dlm/dlmconvert.c
+++ b/fs/ocfs2/dlm/dlmconvert.c
@@ -428,7 +428,7 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data)
428 struct dlm_lockstatus *lksb; 428 struct dlm_lockstatus *lksb;
429 enum dlm_status status = DLM_NORMAL; 429 enum dlm_status status = DLM_NORMAL;
430 u32 flags; 430 u32 flags;
431 int call_ast = 0, kick_thread = 0, ast_reserved = 0; 431 int call_ast = 0, kick_thread = 0, ast_reserved = 0, wake = 0;
432 432
433 if (!dlm_grab(dlm)) { 433 if (!dlm_grab(dlm)) {
434 dlm_error(DLM_REJECTED); 434 dlm_error(DLM_REJECTED);
@@ -524,8 +524,11 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data)
524 cnv->requested_type, 524 cnv->requested_type,
525 &call_ast, &kick_thread); 525 &call_ast, &kick_thread);
526 res->state &= ~DLM_LOCK_RES_IN_PROGRESS; 526 res->state &= ~DLM_LOCK_RES_IN_PROGRESS;
527 wake = 1;
527 } 528 }
528 spin_unlock(&res->spinlock); 529 spin_unlock(&res->spinlock);
530 if (wake)
531 wake_up(&res->wq);
529 532
530 if (status != DLM_NORMAL) { 533 if (status != DLM_NORMAL) {
531 if (status != DLM_NOTQUEUED) 534 if (status != DLM_NOTQUEUED)
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);
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c
index 8c60ccc7460c..e57636c399f4 100644
--- a/fs/ocfs2/dlm/dlmrecovery.c
+++ b/fs/ocfs2/dlm/dlmrecovery.c
@@ -1420,6 +1420,7 @@ int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data)
1420 spin_lock(&res->spinlock); 1420 spin_lock(&res->spinlock);
1421 res->state &= ~DLM_LOCK_RES_IN_PROGRESS; 1421 res->state &= ~DLM_LOCK_RES_IN_PROGRESS;
1422 spin_unlock(&res->spinlock); 1422 spin_unlock(&res->spinlock);
1423 wake_up(&res->wq);
1423 1424
1424 /* add an extra ref for just-allocated lockres 1425 /* add an extra ref for just-allocated lockres
1425 * otherwise the lockres will be purged immediately */ 1426 * otherwise the lockres will be purged immediately */