Lines Matching refs:lkb
39 void dlm_purge_lkb_callbacks(struct dlm_lkb *lkb) in dlm_purge_lkb_callbacks() argument
43 list_for_each_entry_safe(cb, safe, &lkb->lkb_callbacks, list) { in dlm_purge_lkb_callbacks()
48 lkb->lkb_flags &= ~DLM_IFL_CB_PENDING; in dlm_purge_lkb_callbacks()
51 dlm_callback_set_last_ptr(&lkb->lkb_last_cast, NULL); in dlm_purge_lkb_callbacks()
52 dlm_callback_set_last_ptr(&lkb->lkb_last_cb, NULL); in dlm_purge_lkb_callbacks()
53 lkb->lkb_last_bast_mode = -1; in dlm_purge_lkb_callbacks()
56 int dlm_enqueue_lkb_callback(struct dlm_lkb *lkb, uint32_t flags, int mode, in dlm_enqueue_lkb_callback() argument
59 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in dlm_enqueue_lkb_callback()
68 if (lkb->lkb_last_cast) { in dlm_enqueue_lkb_callback()
69 if (dlm_modes_compat(mode, lkb->lkb_last_cast->mode)) { in dlm_enqueue_lkb_callback()
71 lkb->lkb_id, mode, in dlm_enqueue_lkb_callback()
72 lkb->lkb_last_cast->mode); in dlm_enqueue_lkb_callback()
83 if (lkb->lkb_last_cb && lkb->lkb_last_cb->flags & DLM_CB_BAST) { in dlm_enqueue_lkb_callback()
84 prev_mode = lkb->lkb_last_cb->mode; in dlm_enqueue_lkb_callback()
89 lkb->lkb_id, mode, prev_mode); in dlm_enqueue_lkb_callback()
106 if (!(lkb->lkb_flags & DLM_IFL_CB_PENDING)) { in dlm_enqueue_lkb_callback()
107 lkb->lkb_flags |= DLM_IFL_CB_PENDING; in dlm_enqueue_lkb_callback()
110 list_add_tail(&cb->list, &lkb->lkb_callbacks); in dlm_enqueue_lkb_callback()
113 dlm_callback_set_last_ptr(&lkb->lkb_last_cast, cb); in dlm_enqueue_lkb_callback()
115 dlm_callback_set_last_ptr(&lkb->lkb_last_cb, cb); in dlm_enqueue_lkb_callback()
121 int dlm_dequeue_lkb_callback(struct dlm_lkb *lkb, struct dlm_callback **cb) in dlm_dequeue_lkb_callback() argument
124 *cb = list_first_entry_or_null(&lkb->lkb_callbacks, in dlm_dequeue_lkb_callback()
131 if (list_empty(&lkb->lkb_callbacks)) in dlm_dequeue_lkb_callback()
137 void dlm_add_cb(struct dlm_lkb *lkb, uint32_t flags, int mode, int status, in dlm_add_cb() argument
140 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in dlm_add_cb()
143 if (lkb->lkb_flags & DLM_IFL_USER) { in dlm_add_cb()
144 dlm_user_add_ast(lkb, flags, mode, status, sbflags); in dlm_add_cb()
148 spin_lock(&lkb->lkb_cb_lock); in dlm_add_cb()
149 rv = dlm_enqueue_lkb_callback(lkb, flags, mode, status, sbflags); in dlm_add_cb()
152 kref_get(&lkb->lkb_ref); in dlm_add_cb()
156 list_add(&lkb->lkb_cb_list, &ls->ls_cb_delay); in dlm_add_cb()
158 queue_work(ls->ls_callback_wq, &lkb->lkb_cb_work); in dlm_add_cb()
171 spin_unlock(&lkb->lkb_cb_lock); in dlm_add_cb()
176 struct dlm_lkb *lkb = container_of(work, struct dlm_lkb, lkb_cb_work); in dlm_callback_work() local
177 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in dlm_callback_work()
183 spin_lock(&lkb->lkb_cb_lock); in dlm_callback_work()
184 rv = dlm_dequeue_lkb_callback(lkb, &cb); in dlm_callback_work()
185 spin_unlock(&lkb->lkb_cb_lock); in dlm_callback_work()
191 castfn = lkb->lkb_astfn; in dlm_callback_work()
192 bastfn = lkb->lkb_bastfn; in dlm_callback_work()
195 trace_dlm_bast(ls, lkb, cb->mode); in dlm_callback_work()
196 lkb->lkb_last_bast_time = ktime_get(); in dlm_callback_work()
197 lkb->lkb_last_bast_mode = cb->mode; in dlm_callback_work()
198 bastfn(lkb->lkb_astparam, cb->mode); in dlm_callback_work()
200 lkb->lkb_lksb->sb_status = cb->sb_status; in dlm_callback_work()
201 lkb->lkb_lksb->sb_flags = cb->sb_flags; in dlm_callback_work()
202 trace_dlm_ast(ls, lkb); in dlm_callback_work()
203 lkb->lkb_last_cast_time = ktime_get(); in dlm_callback_work()
204 castfn(lkb->lkb_astparam); in dlm_callback_work()
209 spin_lock(&lkb->lkb_cb_lock); in dlm_callback_work()
210 rv = dlm_dequeue_lkb_callback(lkb, &cb); in dlm_callback_work()
212 lkb->lkb_flags &= ~DLM_IFL_CB_PENDING; in dlm_callback_work()
213 spin_unlock(&lkb->lkb_cb_lock); in dlm_callback_work()
216 spin_unlock(&lkb->lkb_cb_lock); in dlm_callback_work()
221 dlm_put_lkb(lkb); in dlm_callback_work()
256 struct dlm_lkb *lkb, *safe; in dlm_callback_resume() local
265 list_for_each_entry_safe(lkb, safe, &ls->ls_cb_delay, lkb_cb_list) { in dlm_callback_resume()
266 list_del_init(&lkb->lkb_cb_list); in dlm_callback_resume()
267 queue_work(ls->ls_callback_wq, &lkb->lkb_cb_work); in dlm_callback_resume()