int ldlm_extent_policy(struct ldlm_lock *, void *, ldlm_mode_t, void *);
/* ldlm_lock.c */
+void ldlm_lock2handle(struct ldlm_lock *lock, struct lustre_handle *lockh);
struct ldlm_lock *ldlm_handle2lock(struct lustre_handle *handle);
void ldlm_lock2handle(struct ldlm_lock *lock, struct lustre_handle *lockh);
void ldlm_lock_put(struct ldlm_lock *lock);
{
struct ldlm_lock_desc desc;
struct ptlrpc_request *req = NULL;
+ struct ldlm_lock_desc desc;
ENTRY;
+
l_lock(&lock->l_resource->lr_namespace->ns_lock);
if (lock->l_flags & LDLM_FL_AST_SENT) {
l_unlock(&lock->l_resource->lr_namespace->ns_lock);
lock->l_flags |= LDLM_FL_AST_SENT;
/* FIXME: this should merely add the lock to the lr_tmp list */
- ldlm_lock2desc(new, &desc);
+ ldlm_lock2desc(lock, &desc);
lock->l_blocking_ast(lock, &desc, lock->l_data, lock->l_data_len, &req);
l_unlock(&lock->l_resource->lr_namespace->ns_lock);
struct ptlrpc_request *req)
{
struct ldlm_request *dlm_req;
- struct ldlm_lock_desc desc;
struct ldlm_lock_desc *descp;
struct ldlm_lock *lock;
__u64 is_blocking_ast;
RETURN(-ENOMEM);
}
dlm_req = lustre_msg_buf(req->rq_reqmsg, 0);
+ descp = &dlm_req->lock_desc;
/* We must send the reply first, so that the thread is free to handle
* any requests made in common_callback() */
rc = ptlrpc_reply(svc, req);
if (rc != 0)
RETURN(rc);
-
+
lock = ldlm_handle2lock(&dlm_req->lock_handle1);
- is_blocking_ast = dlm_req->lock_handle2.addr;
- if (is_blocking_ast) {
- /* FIXME: copy lock information into desc here */
- descp = &desc;
- } else
- descp = NULL;
+ /* check if this is a blocking AST */
+ if (!descp->l_req_mode)
+ descp = NULL;
if (!lock) {
CERROR("callback on lock %Lx - lock disappeared\n",
LDLM_DEBUG(lock, "client %s callback handler START",
is_blocking_ast ? "blocked" : "completion");
- if (is_blocking_ast) {
+ if (descp) {
int do_ast;
l_lock(&lock->l_resource->lr_namespace->ns_lock);
lock->l_flags |= LDLM_FL_CBPENDING;
return rc;
}
-int ldlm_cli_callback(struct ldlm_lock *lock, struct ldlm_lock_desc *new,
+int ldlm_cli_callback(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
void *data, __u32 data_len, struct ptlrpc_request **reqp)
{
struct ldlm_request *body;
memcpy(&body->lock_handle1, &lock->l_remote_handle,
sizeof(body->lock_handle1));
- if (new == NULL) {
+ if (desc == NULL) {
CDEBUG(D_NET, "Sending granted AST\n");
ldlm_lock2desc(lock, &body->lock_desc);
} else {
CDEBUG(D_NET, "Sending blocked AST\n");
- memcpy(&body->lock_desc, new, sizeof(*new));
+ memcpy(&body->lock_desc, desc, sizeof(*desc));
}
LDLM_DEBUG(lock, "server preparing %s AST",
- new == NULL ? "completion" : "blocked");
+ desc->l_req_mode = 0 ? "completion" : "blocked");
req->rq_replen = lustre_msg_size(0, NULL);
} else {
CERROR("Freeing a lock still held by a client node.\n");
- ldlm_resource_del_lock(lock);
+ ldlm_resource_unlink_lock(lock);
ldlm_lock_free(lock);
rc = ldlm_resource_put(res);