lock = ldlm_lock_create(ns, parent_lock_handle, res_id, type, mode,
data, data_len);
if (lock == NULL)
- GOTO(out, rc = -ENOMEM);
+ GOTO(out_nolock, rc = -ENOMEM);
LDLM_DEBUG(lock, "client-side enqueue START");
/* for the local lock, add the reference */
ldlm_lock_addref_internal(lock, mode);
if (rc != ELDLM_OK) {
LDLM_DEBUG(lock, "client-side enqueue END (%s)",
rc == ELDLM_LOCK_ABORTED ? "ABORTED" : "FAILED");
- LDLM_LOCK_PUT(lock);
ldlm_lock_decref(lockh, mode);
/* FIXME: if we've already received a completion AST, this will
* LBUG! */
LDLM_DEBUG(lock, "client-side enqueue waking up: granted");
}
LDLM_DEBUG(lock, "client-side enqueue END");
- LDLM_LOCK_PUT(lock);
EXIT;
out:
+ LDLM_LOCK_PUT(lock);
+ out_nolock:
return rc;
}
lock->l_req_mode == lock->l_granted_mode);
CDEBUG(D_NET, "waking up, the lock must be granted.\n");
}
- LDLM_LOCK_PUT(lock);
EXIT;
out:
+ LDLM_LOCK_PUT(lock);
ptlrpc_free_req(req);
return rc;
}
GOTO(out, rc);
ldlm_lock_cancel(lock);
- LDLM_LOCK_PUT(lock);
EXIT;
out:
+ LDLM_LOCK_PUT(lock);
return rc;
}
ldlm_lock2handle(lock, &lockh);
/* can we get away without a connh here? */
rc = ldlm_cli_cancel(&lockh);
- if (rc < 0)
+ if (rc < 0) {
+ /* It failed remotely, but we'll force it to
+ * cleanup locally. */
CERROR("ldlm_cli_cancel: %d\n", rc);
+ ldlm_lock_cancel(lock);
+ }
} else {
CERROR("Freeing a lock still held by a client node.\n");