diff options
Diffstat (limited to 'fs/ocfs2/dlm')
-rw-r--r-- | fs/ocfs2/dlm/dlmmaster.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 215e41abf101..3689b3592042 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
@@ -1460,6 +1460,18 @@ way_up_top: | |||
1460 | 1460 | ||
1461 | /* take care of the easy cases up front */ | 1461 | /* take care of the easy cases up front */ |
1462 | spin_lock(&res->spinlock); | 1462 | spin_lock(&res->spinlock); |
1463 | |||
1464 | /* | ||
1465 | * Right after dlm spinlock was released, dlm_thread could have | ||
1466 | * purged the lockres. Check if lockres got unhashed. If so | ||
1467 | * start over. | ||
1468 | */ | ||
1469 | if (hlist_unhashed(&res->hash_node)) { | ||
1470 | spin_unlock(&res->spinlock); | ||
1471 | dlm_lockres_put(res); | ||
1472 | goto way_up_top; | ||
1473 | } | ||
1474 | |||
1463 | if (res->state & (DLM_LOCK_RES_RECOVERING| | 1475 | if (res->state & (DLM_LOCK_RES_RECOVERING| |
1464 | DLM_LOCK_RES_MIGRATING)) { | 1476 | DLM_LOCK_RES_MIGRATING)) { |
1465 | spin_unlock(&res->spinlock); | 1477 | spin_unlock(&res->spinlock); |