ocfs2/dlm: Remove BUG_ON from migration in the rare case of a down node
For migration, we are waiting for DLM_LOCK_RES_MIGRATING flag to be set before sending DLM_MIG_LOCKRES_MSG message to the target. We are using dlm_migration_can_proceed() for that purpose. However, if the node is down, dlm_migration_can_proceed() will also return "go ahead". In this rare case, the DLM_LOCK_RES_MIGRATING flag might not be set yet. Remove the BUG_ON() that trips over this condition. Signed-off-by: Wengang Wang <wen.gang.wang@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com>
This commit is contained in:
committed by
Joel Becker
parent
f5e27b6ddf
commit
a39953dd95
@@ -2808,14 +2808,8 @@ again:
|
|||||||
mlog(0, "trying again...\n");
|
mlog(0, "trying again...\n");
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
/* now that we are sure the MIGRATING state is there, drop
|
|
||||||
* the unneded state which blocked threads trying to DIRTY */
|
|
||||||
spin_lock(&res->spinlock);
|
|
||||||
BUG_ON(!(res->state & DLM_LOCK_RES_BLOCK_DIRTY));
|
|
||||||
BUG_ON(!(res->state & DLM_LOCK_RES_MIGRATING));
|
|
||||||
res->state &= ~DLM_LOCK_RES_BLOCK_DIRTY;
|
|
||||||
spin_unlock(&res->spinlock);
|
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
/* did the target go down or die? */
|
/* did the target go down or die? */
|
||||||
spin_lock(&dlm->spinlock);
|
spin_lock(&dlm->spinlock);
|
||||||
if (!test_bit(target, dlm->domain_map)) {
|
if (!test_bit(target, dlm->domain_map)) {
|
||||||
@@ -2825,10 +2819,22 @@ again:
|
|||||||
}
|
}
|
||||||
spin_unlock(&dlm->spinlock);
|
spin_unlock(&dlm->spinlock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if target is down, we need to clear DLM_LOCK_RES_BLOCK_DIRTY for
|
||||||
|
* another try; otherwise, we are sure the MIGRATING state is there,
|
||||||
|
* drop the unneded state which blocked threads trying to DIRTY
|
||||||
|
*/
|
||||||
|
spin_lock(&res->spinlock);
|
||||||
|
BUG_ON(!(res->state & DLM_LOCK_RES_BLOCK_DIRTY));
|
||||||
|
res->state &= ~DLM_LOCK_RES_BLOCK_DIRTY;
|
||||||
|
if (!ret)
|
||||||
|
BUG_ON(!(res->state & DLM_LOCK_RES_MIGRATING));
|
||||||
|
spin_unlock(&res->spinlock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* at this point:
|
* at this point:
|
||||||
*
|
*
|
||||||
* o the DLM_LOCK_RES_MIGRATING flag is set
|
* o the DLM_LOCK_RES_MIGRATING flag is set if target not down
|
||||||
* o there are no pending asts on this lockres
|
* o there are no pending asts on this lockres
|
||||||
* o all processes trying to reserve an ast on this
|
* o all processes trying to reserve an ast on this
|
||||||
* lockres must wait for the MIGRATING flag to clear
|
* lockres must wait for the MIGRATING flag to clear
|
||||||
|
Reference in New Issue
Block a user