|
@@ -757,6 +757,19 @@ lookup:
|
|
if (tmpres) {
|
|
if (tmpres) {
|
|
spin_unlock(&dlm->spinlock);
|
|
spin_unlock(&dlm->spinlock);
|
|
spin_lock(&tmpres->spinlock);
|
|
spin_lock(&tmpres->spinlock);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Right after dlm spinlock was released, dlm_thread could have
|
|
|
|
+ * purged the lockres. Check if lockres got unhashed. If so
|
|
|
|
+ * start over.
|
|
|
|
+ */
|
|
|
|
+ if (hlist_unhashed(&tmpres->hash_node)) {
|
|
|
|
+ spin_unlock(&tmpres->spinlock);
|
|
|
|
+ dlm_lockres_put(tmpres);
|
|
|
|
+ tmpres = NULL;
|
|
|
|
+ goto lookup;
|
|
|
|
+ }
|
|
|
|
+
|
|
/* Wait on the thread that is mastering the resource */
|
|
/* Wait on the thread that is mastering the resource */
|
|
if (tmpres->owner == DLM_LOCK_RES_OWNER_UNKNOWN) {
|
|
if (tmpres->owner == DLM_LOCK_RES_OWNER_UNKNOWN) {
|
|
__dlm_wait_on_lockres(tmpres);
|
|
__dlm_wait_on_lockres(tmpres);
|