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()
502 if (!list_empty(&res->tracking)) in dlm_lockres_release()
503 list_del_init(&res->tracking); in dlm_lockres_release()
506 res->lockname.len, res->lockname.name); in dlm_lockres_release()
507 dlm_print_one_lock_resource(res); in dlm_lockres_release()
513 if (!hlist_unhashed(&res->hash_node) || in dlm_lockres_release()
514 !list_empty(&res->granted) || in dlm_lockres_release()
515 !list_empty(&res->converting) || in dlm_lockres_release()
516 !list_empty(&res->blocked) || in dlm_lockres_release()
517 !list_empty(&res->dirty) || in dlm_lockres_release()
518 !list_empty(&res->recovering) || in dlm_lockres_release()
519 !list_empty(&res->purge)) { in dlm_lockres_release()
523 res->lockname.len, res->lockname.name, in dlm_lockres_release()
524 !hlist_unhashed(&res->hash_node) ? 'H' : ' ', in dlm_lockres_release()
525 !list_empty(&res->granted) ? 'G' : ' ', in dlm_lockres_release()
526 !list_empty(&res->converting) ? 'C' : ' ', in dlm_lockres_release()
527 !list_empty(&res->blocked) ? 'B' : ' ', in dlm_lockres_release()
528 !list_empty(&res->dirty) ? 'D' : ' ', in dlm_lockres_release()
529 !list_empty(&res->recovering) ? 'R' : ' ', in dlm_lockres_release()
530 !list_empty(&res->purge) ? 'P' : ' '); in dlm_lockres_release()
532 dlm_print_one_lock_resource(res); in dlm_lockres_release()
537 BUG_ON(!hlist_unhashed(&res->hash_node)); in dlm_lockres_release()
538 BUG_ON(!list_empty(&res->granted)); in dlm_lockres_release()
539 BUG_ON(!list_empty(&res->converting)); in dlm_lockres_release()
540 BUG_ON(!list_empty(&res->blocked)); in dlm_lockres_release()
541 BUG_ON(!list_empty(&res->dirty)); in dlm_lockres_release()
542 BUG_ON(!list_empty(&res->recovering)); in dlm_lockres_release()
543 BUG_ON(!list_empty(&res->purge)); in dlm_lockres_release()
545 kmem_cache_free(dlm_lockname_cache, (void *)res->lockname.name); in dlm_lockres_release()
547 kmem_cache_free(dlm_lockres_cache, res); in dlm_lockres_release()
550 void dlm_lockres_put(struct dlm_lock_resource *res) in dlm_lockres_put() argument
552 kref_put(&res->refs, dlm_lockres_release); in dlm_lockres_put()
556 struct dlm_lock_resource *res, in dlm_init_lockres() argument
565 qname = (char *) res->lockname.name; in dlm_init_lockres()
568 res->lockname.len = namelen; in dlm_init_lockres()
569 res->lockname.hash = dlm_lockid_hash(name, namelen); in dlm_init_lockres()
571 init_waitqueue_head(&res->wq); in dlm_init_lockres()
572 spin_lock_init(&res->spinlock); in dlm_init_lockres()
573 INIT_HLIST_NODE(&res->hash_node); in dlm_init_lockres()
574 INIT_LIST_HEAD(&res->granted); in dlm_init_lockres()
575 INIT_LIST_HEAD(&res->converting); in dlm_init_lockres()
576 INIT_LIST_HEAD(&res->blocked); in dlm_init_lockres()
577 INIT_LIST_HEAD(&res->dirty); in dlm_init_lockres()
578 INIT_LIST_HEAD(&res->recovering); in dlm_init_lockres()
579 INIT_LIST_HEAD(&res->purge); in dlm_init_lockres()
580 INIT_LIST_HEAD(&res->tracking); in dlm_init_lockres()
581 atomic_set(&res->asts_reserved, 0); in dlm_init_lockres()
582 res->migration_pending = 0; in dlm_init_lockres()
583 res->inflight_locks = 0; in dlm_init_lockres()
584 res->inflight_assert_workers = 0; in dlm_init_lockres()
586 res->dlm = dlm; in dlm_init_lockres()
588 kref_init(&res->refs); in dlm_init_lockres()
594 spin_lock(&res->spinlock); in dlm_init_lockres()
595 dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_init_lockres()
596 spin_unlock(&res->spinlock); in dlm_init_lockres()
598 res->state = DLM_LOCK_RES_IN_PROGRESS; in dlm_init_lockres()
600 res->last_used = 0; in dlm_init_lockres()
603 list_add_tail(&res->tracking, &dlm->tracking_list); in dlm_init_lockres()
606 memset(res->lvb, 0, DLM_LVB_LEN); in dlm_init_lockres()
607 memset(res->refmap, 0, sizeof(res->refmap)); in dlm_init_lockres()
614 struct dlm_lock_resource *res = NULL; in dlm_new_lockres() local
616 res = kmem_cache_zalloc(dlm_lockres_cache, GFP_NOFS); in dlm_new_lockres()
617 if (!res) in dlm_new_lockres()
620 res->lockname.name = kmem_cache_zalloc(dlm_lockname_cache, GFP_NOFS); in dlm_new_lockres()
621 if (!res->lockname.name) in dlm_new_lockres()
624 dlm_init_lockres(dlm, res, name, namelen); in dlm_new_lockres()
625 return res; in dlm_new_lockres()
628 if (res) in dlm_new_lockres()
629 kmem_cache_free(dlm_lockres_cache, res); in dlm_new_lockres()
634 struct dlm_lock_resource *res, int bit) in dlm_lockres_set_refmap_bit() argument
636 assert_spin_locked(&res->spinlock); in dlm_lockres_set_refmap_bit()
638 mlog(0, "res %.*s, set node %u, %ps()\n", res->lockname.len, in dlm_lockres_set_refmap_bit()
639 res->lockname.name, bit, __builtin_return_address(0)); in dlm_lockres_set_refmap_bit()
641 set_bit(bit, res->refmap); in dlm_lockres_set_refmap_bit()
645 struct dlm_lock_resource *res, int bit) in dlm_lockres_clear_refmap_bit() argument
647 assert_spin_locked(&res->spinlock); in dlm_lockres_clear_refmap_bit()
649 mlog(0, "res %.*s, clr node %u, %ps()\n", res->lockname.len, in dlm_lockres_clear_refmap_bit()
650 res->lockname.name, bit, __builtin_return_address(0)); in dlm_lockres_clear_refmap_bit()
652 clear_bit(bit, res->refmap); in dlm_lockres_clear_refmap_bit()
656 struct dlm_lock_resource *res) in __dlm_lockres_grab_inflight_ref() argument
658 res->inflight_locks++; in __dlm_lockres_grab_inflight_ref()
661 res->lockname.len, res->lockname.name, res->inflight_locks, in __dlm_lockres_grab_inflight_ref()
666 struct dlm_lock_resource *res) in dlm_lockres_grab_inflight_ref() argument
668 assert_spin_locked(&res->spinlock); in dlm_lockres_grab_inflight_ref()
669 __dlm_lockres_grab_inflight_ref(dlm, res); in dlm_lockres_grab_inflight_ref()
673 struct dlm_lock_resource *res) in dlm_lockres_drop_inflight_ref() argument
675 assert_spin_locked(&res->spinlock); in dlm_lockres_drop_inflight_ref()
677 BUG_ON(res->inflight_locks == 0); in dlm_lockres_drop_inflight_ref()
679 res->inflight_locks--; in dlm_lockres_drop_inflight_ref()
682 res->lockname.len, res->lockname.name, res->inflight_locks, in dlm_lockres_drop_inflight_ref()
685 wake_up(&res->wq); in dlm_lockres_drop_inflight_ref()
689 struct dlm_lock_resource *res) in __dlm_lockres_grab_inflight_worker() argument
691 assert_spin_locked(&res->spinlock); in __dlm_lockres_grab_inflight_worker()
692 res->inflight_assert_workers++; in __dlm_lockres_grab_inflight_worker()
694 dlm->name, res->lockname.len, res->lockname.name, in __dlm_lockres_grab_inflight_worker()
695 res->inflight_assert_workers); in __dlm_lockres_grab_inflight_worker()
699 struct dlm_lock_resource *res) in __dlm_lockres_drop_inflight_worker() argument
701 assert_spin_locked(&res->spinlock); in __dlm_lockres_drop_inflight_worker()
702 BUG_ON(res->inflight_assert_workers == 0); in __dlm_lockres_drop_inflight_worker()
703 res->inflight_assert_workers--; in __dlm_lockres_drop_inflight_worker()
705 dlm->name, res->lockname.len, res->lockname.name, in __dlm_lockres_drop_inflight_worker()
706 res->inflight_assert_workers); in __dlm_lockres_drop_inflight_worker()
710 struct dlm_lock_resource *res) in dlm_lockres_drop_inflight_worker() argument
712 spin_lock(&res->spinlock); in dlm_lockres_drop_inflight_worker()
713 __dlm_lockres_drop_inflight_worker(dlm, res); in dlm_lockres_drop_inflight_worker()
714 spin_unlock(&res->spinlock); in dlm_lockres_drop_inflight_worker()
738 struct dlm_lock_resource *tmpres=NULL, *res=NULL; in dlm_get_lock_resource() local
798 if (res) in dlm_get_lock_resource()
799 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 dlm_lockres_put(res); in dlm_master_request_handler()
1664 __dlm_lockres_grab_inflight_worker(dlm, res); in dlm_master_request_handler()
1666 spin_unlock(&res->spinlock); in dlm_master_request_handler()
1668 if (res) in dlm_master_request_handler()
1669 dlm_lockres_put(res); in dlm_master_request_handler()
1688 struct dlm_lock_resource *res, in dlm_do_assert_master() argument
1696 const char *lockname = res->lockname.name; in dlm_do_assert_master()
1697 unsigned int namelen = res->lockname.len; in dlm_do_assert_master()
1701 spin_lock(&res->spinlock); in dlm_do_assert_master()
1702 res->state |= DLM_LOCK_RES_SETREF_INPROG; in dlm_do_assert_master()
1703 spin_unlock(&res->spinlock); in dlm_do_assert_master()
1770 spin_lock(&res->spinlock); in dlm_do_assert_master()
1771 dlm_lockres_set_refmap_bit(dlm, res, to); in dlm_do_assert_master()
1772 spin_unlock(&res->spinlock); in dlm_do_assert_master()
1779 spin_lock(&res->spinlock); in dlm_do_assert_master()
1780 res->state &= ~DLM_LOCK_RES_SETREF_INPROG; in dlm_do_assert_master()
1781 spin_unlock(&res->spinlock); in dlm_do_assert_master()
1782 wake_up(&res->wq); in dlm_do_assert_master()
1802 struct dlm_lock_resource *res = NULL; in dlm_assert_master_handler() local
1880 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_assert_master_handler()
1881 if (res) { in dlm_assert_master_handler()
1882 spin_lock(&res->spinlock); in dlm_assert_master_handler()
1883 if (res->state & DLM_LOCK_RES_RECOVERING) { in dlm_assert_master_handler()
1889 if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN && in dlm_assert_master_handler()
1890 res->owner != assert->node_idx) { in dlm_assert_master_handler()
1893 assert->node_idx, res->owner, namelen, in dlm_assert_master_handler()
1895 __dlm_print_one_lock_resource(res); in dlm_assert_master_handler()
1899 if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN) { in dlm_assert_master_handler()
1901 if (res->owner == assert->node_idx) { in dlm_assert_master_handler()
1910 res->owner, namelen, name); in dlm_assert_master_handler()
1913 if (!(res->state & DLM_LOCK_RES_IN_PROGRESS)) { in dlm_assert_master_handler()
1934 spin_unlock(&res->spinlock); in dlm_assert_master_handler()
1964 if (res) { in dlm_assert_master_handler()
1966 spin_lock(&res->spinlock); in dlm_assert_master_handler()
1970 res->lockname.len, res->lockname.name, in dlm_assert_master_handler()
1972 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_assert_master_handler()
1974 dlm_change_lockres_owner(dlm, res, mle->new_master); in dlm_assert_master_handler()
1975 BUG_ON(res->state & DLM_LOCK_RES_DIRTY); in dlm_assert_master_handler()
1977 dlm_change_lockres_owner(dlm, res, mle->master); in dlm_assert_master_handler()
1979 spin_unlock(&res->spinlock); in dlm_assert_master_handler()
1982 wake_up(&res->wq); in dlm_assert_master_handler()
2020 } else if (res) { in dlm_assert_master_handler()
2021 if (res->owner != assert->node_idx) { in dlm_assert_master_handler()
2024 res->owner, namelen, name); in dlm_assert_master_handler()
2031 if (res) { in dlm_assert_master_handler()
2032 spin_lock(&res->spinlock); in dlm_assert_master_handler()
2033 res->state |= DLM_LOCK_RES_SETREF_INPROG; in dlm_assert_master_handler()
2034 spin_unlock(&res->spinlock); in dlm_assert_master_handler()
2035 *ret_data = (void *)res; in dlm_assert_master_handler()
2060 __dlm_print_one_lock_resource(res); in dlm_assert_master_handler()
2061 spin_unlock(&res->spinlock); in dlm_assert_master_handler()
2067 *ret_data = (void *)res; in dlm_assert_master_handler()
2074 struct dlm_lock_resource *res = (struct dlm_lock_resource *)ret_data; in dlm_assert_master_post_handler() local
2077 spin_lock(&res->spinlock); in dlm_assert_master_post_handler()
2078 res->state &= ~DLM_LOCK_RES_SETREF_INPROG; in dlm_assert_master_post_handler()
2079 spin_unlock(&res->spinlock); in dlm_assert_master_post_handler()
2080 wake_up(&res->wq); in dlm_assert_master_post_handler()
2081 dlm_lockres_put(res); in dlm_assert_master_post_handler()
2087 struct dlm_lock_resource *res, in dlm_dispatch_assert_master() argument
2098 item->u.am.lockres = res; /* already have a ref */ in dlm_dispatch_assert_master()
2105 mlog(0, "IGNORE HIGHER: %.*s\n", res->lockname.len, in dlm_dispatch_assert_master()
2106 res->lockname.name); in dlm_dispatch_assert_master()
2120 struct dlm_lock_resource *res; in dlm_assert_master_worker() local
2128 res = item->u.am.lockres; in dlm_assert_master_worker()
2159 spin_lock(&res->spinlock); in dlm_assert_master_worker()
2160 if (res->state & DLM_LOCK_RES_MIGRATING) { in dlm_assert_master_worker()
2164 spin_unlock(&res->spinlock); in dlm_assert_master_worker()
2167 __dlm_lockres_reserve_ast(res); in dlm_assert_master_worker()
2168 spin_unlock(&res->spinlock); in dlm_assert_master_worker()
2173 res->lockname.len, res->lockname.name, dlm->node_num); in dlm_assert_master_worker()
2174 ret = dlm_do_assert_master(dlm, res, nodemap, flags); in dlm_assert_master_worker()
2182 dlm_lockres_release_ast(dlm, res); in dlm_assert_master_worker()
2185 dlm_lockres_drop_inflight_worker(dlm, res); in dlm_assert_master_worker()
2187 dlm_lockres_put(res); in dlm_assert_master_worker()
2203 struct dlm_lock_resource *res) in dlm_pre_master_reco_lockres() argument
2218 ret = dlm_do_master_requery(dlm, res, nodenum, &master); in dlm_pre_master_reco_lockres()
2252 int dlm_drop_lockres_ref(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_drop_lockres_ref() argument
2259 lockname = res->lockname.name; in dlm_drop_lockres_ref()
2260 namelen = res->lockname.len; in dlm_drop_lockres_ref()
2269 &deref, sizeof(deref), res->owner, &r); in dlm_drop_lockres_ref()
2272 dlm->name, namelen, lockname, ret, res->owner); in dlm_drop_lockres_ref()
2276 dlm->name, namelen, lockname, res->owner, r); in dlm_drop_lockres_ref()
2277 dlm_print_one_lock_resource(res); in dlm_drop_lockres_ref()
2288 struct dlm_lock_resource *res = NULL; in dlm_deref_lockres_handler() local
2317 res = __dlm_lookup_lockres_full(dlm, name, namelen, hash); in dlm_deref_lockres_handler()
2318 if (!res) { in dlm_deref_lockres_handler()
2326 spin_lock(&res->spinlock); in dlm_deref_lockres_handler()
2327 if (res->state & DLM_LOCK_RES_SETREF_INPROG) in dlm_deref_lockres_handler()
2330 BUG_ON(res->state & DLM_LOCK_RES_DROPPING_REF); in dlm_deref_lockres_handler()
2331 if (test_bit(node, res->refmap)) { in dlm_deref_lockres_handler()
2332 dlm_lockres_clear_refmap_bit(dlm, res, node); in dlm_deref_lockres_handler()
2336 spin_unlock(&res->spinlock); in dlm_deref_lockres_handler()
2340 dlm_lockres_calc_usage(dlm, res); in dlm_deref_lockres_handler()
2344 res->lockname.len, res->lockname.name, node); in dlm_deref_lockres_handler()
2345 dlm_print_one_lock_resource(res); in dlm_deref_lockres_handler()
2359 item->u.dl.deref_res = res; in dlm_deref_lockres_handler()
2370 if (res) in dlm_deref_lockres_handler()
2371 dlm_lockres_put(res); in dlm_deref_lockres_handler()
2380 struct dlm_lock_resource *res; in dlm_deref_lockres_worker() local
2385 res = item->u.dl.deref_res; in dlm_deref_lockres_worker()
2388 spin_lock(&res->spinlock); in dlm_deref_lockres_worker()
2389 BUG_ON(res->state & DLM_LOCK_RES_DROPPING_REF); in dlm_deref_lockres_worker()
2390 if (test_bit(node, res->refmap)) { in dlm_deref_lockres_worker()
2391 __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG); in dlm_deref_lockres_worker()
2392 dlm_lockres_clear_refmap_bit(dlm, res, node); in dlm_deref_lockres_worker()
2395 spin_unlock(&res->spinlock); in dlm_deref_lockres_worker()
2399 dlm->name, res->lockname.len, res->lockname.name, node); in dlm_deref_lockres_worker()
2400 dlm_lockres_calc_usage(dlm, res); in dlm_deref_lockres_worker()
2404 res->lockname.len, res->lockname.name, node); in dlm_deref_lockres_worker()
2405 dlm_print_one_lock_resource(res); in dlm_deref_lockres_worker()
2408 dlm_lockres_put(res); in dlm_deref_lockres_worker()
2419 struct dlm_lock_resource *res) in dlm_is_lockres_migrateable() argument
2427 assert_spin_locked(&res->spinlock); in dlm_is_lockres_migrateable()
2430 if (res->state & DLM_LOCK_RES_MIGRATING) in dlm_is_lockres_migrateable()
2434 if (res->state & DLM_LOCK_RES_RECOVERING) in dlm_is_lockres_migrateable()
2437 if (res->owner != dlm->node_num) in dlm_is_lockres_migrateable()
2441 queue = dlm_list_idx_to_ptr(res, idx); in dlm_is_lockres_migrateable()
2449 "%s list\n", dlm->name, res->lockname.len, in dlm_is_lockres_migrateable()
2450 res->lockname.name, in dlm_is_lockres_migrateable()
2459 node_ref = find_next_bit(res->refmap, O2NM_MAX_NODES, 0); in dlm_is_lockres_migrateable()
2464 mlog(0, "%s: res %.*s, Migrateable\n", dlm->name, res->lockname.len, in dlm_is_lockres_migrateable()
2465 res->lockname.name); in dlm_is_lockres_migrateable()
2476 struct dlm_lock_resource *res, u8 target) in dlm_migrate_lockres() argument
2492 name = res->lockname.name; in dlm_migrate_lockres()
2493 namelen = res->lockname.len; in dlm_migrate_lockres()
2519 ret = dlm_add_migration_mle(dlm, res, mle, &oldmle, name, in dlm_migrate_lockres()
2539 if (dlm_mark_lockres_migrating(dlm, res, target) < 0) { in dlm_migrate_lockres()
2541 "the target went down.\n", res->lockname.len, in dlm_migrate_lockres()
2542 res->lockname.name, target); in dlm_migrate_lockres()
2543 spin_lock(&res->spinlock); in dlm_migrate_lockres()
2544 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_migrate_lockres()
2546 spin_unlock(&res->spinlock); in dlm_migrate_lockres()
2583 ret = dlm_send_one_lockres(dlm, res, mres, target, in dlm_migrate_lockres()
2593 spin_lock(&res->spinlock); in dlm_migrate_lockres()
2594 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_migrate_lockres()
2596 spin_unlock(&res->spinlock); in dlm_migrate_lockres()
2622 res->owner == target) in dlm_migrate_lockres()
2626 dlm->name, res->lockname.len, res->lockname.name); in dlm_migrate_lockres()
2632 dlm->name, res->lockname.len, in dlm_migrate_lockres()
2633 res->lockname.name, target); in dlm_migrate_lockres()
2639 spin_lock(&res->spinlock); in dlm_migrate_lockres()
2640 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_migrate_lockres()
2642 spin_unlock(&res->spinlock); in dlm_migrate_lockres()
2647 dlm->name, res->lockname.len, res->lockname.name); in dlm_migrate_lockres()
2651 spin_lock(&res->spinlock); in dlm_migrate_lockres()
2652 dlm_set_lockres_owner(dlm, res, target); in dlm_migrate_lockres()
2653 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_migrate_lockres()
2654 dlm_remove_nonlocal_locks(dlm, res); in dlm_migrate_lockres()
2655 spin_unlock(&res->spinlock); in dlm_migrate_lockres()
2656 wake_up(&res->wq); in dlm_migrate_lockres()
2663 dlm_lockres_calc_usage(dlm, res); in dlm_migrate_lockres()
2668 dlm_kick_thread(dlm, res); in dlm_migrate_lockres()
2673 wake_up(&res->wq); in dlm_migrate_lockres()
2697 int dlm_empty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_empty_lockres() argument
2705 spin_lock(&res->spinlock); in dlm_empty_lockres()
2706 if (dlm_is_lockres_migrateable(dlm, res)) in dlm_empty_lockres()
2707 target = dlm_pick_migration_target(dlm, res); in dlm_empty_lockres()
2708 spin_unlock(&res->spinlock); in dlm_empty_lockres()
2716 ret = dlm_migrate_lockres(dlm, res, target); in dlm_empty_lockres()
2719 dlm->name, res->lockname.len, res->lockname.name, in dlm_empty_lockres()
2738 struct dlm_lock_resource *res, in dlm_migration_can_proceed() argument
2742 spin_lock(&res->spinlock); in dlm_migration_can_proceed()
2743 can_proceed = !!(res->state & DLM_LOCK_RES_MIGRATING); in dlm_migration_can_proceed()
2744 spin_unlock(&res->spinlock); in dlm_migration_can_proceed()
2756 struct dlm_lock_resource *res) in dlm_lockres_is_dirty() argument
2759 spin_lock(&res->spinlock); in dlm_lockres_is_dirty()
2760 ret = !!(res->state & DLM_LOCK_RES_DIRTY); in dlm_lockres_is_dirty()
2761 spin_unlock(&res->spinlock); in dlm_lockres_is_dirty()
2767 struct dlm_lock_resource *res, in dlm_mark_lockres_migrating() argument
2773 res->lockname.len, res->lockname.name, dlm->node_num, in dlm_mark_lockres_migrating()
2777 spin_lock(&res->spinlock); in dlm_mark_lockres_migrating()
2778 BUG_ON(res->migration_pending); in dlm_mark_lockres_migrating()
2779 res->migration_pending = 1; in dlm_mark_lockres_migrating()
2782 __dlm_lockres_reserve_ast(res); in dlm_mark_lockres_migrating()
2783 spin_unlock(&res->spinlock); in dlm_mark_lockres_migrating()
2786 dlm_kick_thread(dlm, res); in dlm_mark_lockres_migrating()
2789 spin_lock(&res->spinlock); in dlm_mark_lockres_migrating()
2790 BUG_ON(res->state & DLM_LOCK_RES_BLOCK_DIRTY); in dlm_mark_lockres_migrating()
2791 res->state |= DLM_LOCK_RES_BLOCK_DIRTY; in dlm_mark_lockres_migrating()
2792 spin_unlock(&res->spinlock); in dlm_mark_lockres_migrating()
2794 wait_event(dlm->ast_wq, !dlm_lockres_is_dirty(dlm, res)); in dlm_mark_lockres_migrating()
2795 dlm_lockres_release_ast(dlm, res); in dlm_mark_lockres_migrating()
2798 res->state & DLM_LOCK_RES_DIRTY ? "yes" : "no"); in dlm_mark_lockres_migrating()
2804 dlm_migration_can_proceed(dlm, res, target), in dlm_mark_lockres_migrating()
2808 res->state & DLM_LOCK_RES_MIGRATING ? "yes":"no", in dlm_mark_lockres_migrating()
2812 res->state & DLM_LOCK_RES_MIGRATING ? "yes":"no", in dlm_mark_lockres_migrating()
2815 if (!dlm_migration_can_proceed(dlm, res, target)) { in dlm_mark_lockres_migrating()
2835 spin_lock(&res->spinlock); in dlm_mark_lockres_migrating()
2836 BUG_ON(!(res->state & DLM_LOCK_RES_BLOCK_DIRTY)); in dlm_mark_lockres_migrating()
2837 res->state &= ~DLM_LOCK_RES_BLOCK_DIRTY; in dlm_mark_lockres_migrating()
2839 BUG_ON(!(res->state & DLM_LOCK_RES_MIGRATING)); in dlm_mark_lockres_migrating()
2840 spin_unlock(&res->spinlock); in dlm_mark_lockres_migrating()
2857 struct dlm_lock_resource *res) in dlm_remove_nonlocal_locks() argument
2859 struct list_head *queue = &res->granted; in dlm_remove_nonlocal_locks()
2863 assert_spin_locked(&res->spinlock); in dlm_remove_nonlocal_locks()
2865 BUG_ON(res->owner == dlm->node_num); in dlm_remove_nonlocal_locks()
2877 dlm_lockres_clear_refmap_bit(dlm, res, in dlm_remove_nonlocal_locks()
2890 bit = find_next_bit(res->refmap, O2NM_MAX_NODES, bit); in dlm_remove_nonlocal_locks()
2898 res->lockname.len, res->lockname.name, bit); in dlm_remove_nonlocal_locks()
2899 dlm_lockres_clear_refmap_bit(dlm, res, bit); in dlm_remove_nonlocal_locks()
2911 struct dlm_lock_resource *res) in dlm_pick_migration_target() argument
2914 struct list_head *queue = &res->granted; in dlm_pick_migration_target()
2920 assert_spin_locked(&res->spinlock); in dlm_pick_migration_target()
2924 queue = dlm_list_idx_to_ptr(res, idx); in dlm_pick_migration_target()
2938 noderef = find_next_bit(res->refmap, O2NM_MAX_NODES, in dlm_pick_migration_target()
2957 struct dlm_lock_resource *res, in dlm_do_migrate_request() argument
2966 migrate.namelen = res->lockname.len; in dlm_do_migrate_request()
2967 memcpy(migrate.name, res->lockname.name, migrate.namelen); in dlm_do_migrate_request()
3010 dlm->name, res->lockname.len, res->lockname.name, in dlm_do_migrate_request()
3012 spin_lock(&res->spinlock); in dlm_do_migrate_request()
3013 dlm_lockres_set_refmap_bit(dlm, res, nodenum); in dlm_do_migrate_request()
3014 spin_unlock(&res->spinlock); in dlm_do_migrate_request()
3037 struct dlm_lock_resource *res = NULL; in dlm_migrate_request_handler() local
3061 res = __dlm_lookup_lockres(dlm, name, namelen, hash); in dlm_migrate_request_handler()
3062 if (res) { in dlm_migrate_request_handler()
3063 spin_lock(&res->spinlock); in dlm_migrate_request_handler()
3064 if (res->state & DLM_LOCK_RES_RECOVERING) { in dlm_migrate_request_handler()
3068 spin_unlock(&res->spinlock); in dlm_migrate_request_handler()
3075 res->state |= DLM_LOCK_RES_MIGRATING; in dlm_migrate_request_handler()
3076 spin_unlock(&res->spinlock); in dlm_migrate_request_handler()
3081 ret = dlm_add_migration_mle(dlm, res, mle, &oldmle, in dlm_migrate_request_handler()
3096 if (res) in dlm_migrate_request_handler()
3097 dlm_lockres_put(res); in dlm_migrate_request_handler()
3111 struct dlm_lock_resource *res, in dlm_add_migration_mle() argument
3170 dlm_init_mle(mle, DLM_MLE_MIGRATION, dlm, res, name, namelen); in dlm_add_migration_mle()
3188 struct dlm_lock_resource *res; in dlm_reset_mleres_owner() local
3191 res = __dlm_lookup_lockres(dlm, mle->mname, mle->mnamelen, in dlm_reset_mleres_owner()
3193 if (res) { in dlm_reset_mleres_owner()
3197 spin_lock(&res->spinlock); in dlm_reset_mleres_owner()
3198 dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); in dlm_reset_mleres_owner()
3199 dlm_move_lockres_to_recovery_list(dlm, res); in dlm_reset_mleres_owner()
3200 spin_unlock(&res->spinlock); in dlm_reset_mleres_owner()
3201 dlm_lockres_put(res); in dlm_reset_mleres_owner()
3212 return res; in dlm_reset_mleres_owner()
3260 struct dlm_lock_resource *res; in dlm_clean_master_list() local
3329 res = dlm_reset_mleres_owner(dlm, mle); in dlm_clean_master_list()
3330 if (res) in dlm_clean_master_list()
3341 int dlm_finish_migration(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, in dlm_finish_migration() argument
3356 spin_lock(&res->spinlock); in dlm_finish_migration()
3357 dlm_lockres_set_refmap_bit(dlm, res, old_master); in dlm_finish_migration()
3358 spin_unlock(&res->spinlock); in dlm_finish_migration()
3361 ret = dlm_do_migrate_request(dlm, res, old_master, in dlm_finish_migration()
3369 res->lockname.len, res->lockname.name); in dlm_finish_migration()
3372 ret = dlm_do_assert_master(dlm, res, iter.node_map, in dlm_finish_migration()
3383 res->lockname.len, res->lockname.name, old_master); in dlm_finish_migration()
3384 ret = dlm_do_assert_master(dlm, res, iter.node_map, in dlm_finish_migration()
3395 spin_lock(&res->spinlock); in dlm_finish_migration()
3396 dlm_set_lockres_owner(dlm, res, dlm->node_num); in dlm_finish_migration()
3397 res->state &= ~DLM_LOCK_RES_MIGRATING; in dlm_finish_migration()
3398 spin_unlock(&res->spinlock); in dlm_finish_migration()
3400 dlm_kick_thread(dlm, res); in dlm_finish_migration()
3401 wake_up(&res->wq); in dlm_finish_migration()
3415 void __dlm_lockres_reserve_ast(struct dlm_lock_resource *res) in __dlm_lockres_reserve_ast() argument
3417 assert_spin_locked(&res->spinlock); in __dlm_lockres_reserve_ast()
3418 if (res->state & DLM_LOCK_RES_MIGRATING) { in __dlm_lockres_reserve_ast()
3419 __dlm_print_one_lock_resource(res); in __dlm_lockres_reserve_ast()
3421 BUG_ON(res->state & DLM_LOCK_RES_MIGRATING); in __dlm_lockres_reserve_ast()
3423 atomic_inc(&res->asts_reserved); in __dlm_lockres_reserve_ast()
3440 struct dlm_lock_resource *res) in dlm_lockres_release_ast() argument
3442 if (!atomic_dec_and_lock(&res->asts_reserved, &res->spinlock)) in dlm_lockres_release_ast()
3445 if (!res->migration_pending) { in dlm_lockres_release_ast()
3446 spin_unlock(&res->spinlock); in dlm_lockres_release_ast()
3450 BUG_ON(res->state & DLM_LOCK_RES_MIGRATING); in dlm_lockres_release_ast()
3451 res->migration_pending = 0; in dlm_lockres_release_ast()
3452 res->state |= DLM_LOCK_RES_MIGRATING; in dlm_lockres_release_ast()
3453 spin_unlock(&res->spinlock); in dlm_lockres_release_ast()
3454 wake_up(&res->wq); in dlm_lockres_release_ast()