aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXue jiufei <[email protected]>2013-11-12 15:07:00 -0800
committerLinus Torvalds <[email protected]>2013-11-13 12:09:01 +0900
commitfae477b6f005d6bd8a6fb3f052b30d55cfa70c26 (patch)
treef6f658c03c701a49eb3bc339efad7d1e0d2048a0
parent750e3c6581304c7dff813ac2317f5d733f84cb23 (diff)
ocfs2: delay migration when the lockres is in migration state
We trigger a bug in __dlm_lockres_reserve_ast() when we parallel umount 4 nodes. The situation is as follows: 1) Node A migrate all lockres it owned(eg. lockres A) to other nodes say node B when it umounts. 2) Receiving MIG_LOCKRES message from A, Node B masters the lockres A with DLM_LOCK_RES_MIGRATING state set. 3) Then we umount ocfs2 on node B. It also should migrate lockres A to another node, say node C. But now, DLM_LOCK_RES_MIGRATING state of lockers A is not cleared. Node B triggered the BUG on lockres with state DLM_LOCK_RES_MIGRATING. Signed-off-by: Xuejiufei <[email protected]> Signed-off-by: Joel Becker <[email protected]> Cc: Mark Fasheh <[email protected]> Cc: Tariq Saeed <[email protected]> Cc: Srinivas Eeda <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
-rw-r--r--fs/ocfs2/dlm/dlmmaster.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
index cf0f103963b1..5a0ef78fe029 100644
--- a/fs/ocfs2/dlm/dlmmaster.c
+++ b/fs/ocfs2/dlm/dlmmaster.c
@@ -2354,6 +2354,10 @@ static int dlm_is_lockres_migrateable(struct dlm_ctxt *dlm,
assert_spin_locked(&res->spinlock);
+ /* delay migration when the lockres is in MIGRATING state */
+ if (res->state & DLM_LOCK_RES_MIGRATING)
+ return 0;
+
if (res->owner != dlm->node_num)
return 0;