|
@@ -2808,14 +2808,8 @@ again:
|
|
|
mlog(0, "trying again...\n");
|
|
|
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? */
|
|
|
spin_lock(&dlm->spinlock);
|
|
|
if (!test_bit(target, dlm->domain_map)) {
|
|
@@ -2825,10 +2819,22 @@ again:
|
|
|
}
|
|
|
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:
|
|
|
*
|
|
|
- * 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 all processes trying to reserve an ast on this
|
|
|
* lockres must wait for the MIGRATING flag to clear
|