Lines Matching refs:res

66 				struct dlm_lock_resource *res,
93 struct dlm_lock_resource *res,
102 static int dlm_do_master_request(struct dlm_lock_resource *res,
107 struct dlm_lock_resource *res,
111 struct dlm_lock_resource *res,
115 struct dlm_lock_resource *res,
122 struct dlm_lock_resource *res);
124 struct dlm_lock_resource *res);
126 struct dlm_lock_resource *res,
129 struct dlm_lock_resource *res);
268 struct dlm_lock_resource *res, in dlm_init_mle() argument
293 BUG_ON(!res); in dlm_init_mle()
294 mle->mleres = res; in dlm_init_mle()
295 memcpy(mle->mname, res->lockname.name, res->lockname.len); in dlm_init_mle()
296 mle->mnamelen = res->lockname.len; in dlm_init_mle()
297 mle->mnamehash = res->lockname.hash; in dlm_init_mle()
488 struct dlm_lock_resource *res; in dlm_lockres_release() local
491 res = container_of(kref, struct dlm_lock_resource, refs); in dlm_lockres_release()
492 dlm = res->dlm; in dlm_lockres_release()
496 BUG_ON(!res->lockname.name); in dlm_lockres_release()
498 mlog(0, "destroying lockres %.*s\n", res->lockname.len, in dlm_lockres_release()
499 res->lockname.name); in dlm_lockres_release()
503 if (!hlist_unhashed(&res->hash_node) || in dlm_lockres_release()
504 !list_empty(&res->granted) || in dlm_lockres_release()
505 !list_empty(&res->converting) || in dlm_lockres_release()
506 !list_empty(&res->blocked) || in dlm_lockres_release()
507 !list_empty(&res->dirty) || in dlm_lockres_release()
508 !list_empty(&res->recovering) || in dlm_lockres_release()
509 !list_empty(&res->purge)) { in dlm_lockres_release()
513 res->lockname.len, res->lockname.name, in dlm_lockres_release()
514 !hlist_unhashed(&res->hash_node) ? 'H' : ' ', in dlm_lockres_release()
515 !list_empty(&res->granted) ? 'G' : ' ', in dlm_lockres_release()
516 !list_empty(&res->converting) ? 'C' : ' ', in dlm_lockres_release()
517 !list_empty(&res->blocked) ? 'B' : ' ', in dlm_lockres_release()
518 !list_empty(&res->dirty) ? 'D' : ' ', in dlm_lockres_release()
519 !list_empty(&res->recovering) ? 'R' : ' ', in dlm_lockres_release()
520 !list_empty(&res->purge) ? 'P' : ' '); in dlm_lockres_release()
522 dlm_print_one_lock_resource(res); in dlm_lockres_release()
527 BUG_ON(!hlist_unhashed(&res->hash_node)); in dlm_lockres_release()
528 BUG_ON(!list_empty(&res->granted)); in dlm_lockres_release()
529 BUG_ON(!list_empty(&res->converting)); in dlm_lockres_release()
530 BUG_ON(!list_empty(&res->blocked)); in dlm_lockres_release()
531 BUG_ON(!list_empty(&res->dirty)); in dlm_lockres_release()
532 BUG_ON(!list_empty(&res->recovering)); in dlm_lockres_release()
533 BUG_ON(!list_empty(&res->purge)); in dlm_lockres_release()
535 kmem_cache_free(dlm_lockname_cache, (void *)res->lockname.name); in dlm_lockres_release()
537 kmem_cache_free(dlm_lockres_cache, res); in dlm_lockres_release()
540 void dlm_lockres_put(struct dlm_lock_resource *res) in dlm_lockres_put() argument
542 kref_put(&res->refs, dlm_lockres_release); in dlm_lockres_put()
546 struct dlm_lock_resource *res, in dlm_init_lockres() argument
555 qname = (char *) res->lockname.name; in dlm_init_lockres()
558 res->lockname.len = namelen; in dlm_init_lockres()
559 res->lockname.hash = dlm_lockid_hash(name, namelen); in dlm_init_lockres()
561 init_waitqueue_head(&res->wq); in dlm_init_lockres()
562 spin_lock_init(&res->spinlock); in dlm_init_lockres()
563 INIT_HLIST_NODE(&res->hash_node); in dlm_init_lockres()
564 INIT_LIST_HEAD(&res->granted); in dlm_init_lockres()
565 INIT_LIST_HEAD(&res->converting); in dlm_init_lockres()
566 INIT_LIST_HEAD(&res->blocked); in dlm_init_lockres()
567 INIT_LIST_HEAD(&res->dirty); in dlm_init_lockres()
568 INIT_LIST_HEAD(&res->recovering); in dlm_init_lockres()
569 INIT_LIST_HEAD(&res->purge); in dlm_init_lockres()
570 INIT_LIST_HEAD(&res->tracking); in dlm_init_lockres()
571 atomic_set(&res->asts_reserved, 0); in dlm_init_lockres()
572 res->migration_pending = 0; in dlm_init_lockres()
573 res->inflight_locks = 0; in dlm_init_lockres()
574 res->inflight_assert_workers = 0; in dlm_init_lockres()
576 res->dlm = dlm; in dlm_init_lockres()
578 kref_init(&res->refs); in dlm_init_lockres()
584 spin_lock(&res->spinlock); in dlm_init_lockres()
585 dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_init_lockres()
586 spin_unlock(&res->spinlock); in dlm_init_lockres()
588 res->state = DLM_LOCK_RES_IN_PROGRESS; in dlm_init_lockres()
590 res->last_used = 0; in dlm_init_lockres()
593 list_add_tail(&res->tracking, &dlm->tracking_list); in dlm_init_lockres()
596 memset(res->lvb, 0, DLM_LVB_LEN); in dlm_init_lockres()
597 memset(res->refmap, 0, sizeof(res->refmap)); in dlm_init_lockres()
604 struct dlm_lock_resource *res = NULL; in dlm_new_lockres() local
606 res = kmem_cache_zalloc(dlm_lockres_cache, GFP_NOFS); in dlm_new_lockres()
607 if (!res) in dlm_new_lockres()
610 res->lockname.name = kmem_cache_zalloc(dlm_lockname_cache, GFP_NOFS); in dlm_new_lockres()
611 if (!res->lockname.name) in dlm_new_lockres()
614 dlm_init_lockres(dlm, res, name, namelen); in dlm_new_lockres()
615 return res; in dlm_new_lockres()
618 if (res) in dlm_new_lockres()
619 kmem_cache_free(dlm_lockres_cache, res); in dlm_new_lockres()
624 struct dlm_lock_resource *res, int bit) in dlm_lockres_set_refmap_bit() argument
626 assert_spin_locked(&res->spinlock); in dlm_lockres_set_refmap_bit()
628 mlog(0, "res %.*s, set node %u, %ps()\n", res->lockname.len, in dlm_lockres_set_refmap_bit()
629 res->lockname.name, bit, __builtin_return_address(0)); in dlm_lockres_set_refmap_bit()
631 set_bit(bit, res->refmap); in dlm_lockres_set_refmap_bit()
635 struct dlm_lock_resource *res, int bit) in dlm_lockres_clear_refmap_bit() argument
637 assert_spin_locked(&res->spinlock); in dlm_lockres_clear_refmap_bit()
639 mlog(0, "res %.*s, clr node %u, %ps()\n", res->lockname.len, in dlm_lockres_clear_refmap_bit()
640 res->lockname.name, bit, __builtin_return_address(0)); in dlm_lockres_clear_refmap_bit()
642 clear_bit(bit, res->refmap); in dlm_lockres_clear_refmap_bit()
646 struct dlm_lock_resource *res) in __dlm_lockres_grab_inflight_ref() argument
648 res->inflight_locks++; in __dlm_lockres_grab_inflight_ref()
651 res->lockname.len, res->lockname.name, res->inflight_locks, in __dlm_lockres_grab_inflight_ref()
656 struct dlm_lock_resource *res) in dlm_lockres_grab_inflight_ref() argument
658 assert_spin_locked(&res->spinlock); in dlm_lockres_grab_inflight_ref()
659 __dlm_lockres_grab_inflight_ref(dlm, res); in dlm_lockres_grab_inflight_ref()
663 struct dlm_lock_resource *res) in dlm_lockres_drop_inflight_ref() argument
665 assert_spin_locked(&res->spinlock); in dlm_lockres_drop_inflight_ref()
667 BUG_ON(res->inflight_locks == 0); in dlm_lockres_drop_inflight_ref()
669 res->inflight_locks--; in dlm_lockres_drop_inflight_ref()
672 res->lockname.len, res->lockname.name, res->inflight_locks, in dlm_lockres_drop_inflight_ref()
675 wake_up(&res->wq); in dlm_lockres_drop_inflight_ref()
679 struct dlm_lock_resource *res) in __dlm_lockres_grab_inflight_worker() argument
681 assert_spin_locked(&res->spinlock); in __dlm_lockres_grab_inflight_worker()
682 res->inflight_assert_workers++; in __dlm_lockres_grab_inflight_worker()
684 dlm->name, res->lockname.len, res->lockname.name, in __dlm_lockres_grab_inflight_worker()
685 res->inflight_assert_workers); in __dlm_lockres_grab_inflight_worker()
689 struct dlm_lock_resource *res) in __dlm_lockres_drop_inflight_worker() argument
691 assert_spin_locked(&res->spinlock); in __dlm_lockres_drop_inflight_worker()
692 BUG_ON(res->inflight_assert_workers == 0); in __dlm_lockres_drop_inflight_worker()
693 res->inflight_assert_workers--; in __dlm_lockres_drop_inflight_worker()
695 dlm->name, res->lockname.len, res->lockname.name, in __dlm_lockres_drop_inflight_worker()
696 res->inflight_assert_workers); in __dlm_lockres_drop_inflight_worker()
700 struct dlm_lock_resource *res) in dlm_lockres_drop_inflight_worker() argument
702 spin_lock(&res->spinlock); in dlm_lockres_drop_inflight_worker()
703 __dlm_lockres_drop_inflight_worker(dlm, res); in dlm_lockres_drop_inflight_worker()
704 spin_unlock(&res->spinlock); in dlm_lockres_drop_inflight_worker()
728 struct dlm_lock_resource *tmpres=NULL, *res=NULL; in dlm_get_lock_resource() local
788 if (res) { in dlm_get_lock_resource()
790 if (!list_empty(&res->tracking)) in dlm_get_lock_resource()
791 list_del_init(&res->tracking); in dlm_get_lock_resource()
795 res->lockname.len, in dlm_get_lock_resource()
796 res->lockname.name); in dlm_get_lock_resource()
798 dlm_lockres_put(res); in dlm_get_lock_resource()
800 res = tmpres; in dlm_get_lock_resource()
804 if (!res) { in dlm_get_lock_resource()
811 res = dlm_new_lockres(dlm, lockid, namelen); in dlm_get_lock_resource()
812 if (!res) in dlm_get_lock_resource()
817 mlog(0, "no lockres found, allocated our own: %p\n", res); in dlm_get_lock_resource()
822 spin_lock(&res->spinlock); in dlm_get_lock_resource()
823 dlm_change_lockres_owner(dlm, res, dlm->node_num); in dlm_get_lock_resource()
824 __dlm_insert_lockres(dlm, res); in dlm_get_lock_resource()
825 dlm_lockres_grab_inflight_ref(dlm, res); in dlm_get_lock_resource()
826 spin_unlock(&res->spinlock); in dlm_get_lock_resource()
878 dlm_init_mle(mle, DLM_MLE_MASTER, dlm, res, NULL, 0); in dlm_get_lock_resource()
901 __dlm_insert_lockres(dlm, res); in dlm_get_lock_resource()
904 __dlm_lockres_grab_inflight_ref(dlm, res); in dlm_get_lock_resource()
922 if (!dlm_pre_master_reco_lockres(dlm, res)) in dlm_get_lock_resource()
958 ret = dlm_do_master_request(res, mle, nodenum); in dlm_get_lock_resource()
977 ret = dlm_wait_for_lock_mastery(dlm, res, mle, &blocked); in dlm_get_lock_resource()
981 "request now, blocked=%d\n", dlm->name, res->lockname.len, in dlm_get_lock_resource()
982 res->lockname.name, blocked); in dlm_get_lock_resource()
986 dlm->name, res->lockname.len, in dlm_get_lock_resource()
987 res->lockname.name, blocked); in dlm_get_lock_resource()
988 dlm_print_one_lock_resource(res); in dlm_get_lock_resource()
995 mlog(0, "%s: res %.*s, Mastered by %u\n", dlm->name, res->lockname.len, in dlm_get_lock_resource()
996 res->lockname.name, res->owner); in dlm_get_lock_resource()
998 BUG_ON(res->owner == O2NM_MAX_NODES); in dlm_get_lock_resource()
1007 spin_lock(&res->spinlock); in dlm_get_lock_resource()
1008 res->state &= ~DLM_LOCK_RES_IN_PROGRESS; in dlm_get_lock_resource()
1009 spin_unlock(&res->spinlock); in dlm_get_lock_resource()
1010 wake_up(&res->wq); in dlm_get_lock_resource()
1017 return res; in dlm_get_lock_resource()
1024 struct dlm_lock_resource *res, in dlm_wait_for_lock_mastery() argument
1038 spin_lock(&res->spinlock); in dlm_wait_for_lock_mastery()
1039 if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_wait_for_lock_mastery()
1041 res->lockname.len, res->lockname.name, res->owner); in dlm_wait_for_lock_mastery()
1042 spin_unlock(&res->spinlock); in dlm_wait_for_lock_mastery()
1045 if (res->owner != dlm->node_num) { in dlm_wait_for_lock_mastery()
1046 ret = dlm_do_master_request(res, mle, res->owner); in dlm_wait_for_lock_mastery()
1049 mlog(ML_ERROR, "link to %u went down?: %d\n", res->owner, ret); in dlm_wait_for_lock_mastery()
1057 spin_unlock(&res->spinlock); in dlm_wait_for_lock_mastery()
1070 dlm->name, res->lockname.len, res->lockname.name); in dlm_wait_for_lock_mastery()
1071 ret = dlm_restart_lock_mastery(dlm, res, mle, *blocked); in dlm_wait_for_lock_mastery()
1075 dlm->name, res->lockname.len, res->lockname.name, in dlm_wait_for_lock_mastery()
1085 "rechecking now\n", dlm->name, res->lockname.len, in dlm_wait_for_lock_mastery()
1086 res->lockname.name); in dlm_wait_for_lock_mastery()
1091 "for %s:%.*s\n", dlm->name, res->lockname.len, in dlm_wait_for_lock_mastery()
1092 res->lockname.name); in dlm_wait_for_lock_mastery()
1136 if (res->owner == O2NM_MAX_NODES) { in dlm_wait_for_lock_mastery()
1138 res->lockname.len, res->lockname.name); in dlm_wait_for_lock_mastery()
1141 mlog(0, "done waiting, master is %u\n", res->owner); in dlm_wait_for_lock_mastery()
1150 res->lockname.len, res->lockname.name, m); in dlm_wait_for_lock_mastery()
1151 ret = dlm_do_assert_master(dlm, res, mle->vote_map, 0); in dlm_wait_for_lock_mastery()
1166 spin_lock(&res->spinlock); in dlm_wait_for_lock_mastery()
1169 dlm_change_lockres_owner(dlm, res, m); in dlm_wait_for_lock_mastery()
1170 spin_unlock(&res->spinlock); in dlm_wait_for_lock_mastery()
1236 struct dlm_lock_resource *res, in dlm_restart_lock_mastery() argument
1283 res->lockname.len, in dlm_restart_lock_mastery()
1284 res->lockname.name, in dlm_restart_lock_mastery()
1299 res->lockname.len, in dlm_restart_lock_mastery()
1300 res->lockname.name); in dlm_restart_lock_mastery()
1302 mle->mleres = res; in dlm_restart_lock_mastery()
1335 static int dlm_do_master_request(struct dlm_lock_resource *res, in dlm_do_master_request() argument
1387 "reference\n", dlm->name, res->lockname.len, in dlm_do_master_request()
1388 res->lockname.name, to); in dlm_do_master_request()
1434 struct dlm_lock_resource *res = NULL; in dlm_master_request_handler() local
1463 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_master_request_handler()
1464 if (res) { in dlm_master_request_handler()
1468 spin_lock(&res->spinlock); in dlm_master_request_handler()
1475 if (hlist_unhashed(&res->hash_node)) { in dlm_master_request_handler()
1476 spin_unlock(&res->spinlock); in dlm_master_request_handler()
1477 dlm_lockres_put(res); in dlm_master_request_handler()
1481 if (res->state & (DLM_LOCK_RES_RECOVERING| in dlm_master_request_handler()
1483 spin_unlock(&res->spinlock); in dlm_master_request_handler()
1492 if (res->owner == dlm->node_num) { in dlm_master_request_handler()
1493 dlm_lockres_set_refmap_bit(dlm, res, request->node_idx); in dlm_master_request_handler()
1494 spin_unlock(&res->spinlock); in dlm_master_request_handler()
1507 } else if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_master_request_handler()
1508 spin_unlock(&res->spinlock); in dlm_master_request_handler()
1519 if (!(res->state & DLM_LOCK_RES_IN_PROGRESS)) { in dlm_master_request_handler()
1558 dlm_lockres_set_refmap_bit(dlm, res, in dlm_master_request_handler()
1572 spin_unlock(&res->spinlock); in dlm_master_request_handler()
1649 if (!res) { in dlm_master_request_handler()
1654 dlm->node_num, res->lockname.len, res->lockname.name); in dlm_master_request_handler()
1655 spin_lock(&res->spinlock); in dlm_master_request_handler()
1656 ret = dlm_dispatch_assert_master(dlm, res, 0, request->node_idx, in dlm_master_request_handler()
1661 spin_unlock(&res->spinlock); in dlm_master_request_handler()
1662 dlm_lockres_put(res); in dlm_master_request_handler()
1665 __dlm_lockres_grab_inflight_worker(dlm, res); in dlm_master_request_handler()
1666 spin_unlock(&res->spinlock); in dlm_master_request_handler()
1669 if (res) in dlm_master_request_handler()
1670 dlm_lockres_put(res); in dlm_master_request_handler()
1689 struct dlm_lock_resource *res, in dlm_do_assert_master() argument
1697 const char *lockname = res->lockname.name; in dlm_do_assert_master()
1698 unsigned int namelen = res->lockname.len; in dlm_do_assert_master()
1702 spin_lock(&res->spinlock); in dlm_do_assert_master()
1703 res->state |= DLM_LOCK_RES_SETREF_INPROG; in dlm_do_assert_master()
1704 spin_unlock(&res->spinlock); in dlm_do_assert_master()
1771 spin_lock(&res->spinlock); in dlm_do_assert_master()
1772 dlm_lockres_set_refmap_bit(dlm, res, to); in dlm_do_assert_master()
1773 spin_unlock(&res->spinlock); in dlm_do_assert_master()
1780 spin_lock(&res->spinlock); in dlm_do_assert_master()
1781 res->state &= ~DLM_LOCK_RES_SETREF_INPROG; in dlm_do_assert_master()
1782 spin_unlock(&res->spinlock); in dlm_do_assert_master()
1783 wake_up(&res->wq); in dlm_do_assert_master()
1803 struct dlm_lock_resource *res = NULL; in dlm_assert_master_handler() local
1881 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_assert_master_handler()
1882 if (res) { in dlm_assert_master_handler()
1883 spin_lock(&res->spinlock); in dlm_assert_master_handler()
1884 if (res->state & DLM_LOCK_RES_RECOVERING) { in dlm_assert_master_handler()
1890 if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN && in dlm_assert_master_handler()
1891 res->owner != assert->node_idx) { in dlm_assert_master_handler()
1894 assert->node_idx, res->owner, namelen, in dlm_assert_master_handler()
1896 __dlm_print_one_lock_resource(res); in dlm_assert_master_handler()
1900 if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_assert_master_handler()
1902 if (res->owner == assert->node_idx) { in dlm_assert_master_handler()
1911 res->owner, namelen, name); in dlm_assert_master_handler()
1914 if (!(res->state & DLM_LOCK_RES_IN_PROGRESS)) { in dlm_assert_master_handler()
1935 spin_unlock(&res->spinlock); in dlm_assert_master_handler()
1965 if (res) { in dlm_assert_master_handler()
1967 spin_lock(&res->spinlock); in dlm_assert_master_handler()
1971 res->lockname.len, res->lockname.name, in dlm_assert_master_handler()
1973 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_assert_master_handler()
1975 dlm_change_lockres_owner(dlm, res, mle->new_master); in dlm_assert_master_handler()
1976 BUG_ON(res->state & DLM_LOCK_RES_DIRTY); in dlm_assert_master_handler()
1978 dlm_change_lockres_owner(dlm, res, mle->master); in dlm_assert_master_handler()
1980 spin_unlock(&res->spinlock); in dlm_assert_master_handler()
1983 wake_up(&res->wq); in dlm_assert_master_handler()
2021 } else if (res) { in dlm_assert_master_handler()
2022 if (res->owner != assert->node_idx) { in dlm_assert_master_handler()
2025 res->owner, namelen, name); in dlm_assert_master_handler()
2032 if (res) { in dlm_assert_master_handler()
2033 spin_lock(&res->spinlock); in dlm_assert_master_handler()
2034 res->state |= DLM_LOCK_RES_SETREF_INPROG; in dlm_assert_master_handler()
2035 spin_unlock(&res->spinlock); in dlm_assert_master_handler()
2036 *ret_data = (void *)res; in dlm_assert_master_handler()
2061 __dlm_print_one_lock_resource(res); in dlm_assert_master_handler()
2062 spin_unlock(&res->spinlock); in dlm_assert_master_handler()
2068 *ret_data = (void *)res; in dlm_assert_master_handler()
2075 struct dlm_lock_resource *res = (struct dlm_lock_resource *)ret_data; in dlm_assert_master_post_handler() local
2078 spin_lock(&res->spinlock); in dlm_assert_master_post_handler()
2079 res->state &= ~DLM_LOCK_RES_SETREF_INPROG; in dlm_assert_master_post_handler()
2080 spin_unlock(&res->spinlock); in dlm_assert_master_post_handler()
2081 wake_up(&res->wq); in dlm_assert_master_post_handler()
2082 dlm_lockres_put(res); in dlm_assert_master_post_handler()
2088 struct dlm_lock_resource *res, in dlm_dispatch_assert_master() argument
2099 item->u.am.lockres = res; /* already have a ref */ in dlm_dispatch_assert_master()
2106 mlog(0, "IGNORE HIGHER: %.*s\n", res->lockname.len, in dlm_dispatch_assert_master()
2107 res->lockname.name); in dlm_dispatch_assert_master()
2121 struct dlm_lock_resource *res; in dlm_assert_master_worker() local
2129 res = item->u.am.lockres; in dlm_assert_master_worker()
2160 spin_lock(&res->spinlock); in dlm_assert_master_worker()
2161 if (res->state & DLM_LOCK_RES_MIGRATING) { in dlm_assert_master_worker()
2165 spin_unlock(&res->spinlock); in dlm_assert_master_worker()
2168 __dlm_lockres_reserve_ast(res); in dlm_assert_master_worker()
2169 spin_unlock(&res->spinlock); in dlm_assert_master_worker()
2174 res->lockname.len, res->lockname.name, dlm->node_num); in dlm_assert_master_worker()
2175 ret = dlm_do_assert_master(dlm, res, nodemap, flags); in dlm_assert_master_worker()
2183 dlm_lockres_release_ast(dlm, res); in dlm_assert_master_worker()
2186 dlm_lockres_drop_inflight_worker(dlm, res); in dlm_assert_master_worker()
2188 dlm_lockres_put(res); in dlm_assert_master_worker()
2204 struct dlm_lock_resource *res) in dlm_pre_master_reco_lockres() argument
2219 ret = dlm_do_master_requery(dlm, res, nodenum, &master); in dlm_pre_master_reco_lockres()
2253 int dlm_drop_lockres_ref(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_drop_lockres_ref() argument
2260 lockname = res->lockname.name; in dlm_drop_lockres_ref()
2261 namelen = res->lockname.len; in dlm_drop_lockres_ref()
2270 &deref, sizeof(deref), res->owner, &r); in dlm_drop_lockres_ref()
2273 dlm->name, namelen, lockname, ret, res->owner); in dlm_drop_lockres_ref()
2277 dlm->name, namelen, lockname, res->owner, r); in dlm_drop_lockres_ref()
2278 dlm_print_one_lock_resource(res); in dlm_drop_lockres_ref()
2289 struct dlm_lock_resource *res = NULL; in dlm_deref_lockres_handler() local
2318 res = __dlm_lookup_lockres_full(dlm, name, namelen, hash); in dlm_deref_lockres_handler()
2319 if (!res) { in dlm_deref_lockres_handler()
2327 spin_lock(&res->spinlock); in dlm_deref_lockres_handler()
2328 if (res->state & DLM_LOCK_RES_SETREF_INPROG) in dlm_deref_lockres_handler()
2331 BUG_ON(res->state & DLM_LOCK_RES_DROPPING_REF); in dlm_deref_lockres_handler()
2332 if (test_bit(node, res->refmap)) { in dlm_deref_lockres_handler()
2333 dlm_lockres_clear_refmap_bit(dlm, res, node); in dlm_deref_lockres_handler()
2337 spin_unlock(&res->spinlock); in dlm_deref_lockres_handler()
2341 dlm_lockres_calc_usage(dlm, res); in dlm_deref_lockres_handler()
2345 res->lockname.len, res->lockname.name, node); in dlm_deref_lockres_handler()
2346 dlm_print_one_lock_resource(res); in dlm_deref_lockres_handler()
2360 item->u.dl.deref_res = res; in dlm_deref_lockres_handler()
2371 if (res) in dlm_deref_lockres_handler()
2372 dlm_lockres_put(res); in dlm_deref_lockres_handler()
2381 struct dlm_lock_resource *res; in dlm_deref_lockres_worker() local
2386 res = item->u.dl.deref_res; in dlm_deref_lockres_worker()
2389 spin_lock(&res->spinlock); in dlm_deref_lockres_worker()
2390 BUG_ON(res->state & DLM_LOCK_RES_DROPPING_REF); in dlm_deref_lockres_worker()
2391 if (test_bit(node, res->refmap)) { in dlm_deref_lockres_worker()
2392 __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG); in dlm_deref_lockres_worker()
2393 dlm_lockres_clear_refmap_bit(dlm, res, node); in dlm_deref_lockres_worker()
2396 spin_unlock(&res->spinlock); in dlm_deref_lockres_worker()
2400 dlm->name, res->lockname.len, res->lockname.name, node); in dlm_deref_lockres_worker()
2401 dlm_lockres_calc_usage(dlm, res); in dlm_deref_lockres_worker()
2405 res->lockname.len, res->lockname.name, node); in dlm_deref_lockres_worker()
2406 dlm_print_one_lock_resource(res); in dlm_deref_lockres_worker()
2409 dlm_lockres_put(res); in dlm_deref_lockres_worker()
2420 struct dlm_lock_resource *res) in dlm_is_lockres_migrateable() argument
2428 assert_spin_locked(&res->spinlock); in dlm_is_lockres_migrateable()
2431 if (res->state & DLM_LOCK_RES_MIGRATING) in dlm_is_lockres_migrateable()
2435 if (res->state & DLM_LOCK_RES_RECOVERING) in dlm_is_lockres_migrateable()
2438 if (res->owner != dlm->node_num) in dlm_is_lockres_migrateable()
2442 queue = dlm_list_idx_to_ptr(res, idx); in dlm_is_lockres_migrateable()
2450 "%s list\n", dlm->name, res->lockname.len, in dlm_is_lockres_migrateable()
2451 res->lockname.name, in dlm_is_lockres_migrateable()
2460 node_ref = find_next_bit(res->refmap, O2NM_MAX_NODES, 0); in dlm_is_lockres_migrateable()
2465 mlog(0, "%s: res %.*s, Migrateable\n", dlm->name, res->lockname.len, in dlm_is_lockres_migrateable()
2466 res->lockname.name); in dlm_is_lockres_migrateable()
2477 struct dlm_lock_resource *res, u8 target) in dlm_migrate_lockres() argument
2493 name = res->lockname.name; in dlm_migrate_lockres()
2494 namelen = res->lockname.len; in dlm_migrate_lockres()
2520 ret = dlm_add_migration_mle(dlm, res, mle, &oldmle, name, in dlm_migrate_lockres()
2540 if (dlm_mark_lockres_migrating(dlm, res, target) < 0) { in dlm_migrate_lockres()
2542 "the target went down.\n", res->lockname.len, in dlm_migrate_lockres()
2543 res->lockname.name, target); in dlm_migrate_lockres()
2544 spin_lock(&res->spinlock); in dlm_migrate_lockres()
2545 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_migrate_lockres()
2547 spin_unlock(&res->spinlock); in dlm_migrate_lockres()
2584 ret = dlm_send_one_lockres(dlm, res, mres, target, in dlm_migrate_lockres()
2594 spin_lock(&res->spinlock); in dlm_migrate_lockres()
2595 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_migrate_lockres()
2597 spin_unlock(&res->spinlock); in dlm_migrate_lockres()
2623 res->owner == target) in dlm_migrate_lockres()
2627 dlm->name, res->lockname.len, res->lockname.name); in dlm_migrate_lockres()
2633 dlm->name, res->lockname.len, in dlm_migrate_lockres()
2634 res->lockname.name, target); in dlm_migrate_lockres()
2640 spin_lock(&res->spinlock); in dlm_migrate_lockres()
2641 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_migrate_lockres()
2643 spin_unlock(&res->spinlock); in dlm_migrate_lockres()
2648 dlm->name, res->lockname.len, res->lockname.name); in dlm_migrate_lockres()
2652 spin_lock(&res->spinlock); in dlm_migrate_lockres()
2653 dlm_set_lockres_owner(dlm, res, target); in dlm_migrate_lockres()
2654 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_migrate_lockres()
2655 dlm_remove_nonlocal_locks(dlm, res); in dlm_migrate_lockres()
2656 spin_unlock(&res->spinlock); in dlm_migrate_lockres()
2657 wake_up(&res->wq); in dlm_migrate_lockres()
2664 dlm_lockres_calc_usage(dlm, res); in dlm_migrate_lockres()
2669 dlm_kick_thread(dlm, res); in dlm_migrate_lockres()
2674 wake_up(&res->wq); in dlm_migrate_lockres()
2698 int dlm_empty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_empty_lockres() argument
2706 spin_lock(&res->spinlock); in dlm_empty_lockres()
2707 if (dlm_is_lockres_migrateable(dlm, res)) in dlm_empty_lockres()
2708 target = dlm_pick_migration_target(dlm, res); in dlm_empty_lockres()
2709 spin_unlock(&res->spinlock); in dlm_empty_lockres()
2717 ret = dlm_migrate_lockres(dlm, res, target); in dlm_empty_lockres()
2720 dlm->name, res->lockname.len, res->lockname.name, in dlm_empty_lockres()
2739 struct dlm_lock_resource *res, in dlm_migration_can_proceed() argument
2743 spin_lock(&res->spinlock); in dlm_migration_can_proceed()
2744 can_proceed = !!(res->state & DLM_LOCK_RES_MIGRATING); in dlm_migration_can_proceed()
2745 spin_unlock(&res->spinlock); in dlm_migration_can_proceed()
2757 struct dlm_lock_resource *res) in dlm_lockres_is_dirty() argument
2760 spin_lock(&res->spinlock); in dlm_lockres_is_dirty()
2761 ret = !!(res->state & DLM_LOCK_RES_DIRTY); in dlm_lockres_is_dirty()
2762 spin_unlock(&res->spinlock); in dlm_lockres_is_dirty()
2768 struct dlm_lock_resource *res, in dlm_mark_lockres_migrating() argument
2774 res->lockname.len, res->lockname.name, dlm->node_num, in dlm_mark_lockres_migrating()
2778 spin_lock(&res->spinlock); in dlm_mark_lockres_migrating()
2779 BUG_ON(res->migration_pending); in dlm_mark_lockres_migrating()
2780 res->migration_pending = 1; in dlm_mark_lockres_migrating()
2783 __dlm_lockres_reserve_ast(res); in dlm_mark_lockres_migrating()
2784 spin_unlock(&res->spinlock); in dlm_mark_lockres_migrating()
2787 dlm_kick_thread(dlm, res); in dlm_mark_lockres_migrating()
2790 spin_lock(&res->spinlock); in dlm_mark_lockres_migrating()
2791 BUG_ON(res->state & DLM_LOCK_RES_BLOCK_DIRTY); in dlm_mark_lockres_migrating()
2792 res->state |= DLM_LOCK_RES_BLOCK_DIRTY; in dlm_mark_lockres_migrating()
2793 spin_unlock(&res->spinlock); in dlm_mark_lockres_migrating()
2795 wait_event(dlm->ast_wq, !dlm_lockres_is_dirty(dlm, res)); in dlm_mark_lockres_migrating()
2796 dlm_lockres_release_ast(dlm, res); in dlm_mark_lockres_migrating()
2799 res->state & DLM_LOCK_RES_DIRTY ? "yes" : "no"); in dlm_mark_lockres_migrating()
2805 dlm_migration_can_proceed(dlm, res, target), in dlm_mark_lockres_migrating()
2809 res->state & DLM_LOCK_RES_MIGRATING ? "yes":"no", in dlm_mark_lockres_migrating()
2813 res->state & DLM_LOCK_RES_MIGRATING ? "yes":"no", in dlm_mark_lockres_migrating()
2816 if (!dlm_migration_can_proceed(dlm, res, target)) { in dlm_mark_lockres_migrating()
2836 spin_lock(&res->spinlock); in dlm_mark_lockres_migrating()
2837 BUG_ON(!(res->state & DLM_LOCK_RES_BLOCK_DIRTY)); in dlm_mark_lockres_migrating()
2838 res->state &= ~DLM_LOCK_RES_BLOCK_DIRTY; in dlm_mark_lockres_migrating()
2840 BUG_ON(!(res->state & DLM_LOCK_RES_MIGRATING)); in dlm_mark_lockres_migrating()
2842 res->migration_pending = 0; in dlm_mark_lockres_migrating()
2843 spin_unlock(&res->spinlock); in dlm_mark_lockres_migrating()
2860 struct dlm_lock_resource *res) in dlm_remove_nonlocal_locks() argument
2862 struct list_head *queue = &res->granted; in dlm_remove_nonlocal_locks()
2866 assert_spin_locked(&res->spinlock); in dlm_remove_nonlocal_locks()
2868 BUG_ON(res->owner == dlm->node_num); in dlm_remove_nonlocal_locks()
2880 dlm_lockres_clear_refmap_bit(dlm, res, in dlm_remove_nonlocal_locks()
2893 bit = find_next_bit(res->refmap, O2NM_MAX_NODES, bit); in dlm_remove_nonlocal_locks()
2901 res->lockname.len, res->lockname.name, bit); in dlm_remove_nonlocal_locks()
2902 dlm_lockres_clear_refmap_bit(dlm, res, bit); in dlm_remove_nonlocal_locks()
2914 struct dlm_lock_resource *res) in dlm_pick_migration_target() argument
2917 struct list_head *queue = &res->granted; in dlm_pick_migration_target()
2923 assert_spin_locked(&res->spinlock); in dlm_pick_migration_target()
2927 queue = dlm_list_idx_to_ptr(res, idx); in dlm_pick_migration_target()
2941 noderef = find_next_bit(res->refmap, O2NM_MAX_NODES, in dlm_pick_migration_target()
2960 struct dlm_lock_resource *res, in dlm_do_migrate_request() argument
2969 migrate.namelen = res->lockname.len; in dlm_do_migrate_request()
2970 memcpy(migrate.name, res->lockname.name, migrate.namelen); in dlm_do_migrate_request()
3013 dlm->name, res->lockname.len, res->lockname.name, in dlm_do_migrate_request()
3015 spin_lock(&res->spinlock); in dlm_do_migrate_request()
3016 dlm_lockres_set_refmap_bit(dlm, res, nodenum); in dlm_do_migrate_request()
3017 spin_unlock(&res->spinlock); in dlm_do_migrate_request()
3040 struct dlm_lock_resource *res = NULL; in dlm_migrate_request_handler() local
3064 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_migrate_request_handler()
3065 if (res) { in dlm_migrate_request_handler()
3066 spin_lock(&res->spinlock); in dlm_migrate_request_handler()
3067 if (res->state & DLM_LOCK_RES_RECOVERING) { in dlm_migrate_request_handler()
3071 spin_unlock(&res->spinlock); in dlm_migrate_request_handler()
3078 res->state |= DLM_LOCK_RES_MIGRATING; in dlm_migrate_request_handler()
3079 spin_unlock(&res->spinlock); in dlm_migrate_request_handler()
3084 ret = dlm_add_migration_mle(dlm, res, mle, &oldmle, in dlm_migrate_request_handler()
3099 if (res) in dlm_migrate_request_handler()
3100 dlm_lockres_put(res); in dlm_migrate_request_handler()
3114 struct dlm_lock_resource *res, in dlm_add_migration_mle() argument
3173 dlm_init_mle(mle, DLM_MLE_MIGRATION, dlm, res, name, namelen); in dlm_add_migration_mle()
3191 struct dlm_lock_resource *res; in dlm_reset_mleres_owner() local
3194 res = __dlm_lookup_lockres(dlm, mle->mname, mle->mnamelen, in dlm_reset_mleres_owner()
3196 if (res) { in dlm_reset_mleres_owner()
3200 spin_lock(&res->spinlock); in dlm_reset_mleres_owner()
3201 dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_reset_mleres_owner()
3202 dlm_move_lockres_to_recovery_list(dlm, res); in dlm_reset_mleres_owner()
3203 spin_unlock(&res->spinlock); in dlm_reset_mleres_owner()
3204 dlm_lockres_put(res); in dlm_reset_mleres_owner()
3215 return res; in dlm_reset_mleres_owner()
3263 struct dlm_lock_resource *res; in dlm_clean_master_list() local
3332 res = dlm_reset_mleres_owner(dlm, mle); in dlm_clean_master_list()
3333 if (res) in dlm_clean_master_list()
3344 int dlm_finish_migration(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, in dlm_finish_migration() argument
3359 spin_lock(&res->spinlock); in dlm_finish_migration()
3360 dlm_lockres_set_refmap_bit(dlm, res, old_master); in dlm_finish_migration()
3361 spin_unlock(&res->spinlock); in dlm_finish_migration()
3364 ret = dlm_do_migrate_request(dlm, res, old_master, in dlm_finish_migration()
3372 res->lockname.len, res->lockname.name); in dlm_finish_migration()
3375 ret = dlm_do_assert_master(dlm, res, iter.node_map, in dlm_finish_migration()
3386 res->lockname.len, res->lockname.name, old_master); in dlm_finish_migration()
3387 ret = dlm_do_assert_master(dlm, res, iter.node_map, in dlm_finish_migration()
3398 spin_lock(&res->spinlock); in dlm_finish_migration()
3399 dlm_set_lockres_owner(dlm, res, dlm->node_num); in dlm_finish_migration()
3400 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_finish_migration()
3401 spin_unlock(&res->spinlock); in dlm_finish_migration()
3403 dlm_kick_thread(dlm, res); in dlm_finish_migration()
3404 wake_up(&res->wq); in dlm_finish_migration()
3418 void __dlm_lockres_reserve_ast(struct dlm_lock_resource *res) in __dlm_lockres_reserve_ast() argument
3420 assert_spin_locked(&res->spinlock); in __dlm_lockres_reserve_ast()
3421 if (res->state & DLM_LOCK_RES_MIGRATING) { in __dlm_lockres_reserve_ast()
3422 __dlm_print_one_lock_resource(res); in __dlm_lockres_reserve_ast()
3424 BUG_ON(res->state & DLM_LOCK_RES_MIGRATING); in __dlm_lockres_reserve_ast()
3426 atomic_inc(&res->asts_reserved); in __dlm_lockres_reserve_ast()
3443 struct dlm_lock_resource *res) in dlm_lockres_release_ast() argument
3445 if (!atomic_dec_and_lock(&res->asts_reserved, &res->spinlock)) in dlm_lockres_release_ast()
3448 if (!res->migration_pending) { in dlm_lockres_release_ast()
3449 spin_unlock(&res->spinlock); in dlm_lockres_release_ast()
3453 BUG_ON(res->state & DLM_LOCK_RES_MIGRATING); in dlm_lockres_release_ast()
3454 res->migration_pending = 0; in dlm_lockres_release_ast()
3455 res->state |= DLM_LOCK_RES_MIGRATING; in dlm_lockres_release_ast()
3456 spin_unlock(&res->spinlock); in dlm_lockres_release_ast()
3457 wake_up(&res->wq); in dlm_lockres_release_ast()