Lines Matching +full:mode +full:- +full:recovery

1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* -*- mode: c; c-basic-offset: 8; -*-
59 return -ENOMEM; in dlm_init_lock_cache()
70 * caller needs: res->spinlock
80 list_for_each_entry(tmplock, &res->granted, list) { in dlm_can_grant_new_lock()
81 if (!dlm_lock_compatible(tmplock->ml.type, lock->ml.type)) in dlm_can_grant_new_lock()
85 list_for_each_entry(tmplock, &res->converting, list) { in dlm_can_grant_new_lock()
86 if (!dlm_lock_compatible(tmplock->ml.type, lock->ml.type)) in dlm_can_grant_new_lock()
88 if (!dlm_lock_compatible(tmplock->ml.convert_type, in dlm_can_grant_new_lock()
89 lock->ml.type)) in dlm_can_grant_new_lock()
99 * taken: takes and drops res->spinlock
110 mlog(0, "type=%d\n", lock->ml.type); in dlmlock_master()
112 spin_lock(&res->spinlock); in dlmlock_master()
117 lock->ml.node != dlm->node_num) { in dlmlock_master()
119 spin_unlock(&res->spinlock); in dlmlock_master()
129 lock->lksb->status = DLM_NORMAL; in dlmlock_master()
132 list_add_tail(&lock->list, &res->granted); in dlmlock_master()
134 /* for the recovery lock, we can't allow the ast in dlmlock_master()
136 * frozen. but the recovery lock is always locked in dlmlock_master()
139 if (!dlm_is_recovery_lock(res->lockname.name, in dlmlock_master()
140 res->lockname.len)) { in dlmlock_master()
145 "node %u for reco lock\n", dlm->name, in dlmlock_master()
146 lock->ml.node); in dlmlock_master()
153 if (dlm_is_recovery_lock(res->lockname.name, in dlmlock_master()
154 res->lockname.len)) { in dlmlock_master()
156 "node %u for reco lock\n", dlm->name, in dlmlock_master()
157 lock->ml.node); in dlmlock_master()
162 list_add_tail(&lock->list, &res->blocked); in dlmlock_master()
167 spin_unlock(&res->spinlock); in dlmlock_master()
168 wake_up(&res->wq); in dlmlock_master()
187 list_del_init(&lock->list); in dlm_revert_pending_lock()
188 lock->lksb->flags &= ~DLM_LKSB_GET_LVB; in dlm_revert_pending_lock()
195 * taken: takes and drops res->spinlock
207 lock->ml.type, res->lockname.len, in dlmlock_remote()
208 res->lockname.name, flags); in dlmlock_remote()
214 spin_lock(&res->spinlock); in dlmlock_remote()
216 if (res->owner == dlm->node_num) { in dlmlock_remote()
217 spin_unlock(&res->spinlock); in dlmlock_remote()
220 res->state |= DLM_LOCK_RES_IN_PROGRESS; in dlmlock_remote()
224 list_add_tail(&lock->list, &res->blocked); in dlmlock_remote()
225 lock->lock_pending = 1; in dlmlock_remote()
226 spin_unlock(&res->spinlock); in dlmlock_remote()
232 spin_lock(&res->spinlock); in dlmlock_remote()
233 res->state &= ~DLM_LOCK_RES_IN_PROGRESS; in dlmlock_remote()
234 lock->lock_pending = 0; in dlmlock_remote()
237 dlm_is_recovery_lock(res->lockname.name, in dlmlock_remote()
238 res->lockname.len)) { in dlmlock_remote()
239 /* recovery lock was mastered by dead node. in dlmlock_remote()
242 mlog(0, "%s: recovery lock was owned by " in dlmlock_remote()
244 dlm->name, res->owner); in dlmlock_remote()
257 } else if (dlm_is_recovery_lock(res->lockname.name, in dlmlock_remote()
258 res->lockname.len)) { in dlmlock_remote()
259 /* special case for the $RECOVERY lock. in dlmlock_remote()
263 mlog(0, "%s: $RECOVERY lock for this node (%u) is " in dlmlock_remote()
265 dlm->name, dlm->node_num, res->owner); in dlmlock_remote()
266 list_move_tail(&lock->list, &res->granted); in dlmlock_remote()
268 spin_unlock(&res->spinlock); in dlmlock_remote()
273 wake_up(&res->wq); in dlmlock_remote()
280 * caller needs: none, but need res->state & DLM_LOCK_RES_IN_PROGRESS
294 create.node_idx = dlm->node_num; in dlm_send_remote_lock_request()
295 create.requested_type = lock->ml.type; in dlm_send_remote_lock_request()
296 create.cookie = lock->ml.cookie; in dlm_send_remote_lock_request()
297 create.namelen = res->lockname.len; in dlm_send_remote_lock_request()
299 memcpy(create.name, res->lockname.name, create.namelen); in dlm_send_remote_lock_request()
301 tmpret = o2net_send_message(DLM_CREATE_LOCK_MSG, dlm->key, &create, in dlm_send_remote_lock_request()
302 sizeof(create), res->owner, &status); in dlm_send_remote_lock_request()
308 "currently.\n", dlm->name, create.namelen, in dlm_send_remote_lock_request()
309 create.name, res->owner); in dlm_send_remote_lock_request()
315 "node %u\n", dlm->name, create.namelen, create.name, in dlm_send_remote_lock_request()
316 tmpret, res->owner); in dlm_send_remote_lock_request()
328 kref_get(&lock->lock_refs); in dlm_lock_get()
333 kref_put(&lock->lock_refs, dlm_lock_release); in dlm_lock_put()
342 BUG_ON(!list_empty(&lock->list)); in dlm_lock_release()
343 BUG_ON(!list_empty(&lock->ast_list)); in dlm_lock_release()
344 BUG_ON(!list_empty(&lock->bast_list)); in dlm_lock_release()
345 BUG_ON(lock->ast_pending); in dlm_lock_release()
346 BUG_ON(lock->bast_pending); in dlm_lock_release()
350 if (lock->lksb_kernel_allocated) { in dlm_lock_release()
351 mlog(0, "freeing kernel-allocated lksb\n"); in dlm_lock_release()
352 kfree(lock->lksb); in dlm_lock_release()
362 lock->lockres = res; in dlm_lock_attach_lockres()
370 res = lock->lockres; in dlm_lock_detach_lockres()
372 lock->lockres = NULL; in dlm_lock_detach_lockres()
381 INIT_LIST_HEAD(&newlock->list); in dlm_init_lock()
382 INIT_LIST_HEAD(&newlock->ast_list); in dlm_init_lock()
383 INIT_LIST_HEAD(&newlock->bast_list); in dlm_init_lock()
384 spin_lock_init(&newlock->spinlock); in dlm_init_lock()
385 newlock->ml.type = type; in dlm_init_lock()
386 newlock->ml.convert_type = LKM_IVMODE; in dlm_init_lock()
387 newlock->ml.highest_blocked = LKM_IVMODE; in dlm_init_lock()
388 newlock->ml.node = node; in dlm_init_lock()
389 newlock->ml.pad1 = 0; in dlm_init_lock()
390 newlock->ml.list = 0; in dlm_init_lock()
391 newlock->ml.flags = 0; in dlm_init_lock()
392 newlock->ast = NULL; in dlm_init_lock()
393 newlock->bast = NULL; in dlm_init_lock()
394 newlock->astdata = NULL; in dlm_init_lock()
395 newlock->ml.cookie = cpu_to_be64(cookie); in dlm_init_lock()
396 newlock->ast_pending = 0; in dlm_init_lock()
397 newlock->bast_pending = 0; in dlm_init_lock()
398 newlock->convert_pending = 0; in dlm_init_lock()
399 newlock->lock_pending = 0; in dlm_init_lock()
400 newlock->unlock_pending = 0; in dlm_init_lock()
401 newlock->cancel_pending = 0; in dlm_init_lock()
402 newlock->lksb_kernel_allocated = 0; in dlm_init_lock()
404 kref_init(&newlock->lock_refs); in dlm_init_lock()
418 /* zero memory only if kernel-allocated */ in dlm_new_lock()
429 lock->lksb_kernel_allocated = 1; in dlm_new_lock()
430 lock->lksb = lksb; in dlm_new_lock()
431 lksb->lockid = lock; in dlm_new_lock()
438 * taken: takes and drops res->spinlock
446 struct dlm_create_lock *create = (struct dlm_create_lock *)msg->buf; in dlm_create_lock_handler()
459 name = create->name; in dlm_create_lock_handler()
460 namelen = create->namelen; in dlm_create_lock_handler()
465 dlm->name, create->node_idx, namelen, name); in dlm_create_lock_handler()
477 newlock = dlm_new_lock(create->requested_type, in dlm_create_lock_handler()
478 create->node_idx, in dlm_create_lock_handler()
479 be64_to_cpu(create->cookie), NULL); in dlm_create_lock_handler()
485 lksb = newlock->lksb; in dlm_create_lock_handler()
487 if (be32_to_cpu(create->flags) & LKM_GET_LVB) { in dlm_create_lock_handler()
488 lksb->flags |= DLM_LKSB_GET_LVB; in dlm_create_lock_handler()
499 spin_lock(&res->spinlock); in dlm_create_lock_handler()
501 spin_unlock(&res->spinlock); in dlm_create_lock_handler()
504 mlog(0, "lockres recovering/migrating/in-progress\n"); in dlm_create_lock_handler()
510 status = dlmlock_master(dlm, res, newlock, be32_to_cpu(create->flags)); in dlm_create_lock_handler()
525 /* fetch next node-local (u8 nodenum + u56 cookie) into u64 */
542 enum dlm_status dlmlock(struct dlm_ctxt *dlm, int mode, in dlmlock() argument
550 int convert = 0, recovery = 0; in dlmlock() local
561 if (mode != LKM_EXMODE && mode != LKM_PRMODE && mode != LKM_NLMODE) { in dlmlock()
572 recovery = (flags & LKM_RECOVERY); in dlmlock()
574 if (recovery && in dlmlock()
588 lock = lksb->lockid; in dlmlock()
595 res = lock->lockres; in dlmlock()
608 if (lock->lksb != lksb || lock->ast != ast || in dlmlock()
609 lock->bast != bast || lock->astdata != data) { in dlmlock()
614 "astdata=%p\n", lock->lksb, lock->ast, in dlmlock()
615 lock->bast, lock->astdata); in dlmlock()
621 if (res->owner == dlm->node_num) in dlmlock()
622 status = dlmconvert_master(dlm, res, lock, flags, mode); in dlmlock()
624 status = dlmconvert_remote(dlm, res, lock, flags, mode); in dlmlock()
631 mlog(0, "retrying convert with migration/recovery/" in dlmlock()
632 "in-progress\n"); in dlmlock()
652 dlm_get_next_cookie(dlm->node_num, &tmpcookie); in dlmlock()
653 lock = dlm_new_lock(mode, dlm->node_num, tmpcookie, lksb); in dlmlock()
659 if (!recovery) in dlmlock()
670 mlog(0, "type=%d, flags = 0x%x\n", mode, flags); in dlmlock()
674 lock->ast = ast; in dlmlock()
675 lock->bast = bast; in dlmlock()
676 lock->astdata = data; in dlmlock()
684 if (mode < LKM_PRMODE) in dlmlock()
688 lock->lksb->flags |= DLM_LKSB_GET_LVB; in dlmlock()
692 if (res->owner == dlm->node_num) in dlmlock()
700 if (recovery) { in dlmlock()
706 dlm_wait_for_node_death(dlm, res->owner, in dlmlock()
715 spin_lock(&res->spinlock); in dlmlock()
717 spin_unlock(&res->spinlock); in dlmlock()
723 lock->lksb->flags &= ~DLM_LKSB_GET_LVB; in dlmlock()
735 lksb->status = status; in dlmlock()