ldlm_resource_put(res);
l_unlock(&ns->ns_lock);
+ wait_event_interruptible(lock->l_waitq, lock->l_req_mode ==
+ lock->l_granted_mode);
+
return rc;
}
/* Must be called without the resource lock held. Returns a referenced,
* unlocked ldlm_lock. */
-ldlm_error_t ldlm_local_lock_create(struct ldlm_namespace *ns,
- struct lustre_handle *parent_lock_handle,
- __u64 *res_id, __u32 type,
- ldlm_mode_t mode,
- void *data,
- __u32 data_len,
- struct lustre_handle *lockh)
+struct ldlm_lock *
+ldlm_local_lock_create(struct ldlm_namespace *ns,
+ struct lustre_handle *parent_lock_handle,
+ __u64 *res_id, __u32 type,
+ ldlm_mode_t mode,
+ void *data,
+ __u32 data_len)
{
struct ldlm_resource *res, *parent_res = NULL;
struct ldlm_lock *lock, *parent_lock;
res = ldlm_resource_get(ns, parent_res, res_id, type, 1);
if (res == NULL)
- RETURN(-ENOMEM);
+ RETURN(NULL);
lock = ldlm_lock_new(parent_lock, res);
if (lock == NULL) {
ldlm_resource_put(res);
- RETURN(-ENOMEM);
+ RETURN(NULL);
}
lock->l_req_mode = mode;
lock->l_data_len = data_len;
ldlm_lock_addref(lock, mode);
- ldlm_object2handle(lock, lockh);
- return ELDLM_OK;
+ return lock;
}
/* Must be called with lock->l_lock and lock->l_resource->lr_lock not held */
ENTRY;
*flags = 0;
- rc = ldlm_local_lock_create(ns, parent_lock_handle, res_id, type, mode,
- data, data_len, lockh);
- if (rc != ELDLM_OK)
- GOTO(out, rc);
+ lock = ldlm_local_lock_create(ns, parent_lock_handle, res_id, type,
+ mode, data, data_len);
+ if (lock == NULL)
+ GOTO(out, rc = -ENOMEM);
- lock = lustre_handle2object(lockh);
+ ldlm_lock2handle(lock, &lockh);
LDLM_DEBUG(lock, "client-side enqueue START");
if (req == NULL) {