Details
-
Bug
-
Resolution: Not a Bug
-
Minor
-
None
-
None
-
None
-
3
-
9223372036854775807
Description
7fff052c930da4822c3b2a13d130da7473a20a58 (https://review.whamcloud.com/19898 LU-7791 ldlm: signal vs CP callback race) adds to ldlm_handle_cp_callback() a RETURN() among many GOTO(out, ...)s. As a result there is no wake_up(&lock->l_waitq).
if (!ldlm_res_eq(&dlm_req->lock_desc.l_resource.lr_name,
&lock->l_resource->lr_name)) {
ldlm_resource_unlink_lock(lock);
unlock_res_and_lock(lock);
rc = ldlm_lock_change_resource(ns, lock,
&dlm_req->lock_desc.l_resource.lr_name);
if (rc < 0) {
LDLM_ERROR(lock, "Failed to allocate resource");
GOTO(out, rc);
}
LDLM_DEBUG(lock, "completion AST, new resource");
lock_res_and_lock(lock);
}
if (ldlm_is_failed(lock)) {
unlock_res_and_lock(lock);
LDLM_LOCK_RELEASE(lock);
RETURN(-EINVAL);
}
if (ldlm_is_destroyed(lock) ||
ldlm_is_granted(lock)) {
/* b=11300: the lock has already been granted */
unlock_res_and_lock(lock);
LDLM_DEBUG(lock, "Double grant race happened");
GOTO(out, rc = 0);
}
...
out:
if (rc < 0) {
lock_res_and_lock(lock);
ldlm_set_failed(lock);
unlock_res_and_lock(lock);
wake_up(&lock->l_waitq);
}
LDLM_LOCK_RELEASE(lock);
return 0;
}
Is this correct?