Lines Matching refs:lock
54 struct dlm_lock *lock);
55 static int dlm_should_cancel_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock);
66 static int dlm_should_cancel_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock) in dlm_should_cancel_bast() argument
69 assert_spin_locked(&lock->spinlock); in dlm_should_cancel_bast()
71 if (lock->ml.highest_blocked == LKM_IVMODE) in dlm_should_cancel_bast()
73 BUG_ON(lock->ml.highest_blocked == LKM_NLMODE); in dlm_should_cancel_bast()
75 if (lock->bast_pending && in dlm_should_cancel_bast()
76 list_empty(&lock->bast_list)) in dlm_should_cancel_bast()
80 if (lock->ml.type == LKM_EXMODE) in dlm_should_cancel_bast()
83 else if (lock->ml.type == LKM_NLMODE) in dlm_should_cancel_bast()
86 else if (lock->ml.highest_blocked != LKM_EXMODE) in dlm_should_cancel_bast()
93 static void __dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock) in __dlm_queue_ast() argument
98 BUG_ON(!lock); in __dlm_queue_ast()
101 if (!list_empty(&lock->ast_list)) { in __dlm_queue_ast()
103 lock->ast_pending, lock->ml.type); in __dlm_queue_ast()
106 BUG_ON(!list_empty(&lock->ast_list)); in __dlm_queue_ast()
107 if (lock->ast_pending) in __dlm_queue_ast()
111 dlm_lock_get(lock); in __dlm_queue_ast()
112 spin_lock(&lock->spinlock); in __dlm_queue_ast()
115 if (dlm_should_cancel_bast(dlm, lock)) { in __dlm_queue_ast()
116 struct dlm_lock_resource *res = lock->lockres; in __dlm_queue_ast()
119 lock->bast_pending = 0; in __dlm_queue_ast()
120 list_del_init(&lock->bast_list); in __dlm_queue_ast()
121 lock->ml.highest_blocked = LKM_IVMODE; in __dlm_queue_ast()
125 dlm_lock_put(lock); in __dlm_queue_ast()
133 list_add_tail(&lock->ast_list, &dlm->pending_asts); in __dlm_queue_ast()
134 lock->ast_pending = 1; in __dlm_queue_ast()
135 spin_unlock(&lock->spinlock); in __dlm_queue_ast()
138 void dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock) in dlm_queue_ast() argument
143 BUG_ON(!lock); in dlm_queue_ast()
146 __dlm_queue_ast(dlm, lock); in dlm_queue_ast()
151 static void __dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock) in __dlm_queue_bast() argument
156 BUG_ON(!lock); in __dlm_queue_bast()
159 BUG_ON(!list_empty(&lock->bast_list)); in __dlm_queue_bast()
160 if (lock->bast_pending) in __dlm_queue_bast()
164 dlm_lock_get(lock); in __dlm_queue_bast()
165 spin_lock(&lock->spinlock); in __dlm_queue_bast()
166 list_add_tail(&lock->bast_list, &dlm->pending_basts); in __dlm_queue_bast()
167 lock->bast_pending = 1; in __dlm_queue_bast()
168 spin_unlock(&lock->spinlock); in __dlm_queue_bast()
171 void dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock) in dlm_queue_bast() argument
176 BUG_ON(!lock); in dlm_queue_bast()
179 __dlm_queue_bast(dlm, lock); in dlm_queue_bast()
184 struct dlm_lock *lock) in dlm_update_lvb() argument
186 struct dlm_lockstatus *lksb = lock->lksb; in dlm_update_lvb()
196 lock->ml.node == dlm->node_num ? "master" : in dlm_update_lvb()
215 struct dlm_lock *lock) in dlm_do_local_ast() argument
222 lksb = lock->lksb; in dlm_do_local_ast()
223 fn = lock->ast; in dlm_do_local_ast()
224 BUG_ON(lock->ml.node != dlm->node_num); in dlm_do_local_ast()
226 dlm_update_lvb(dlm, res, lock); in dlm_do_local_ast()
227 (*fn)(lock->astdata); in dlm_do_local_ast()
232 struct dlm_lock *lock) in dlm_do_remote_ast() argument
240 lksb = lock->lksb; in dlm_do_remote_ast()
241 BUG_ON(lock->ml.node == dlm->node_num); in dlm_do_remote_ast()
244 dlm_update_lvb(dlm, res, lock); in dlm_do_remote_ast()
248 ret = dlm_send_proxy_ast(dlm, res, lock, lksbflags); in dlm_do_remote_ast()
253 struct dlm_lock *lock, int blocked_type) in dlm_do_local_bast() argument
255 dlm_bastlockfunc_t *fn = lock->bast; in dlm_do_local_bast()
258 BUG_ON(lock->ml.node != dlm->node_num); in dlm_do_local_bast()
260 (*fn)(lock->astdata, blocked_type); in dlm_do_local_bast()
272 struct dlm_lock *lock = NULL; in dlm_proxy_ast_handler() local
354 lock = NULL; in dlm_proxy_ast_handler()
356 lock = list_entry (iter, struct dlm_lock, list); in dlm_proxy_ast_handler()
357 if (lock->ml.cookie == cookie) in dlm_proxy_ast_handler()
368 lock = list_entry (iter, struct dlm_lock, list); in dlm_proxy_ast_handler()
369 if (lock->ml.cookie == cookie) in dlm_proxy_ast_handler()
388 list_move_tail(&lock->list, &res->granted); in dlm_proxy_ast_handler()
390 "convert_type=%d\n", lock->ml.type, lock->ml.convert_type); in dlm_proxy_ast_handler()
391 if (lock->ml.convert_type != LKM_IVMODE) { in dlm_proxy_ast_handler()
392 lock->ml.type = lock->ml.convert_type; in dlm_proxy_ast_handler()
393 lock->ml.convert_type = LKM_IVMODE; in dlm_proxy_ast_handler()
398 lock->lksb->status = DLM_NORMAL; in dlm_proxy_ast_handler()
402 BUG_ON(!(lock->lksb->flags & DLM_LKSB_GET_LVB)); in dlm_proxy_ast_handler()
403 memcpy(lock->lksb->lvb, past->lvb, DLM_LVB_LEN); in dlm_proxy_ast_handler()
409 dlm_do_local_ast(dlm, res, lock); in dlm_proxy_ast_handler()
411 dlm_do_local_bast(dlm, res, lock, past->blocked_type); in dlm_proxy_ast_handler()
424 struct dlm_lock *lock, int msg_type, in dlm_send_proxy_ast_msg() argument
434 res->lockname.len, res->lockname.name, lock->ml.node, in dlm_send_proxy_ast_msg()
443 past.cookie = lock->ml.cookie; in dlm_send_proxy_ast_msg()
451 vec[1].iov_base = lock->lksb->lvb; in dlm_send_proxy_ast_msg()
456 lock->ml.node, &status); in dlm_send_proxy_ast_msg()
462 "node is dead!\n", lock->ml.node); in dlm_send_proxy_ast_msg()
466 "DLM_MIGRATING!\n", lock->ml.node); in dlm_send_proxy_ast_msg()
470 lock->ml.node, status); in dlm_send_proxy_ast_msg()