Lines Matching +full:mode +full:- +full:recovery
1 /* -*- mode: c; c-basic-offset: 8; -*-
22 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 * Boston, MA 021110-1307, USA.
74 return -ENOMEM; in dlm_init_lock_cache()
85 * caller needs: res->spinlock
95 list_for_each_entry(tmplock, &res->granted, list) { in dlm_can_grant_new_lock()
96 if (!dlm_lock_compatible(tmplock->ml.type, lock->ml.type)) in dlm_can_grant_new_lock()
100 list_for_each_entry(tmplock, &res->converting, list) { in dlm_can_grant_new_lock()
101 if (!dlm_lock_compatible(tmplock->ml.type, lock->ml.type)) in dlm_can_grant_new_lock()
103 if (!dlm_lock_compatible(tmplock->ml.convert_type, in dlm_can_grant_new_lock()
104 lock->ml.type)) in dlm_can_grant_new_lock()
114 * taken: takes and drops res->spinlock
125 mlog(0, "type=%d\n", lock->ml.type); in dlmlock_master()
127 spin_lock(&res->spinlock); in dlmlock_master()
132 lock->ml.node != dlm->node_num) { in dlmlock_master()
134 spin_unlock(&res->spinlock); in dlmlock_master()
144 lock->lksb->status = DLM_NORMAL; in dlmlock_master()
147 list_add_tail(&lock->list, &res->granted); in dlmlock_master()
149 /* for the recovery lock, we can't allow the ast in dlmlock_master()
151 * frozen. but the recovery lock is always locked in dlmlock_master()
154 if (!dlm_is_recovery_lock(res->lockname.name, in dlmlock_master()
155 res->lockname.len)) { in dlmlock_master()
160 "node %u for reco lock\n", dlm->name, in dlmlock_master()
161 lock->ml.node); in dlmlock_master()
168 if (dlm_is_recovery_lock(res->lockname.name, in dlmlock_master()
169 res->lockname.len)) { in dlmlock_master()
171 "node %u for reco lock\n", dlm->name, in dlmlock_master()
172 lock->ml.node); in dlmlock_master()
177 list_add_tail(&lock->list, &res->blocked); in dlmlock_master()
182 spin_unlock(&res->spinlock); in dlmlock_master()
183 wake_up(&res->wq); in dlmlock_master()
202 list_del_init(&lock->list); in dlm_revert_pending_lock()
203 lock->lksb->flags &= ~DLM_LKSB_GET_LVB; in dlm_revert_pending_lock()
210 * taken: takes and drops res->spinlock
222 lock->ml.type, res->lockname.len, in dlmlock_remote()
223 res->lockname.name, flags); in dlmlock_remote()
229 spin_lock(&res->spinlock); in dlmlock_remote()
231 if (res->owner == dlm->node_num) { in dlmlock_remote()
232 spin_unlock(&res->spinlock); in dlmlock_remote()
235 res->state |= DLM_LOCK_RES_IN_PROGRESS; in dlmlock_remote()
239 list_add_tail(&lock->list, &res->blocked); in dlmlock_remote()
240 lock->lock_pending = 1; in dlmlock_remote()
241 spin_unlock(&res->spinlock); in dlmlock_remote()
247 spin_lock(&res->spinlock); in dlmlock_remote()
248 res->state &= ~DLM_LOCK_RES_IN_PROGRESS; in dlmlock_remote()
249 lock->lock_pending = 0; in dlmlock_remote()
252 dlm_is_recovery_lock(res->lockname.name, in dlmlock_remote()
253 res->lockname.len)) { in dlmlock_remote()
254 /* recovery lock was mastered by dead node. in dlmlock_remote()
257 mlog(0, "%s: recovery lock was owned by " in dlmlock_remote()
259 dlm->name, res->owner); in dlmlock_remote()
272 } else if (dlm_is_recovery_lock(res->lockname.name, in dlmlock_remote()
273 res->lockname.len)) { in dlmlock_remote()
274 /* special case for the $RECOVERY lock. in dlmlock_remote()
278 mlog(0, "%s: $RECOVERY lock for this node (%u) is " in dlmlock_remote()
280 dlm->name, dlm->node_num, res->owner); in dlmlock_remote()
281 list_move_tail(&lock->list, &res->granted); in dlmlock_remote()
283 spin_unlock(&res->spinlock); in dlmlock_remote()
288 wake_up(&res->wq); in dlmlock_remote()
295 * caller needs: none, but need res->state & DLM_LOCK_RES_IN_PROGRESS
309 create.node_idx = dlm->node_num; in dlm_send_remote_lock_request()
310 create.requested_type = lock->ml.type; in dlm_send_remote_lock_request()
311 create.cookie = lock->ml.cookie; in dlm_send_remote_lock_request()
312 create.namelen = res->lockname.len; in dlm_send_remote_lock_request()
314 memcpy(create.name, res->lockname.name, create.namelen); in dlm_send_remote_lock_request()
316 tmpret = o2net_send_message(DLM_CREATE_LOCK_MSG, dlm->key, &create, in dlm_send_remote_lock_request()
317 sizeof(create), res->owner, &status); in dlm_send_remote_lock_request()
323 "currently.\n", dlm->name, create.namelen, in dlm_send_remote_lock_request()
324 create.name, res->owner); in dlm_send_remote_lock_request()
330 "node %u\n", dlm->name, create.namelen, create.name, in dlm_send_remote_lock_request()
331 tmpret, res->owner); in dlm_send_remote_lock_request()
343 kref_get(&lock->lock_refs); in dlm_lock_get()
348 kref_put(&lock->lock_refs, dlm_lock_release); in dlm_lock_put()
357 BUG_ON(!list_empty(&lock->list)); in dlm_lock_release()
358 BUG_ON(!list_empty(&lock->ast_list)); in dlm_lock_release()
359 BUG_ON(!list_empty(&lock->bast_list)); in dlm_lock_release()
360 BUG_ON(lock->ast_pending); in dlm_lock_release()
361 BUG_ON(lock->bast_pending); in dlm_lock_release()
365 if (lock->lksb_kernel_allocated) { in dlm_lock_release()
366 mlog(0, "freeing kernel-allocated lksb\n"); in dlm_lock_release()
367 kfree(lock->lksb); in dlm_lock_release()
377 lock->lockres = res; in dlm_lock_attach_lockres()
385 res = lock->lockres; in dlm_lock_detach_lockres()
387 lock->lockres = NULL; in dlm_lock_detach_lockres()
396 INIT_LIST_HEAD(&newlock->list); in dlm_init_lock()
397 INIT_LIST_HEAD(&newlock->ast_list); in dlm_init_lock()
398 INIT_LIST_HEAD(&newlock->bast_list); in dlm_init_lock()
399 spin_lock_init(&newlock->spinlock); in dlm_init_lock()
400 newlock->ml.type = type; in dlm_init_lock()
401 newlock->ml.convert_type = LKM_IVMODE; in dlm_init_lock()
402 newlock->ml.highest_blocked = LKM_IVMODE; in dlm_init_lock()
403 newlock->ml.node = node; in dlm_init_lock()
404 newlock->ml.pad1 = 0; in dlm_init_lock()
405 newlock->ml.list = 0; in dlm_init_lock()
406 newlock->ml.flags = 0; in dlm_init_lock()
407 newlock->ast = NULL; in dlm_init_lock()
408 newlock->bast = NULL; in dlm_init_lock()
409 newlock->astdata = NULL; in dlm_init_lock()
410 newlock->ml.cookie = cpu_to_be64(cookie); in dlm_init_lock()
411 newlock->ast_pending = 0; in dlm_init_lock()
412 newlock->bast_pending = 0; in dlm_init_lock()
413 newlock->convert_pending = 0; in dlm_init_lock()
414 newlock->lock_pending = 0; in dlm_init_lock()
415 newlock->unlock_pending = 0; in dlm_init_lock()
416 newlock->cancel_pending = 0; in dlm_init_lock()
417 newlock->lksb_kernel_allocated = 0; in dlm_init_lock()
419 kref_init(&newlock->lock_refs); in dlm_init_lock()
433 /* zero memory only if kernel-allocated */ in dlm_new_lock()
444 lock->lksb_kernel_allocated = 1; in dlm_new_lock()
445 lock->lksb = lksb; in dlm_new_lock()
446 lksb->lockid = lock; in dlm_new_lock()
453 * taken: takes and drops res->spinlock
461 struct dlm_create_lock *create = (struct dlm_create_lock *)msg->buf; in dlm_create_lock_handler()
474 name = create->name; in dlm_create_lock_handler()
475 namelen = create->namelen; in dlm_create_lock_handler()
480 dlm->name, create->node_idx, namelen, name); in dlm_create_lock_handler()
492 newlock = dlm_new_lock(create->requested_type, in dlm_create_lock_handler()
493 create->node_idx, in dlm_create_lock_handler()
494 be64_to_cpu(create->cookie), NULL); in dlm_create_lock_handler()
500 lksb = newlock->lksb; in dlm_create_lock_handler()
502 if (be32_to_cpu(create->flags) & LKM_GET_LVB) { in dlm_create_lock_handler()
503 lksb->flags |= DLM_LKSB_GET_LVB; in dlm_create_lock_handler()
514 spin_lock(&res->spinlock); in dlm_create_lock_handler()
516 spin_unlock(&res->spinlock); in dlm_create_lock_handler()
519 mlog(0, "lockres recovering/migrating/in-progress\n"); in dlm_create_lock_handler()
525 status = dlmlock_master(dlm, res, newlock, be32_to_cpu(create->flags)); in dlm_create_lock_handler()
540 /* fetch next node-local (u8 nodenum + u56 cookie) into u64 */
557 enum dlm_status dlmlock(struct dlm_ctxt *dlm, int mode, in dlmlock() argument
565 int convert = 0, recovery = 0; in dlmlock() local
576 if (mode != LKM_EXMODE && mode != LKM_PRMODE && mode != LKM_NLMODE) { in dlmlock()
587 recovery = (flags & LKM_RECOVERY); in dlmlock()
589 if (recovery && in dlmlock()
603 lock = lksb->lockid; in dlmlock()
610 res = lock->lockres; in dlmlock()
623 if (lock->lksb != lksb || lock->ast != ast || in dlmlock()
624 lock->bast != bast || lock->astdata != data) { in dlmlock()
629 "astdata=%p\n", lock->lksb, lock->ast, in dlmlock()
630 lock->bast, lock->astdata); in dlmlock()
636 if (res->owner == dlm->node_num) in dlmlock()
637 status = dlmconvert_master(dlm, res, lock, flags, mode); in dlmlock()
639 status = dlmconvert_remote(dlm, res, lock, flags, mode); in dlmlock()
646 mlog(0, "retrying convert with migration/recovery/" in dlmlock()
647 "in-progress\n"); in dlmlock()
667 dlm_get_next_cookie(dlm->node_num, &tmpcookie); in dlmlock()
668 lock = dlm_new_lock(mode, dlm->node_num, tmpcookie, lksb); in dlmlock()
674 if (!recovery) in dlmlock()
685 mlog(0, "type=%d, flags = 0x%x\n", mode, flags); in dlmlock()
689 lock->ast = ast; in dlmlock()
690 lock->bast = bast; in dlmlock()
691 lock->astdata = data; in dlmlock()
699 if (mode < LKM_PRMODE) in dlmlock()
703 lock->lksb->flags |= DLM_LKSB_GET_LVB; in dlmlock()
707 if (res->owner == dlm->node_num) in dlmlock()
715 if (recovery) { in dlmlock()
721 dlm_wait_for_node_death(dlm, res->owner, in dlmlock()
730 spin_lock(&res->spinlock); in dlmlock()
732 spin_unlock(&res->spinlock); in dlmlock()
738 lock->lksb->flags &= ~DLM_LKSB_GET_LVB; in dlmlock()
750 lksb->status = status; in dlmlock()