wrap them into struct ldlm_callback_suite.
b=16450
dead-lock in ldlm_lock_change_resource() by enforcing particular
lock ordering.
+Severity : normal
+Bugzilla : 16450
+Description: Use struct ldlm_callback_suite in ldlm_lock_create().
+Details : Instead of specifying each ldlm_lock call-back through separate
+ parameter, wrap them into struct ldlm_callback_suite.
+
--------------------------------------------------------------------------------
2007-08-10 Cluster File Systems, Inc. <info@clusterfs.com>
int added = (mode == LCK_NL);
int overlaps = 0;
int splitted = 0;
+ const struct ldlm_callback_suite null_cbs = { NULL };
ENTRY;
CDEBUG(D_DLMTRACE, "flags %#x pid %u mode %u start "LPU64" end "LPU64
if (!new2) {
unlock_res_and_lock(req);
new2 = ldlm_lock_create(ns, &res->lr_name, LDLM_FLOCK,
- lock->l_granted_mode, NULL, NULL, NULL,
+ lock->l_granted_mode, &null_cbs,
NULL, 0);
lock_res_and_lock(req);
if (!new2) {
void ldlm_grant_lock(struct ldlm_lock *lock, struct list_head *work_list);
struct ldlm_lock *
ldlm_lock_create(struct ldlm_namespace *ns, const struct ldlm_res_id *,
- ldlm_type_t type, ldlm_mode_t, ldlm_blocking_callback,
- ldlm_completion_callback, ldlm_glimpse_callback, void *data,
- __u32 lvb_len);
+ ldlm_type_t type, ldlm_mode_t,
+ const struct ldlm_callback_suite *cbs,
+ void *data, __u32 lvb_len);
ldlm_error_t ldlm_lock_enqueue(struct ldlm_namespace *, struct ldlm_lock **,
void *cookie, int *flags);
void ldlm_lock_addref_internal(struct ldlm_lock *, __u32 mode);
const struct ldlm_res_id *res_id,
ldlm_type_t type,
ldlm_mode_t mode,
- ldlm_blocking_callback blocking,
- ldlm_completion_callback completion,
- ldlm_glimpse_callback glimpse,
+ const struct ldlm_callback_suite *cbs,
void *data, __u32 lvb_len)
{
struct ldlm_lock *lock;
lock->l_req_mode = mode;
lock->l_ast_data = data;
- lock->l_blocking_ast = blocking;
- lock->l_completion_ast = completion;
- lock->l_glimpse_ast = glimpse;
lock->l_pid = cfs_curproc_pid();
+ if (cbs) {
+ lock->l_blocking_ast = cbs->lcs_blocking;
+ lock->l_completion_ast = cbs->lcs_completion;
+ lock->l_glimpse_ast = cbs->lcs_glimpse;
+ lock->l_weigh_ast = cbs->lcs_weigh;
+ }
lock->l_tree_node = NULL;
/* if this is the extent lock, allocate the interval tree node */
lock = ldlm_lock_create(ns, &dlm_req->lock_desc.l_resource.lr_name,
dlm_req->lock_desc.l_resource.lr_type,
dlm_req->lock_desc.l_req_mode,
- cbs->lcs_blocking, cbs->lcs_completion,
- cbs->lcs_glimpse, NULL, 0);
+ cbs, NULL, 0);
if (!lock)
GOTO(out, rc = -ENOMEM);
{
struct ldlm_lock *lock;
int err;
+ const struct ldlm_callback_suite cbs = { .lcs_completion = completion,
+ .lcs_blocking = blocking,
+ .lcs_glimpse = glimpse,
+ };
ENTRY;
LASSERT(!(*flags & LDLM_FL_REPLAY));
LBUG();
}
- lock = ldlm_lock_create(ns, res_id, type, mode, blocking,
- completion, glimpse, data, lvb_len);
+ lock = ldlm_lock_create(ns, res_id, type, mode, &cbs, data, lvb_len);
if (unlikely(!lock))
GOTO(out_nolock, err = -ENOMEM);
LDLM_DEBUG(lock, "client-side local enqueue handler, new lock created");
/* If we're replaying this lock, just check some invariants.
* If we're creating a new lock, get everything all setup nice. */
if (is_replay) {
- lock = ldlm_handle2lock(lockh);
+ lock = ldlm_handle2lock_long(lockh, 0);
LASSERT(lock != NULL);
LDLM_DEBUG(lock, "client-side enqueue START");
LASSERT(exp == lock->l_conn_export);
} else {
+ const struct ldlm_callback_suite cbs = {
+ .lcs_completion = einfo->ei_cb_cp,
+ .lcs_blocking = einfo->ei_cb_bl,
+ .lcs_glimpse = einfo->ei_cb_gl,
+ .lcs_weigh = einfo->ei_cb_wg
+ };
lock = ldlm_lock_create(ns, res_id, einfo->ei_type,
- einfo->ei_mode, einfo->ei_cb_bl,
- einfo->ei_cb_cp, einfo->ei_cb_gl,
- einfo->ei_cbdata, lvb_len);
+ einfo->ei_mode, &cbs, einfo->ei_cbdata,
+ lvb_len);
if (lock == NULL)
RETURN(-ENOMEM);
/* for the local lock, add the reference */