EXIT;
out:
- ldlm_resource_put(res);
- spin_unlock(&res->lr_lock);
+ if (!ldlm_resource_put(res))
+ spin_unlock(&res->lr_lock);
return rc;
}
lock = ldlm_lock_new(parent_lock, res);
if (lock == NULL) {
spin_lock(&res->lr_lock);
- ldlm_resource_put(res);
- spin_unlock(&res->lr_lock);
+ if (!ldlm_resource_put(res))
+ spin_unlock(&res->lr_lock);
RETURN(-ENOMEM);
}
rc = policy(lock, cookie, lock->l_req_mode, NULL);
spin_lock(&res->lr_lock);
- ldlm_resource_put(res);
+ if (ldlm_resource_put(res))
+ res = NULL;
if (rc == ELDLM_LOCK_CHANGED) {
- spin_unlock(&res->lr_lock);
+ if (res)
+ spin_unlock(&res->lr_lock);
res = lock->l_resource;
spin_lock(&res->lr_lock);
*flags |= LDLM_FL_LOCK_CHANGED;
} else if (rc == ELDLM_LOCK_ABORTED) {
/* Abort. */
- ldlm_resource_put(lock->l_resource);
+ if (res && !ldlm_resource_put(res))
+ spin_unlock(&res->lr_lock);
ldlm_lock_free(lock);
RETURN(rc);
}
/* We're called with a lock that has a referenced resource and is not on
* any resource list. When we added it to a list, we incurred an extra
* reference. */
- ldlm_resource_put(lock->l_resource);
+ if (ldlm_resource_put(lock->l_resource))
+ res = NULL;
out_noput:
/* Don't set 'completion_ast' until here so that if the lock is granted
* immediately we don't do an unnecessary completion call. */
lock->l_completion_ast = completion;
- spin_unlock(&res->lr_lock);
+ if (res)
+ spin_unlock(&res->lr_lock);
return ELDLM_OK;
}
void *cookie = NULL;
ENTRY;
+ LDLM_DEBUG_NOLOCK("server-side enqueue handler START");
+
callback = ldlm_cli_callback;
dlm_req = lustre_msg_buf(req->rq_reqmsg, 0);
lock = lustre_handle2object(&lockh);
memcpy(&lock->l_remote_handle, &dlm_req->lock_handle1,
sizeof(lock->l_remote_handle));
- LDLM_DEBUG(lock, "server-side enqueue handler START");
+ LDLM_DEBUG(lock, "server-side enqueue handler, new lock created");
flags = dlm_req->lock_flags;
err = ldlm_local_lock_enqueue(&lockh, cookie, cookielen, &flags,
LDLM_DEBUG(lock, "client-side enqueue END (%s)",
rc == ELDLM_LOCK_ABORTED ? "ABORTED" : "FAILED");
spin_lock(&lock->l_resource->lr_lock);
- ldlm_resource_put(lock->l_resource);
- spin_unlock(&lock->l_resource->lr_lock);
+ if (!ldlm_resource_put(lock->l_resource))
+ spin_unlock(&lock->l_resource->lr_lock);
ldlm_lock_free(lock);
GOTO(out, rc);
}