diff options
Diffstat (limited to 'fs/ocfs2/dlm/dlmmaster.c')
-rw-r--r-- | fs/ocfs2/dlm/dlmmaster.c | 14 |
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); |