diff options
Diffstat (limited to 'fs/ocfs2/dlmglue.c')
-rw-r--r-- | fs/ocfs2/dlmglue.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index 85d7c490755b..ac24f49ae2fb 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) |