aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ocfs2/dlmglue.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c
index 85d7c490755..ac24f49ae2f 100644
--- a/fs/ocfs2/dlmglue.c
+++ b/fs/ocfs2/dlmglue.c
@@ -3445,6 +3445,19 @@ recheck:
3445 if (lockres->l_flags & OCFS2_LOCK_UPCONVERT_FINISHING) 3445 if (lockres->l_flags & OCFS2_LOCK_UPCONVERT_FINISHING)
3446 goto leave_requeue; 3446 goto leave_requeue;
3447 3447
3448 /*
3449 * How can we block and yet be at NL? We were trying to upconvert
3450 * from NL and got canceled. The code comes back here, and now
3451 * we notice and clear BLOCKING.
3452 */
3453 if (lockres->l_level == DLM_LOCK_NL) {
3454 BUG_ON(lockres->l_ex_holders || lockres->l_ro_holders);
3455 lockres->l_blocking = DLM_LOCK_NL;
3456 lockres_clear_flags(lockres, OCFS2_LOCK_BLOCKED);
3457 spin_unlock_irqrestore(&lockres->l_lock, flags);
3458 goto leave;
3459 }
3460
3448 /* if we're blocking an exclusive and we have *any* holders, 3461 /* if we're blocking an exclusive and we have *any* holders,
3449 * then requeue. */ 3462 * then requeue. */
3450 if ((lockres->l_blocking == DLM_LOCK_EX) 3463 if ((lockres->l_blocking == DLM_LOCK_EX)