|
@@ -1439,6 +1439,7 @@ int dlm_master_request_handler(struct o2net_msg *msg, u32 len, void *data,
|
|
|
int found, ret;
|
|
|
int set_maybe;
|
|
|
int dispatch_assert = 0;
|
|
|
+ int dispatched = 0;
|
|
|
|
|
|
if (!dlm_grab(dlm))
|
|
|
return DLM_MASTER_RESP_NO;
|
|
@@ -1658,15 +1659,18 @@ send_response:
|
|
|
mlog(ML_ERROR, "failed to dispatch assert master work\n");
|
|
|
response = DLM_MASTER_RESP_ERROR;
|
|
|
dlm_lockres_put(res);
|
|
|
- } else
|
|
|
+ } else {
|
|
|
+ dispatched = 1;
|
|
|
__dlm_lockres_grab_inflight_worker(dlm, res);
|
|
|
+ }
|
|
|
spin_unlock(&res->spinlock);
|
|
|
} else {
|
|
|
if (res)
|
|
|
dlm_lockres_put(res);
|
|
|
}
|
|
|
|
|
|
- dlm_put(dlm);
|
|
|
+ if (!dispatched)
|
|
|
+ dlm_put(dlm);
|
|
|
return response;
|
|
|
}
|
|
|
|
|
@@ -2090,7 +2094,6 @@ int dlm_dispatch_assert_master(struct dlm_ctxt *dlm,
|
|
|
|
|
|
|
|
|
/* queue up work for dlm_assert_master_worker */
|
|
|
- dlm_grab(dlm); /* get an extra ref for the work item */
|
|
|
dlm_init_work_item(dlm, item, dlm_assert_master_worker, NULL);
|
|
|
item->u.am.lockres = res; /* already have a ref */
|
|
|
/* can optionally ignore node numbers higher than this node */
|