Lines Matching refs:res

42 void __dlm_wait_on_lockres_flags(struct dlm_lock_resource *res, int flags)  in __dlm_wait_on_lockres_flags()  argument
46 assert_spin_locked(&res->spinlock); in __dlm_wait_on_lockres_flags()
48 add_wait_queue(&res->wq, &wait); in __dlm_wait_on_lockres_flags()
51 if (res->state & flags) { in __dlm_wait_on_lockres_flags()
52 spin_unlock(&res->spinlock); in __dlm_wait_on_lockres_flags()
54 spin_lock(&res->spinlock); in __dlm_wait_on_lockres_flags()
57 remove_wait_queue(&res->wq, &wait); in __dlm_wait_on_lockres_flags()
61 int __dlm_lockres_has_locks(struct dlm_lock_resource *res) in __dlm_lockres_has_locks() argument
63 if (list_empty(&res->granted) && in __dlm_lockres_has_locks()
64 list_empty(&res->converting) && in __dlm_lockres_has_locks()
65 list_empty(&res->blocked)) in __dlm_lockres_has_locks()
74 int __dlm_lockres_unused(struct dlm_lock_resource *res) in __dlm_lockres_unused() argument
78 assert_spin_locked(&res->spinlock); in __dlm_lockres_unused()
80 if (__dlm_lockres_has_locks(res)) in __dlm_lockres_unused()
84 if (res->inflight_locks) in __dlm_lockres_unused()
87 if (!list_empty(&res->dirty) || res->state & DLM_LOCK_RES_DIRTY) in __dlm_lockres_unused()
90 if (res->state & (DLM_LOCK_RES_RECOVERING| in __dlm_lockres_unused()
95 bit = find_first_bit(res->refmap, O2NM_MAX_NODES); in __dlm_lockres_unused()
107 struct dlm_lock_resource *res) in __dlm_lockres_calc_usage() argument
110 assert_spin_locked(&res->spinlock); in __dlm_lockres_calc_usage()
112 if (__dlm_lockres_unused(res)){ in __dlm_lockres_calc_usage()
113 if (list_empty(&res->purge)) { in __dlm_lockres_calc_usage()
115 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
117 res->last_used = jiffies; in __dlm_lockres_calc_usage()
118 dlm_lockres_get(res); in __dlm_lockres_calc_usage()
119 list_add_tail(&res->purge, &dlm->purge_list); in __dlm_lockres_calc_usage()
122 } else if (!list_empty(&res->purge)) { in __dlm_lockres_calc_usage()
124 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
126 list_del_init(&res->purge); in __dlm_lockres_calc_usage()
127 dlm_lockres_put(res); in __dlm_lockres_calc_usage()
133 struct dlm_lock_resource *res) in dlm_lockres_calc_usage() argument
136 spin_lock(&res->spinlock); in dlm_lockres_calc_usage()
138 __dlm_lockres_calc_usage(dlm, res); in dlm_lockres_calc_usage()
140 spin_unlock(&res->spinlock); in dlm_lockres_calc_usage()
151 struct dlm_lock_resource *res) in __dlm_do_purge_lockres() argument
154 assert_spin_locked(&res->spinlock); in __dlm_do_purge_lockres()
156 if (!list_empty(&res->purge)) { in __dlm_do_purge_lockres()
158 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
159 list_del_init(&res->purge); in __dlm_do_purge_lockres()
160 dlm_lockres_put(res); in __dlm_do_purge_lockres()
164 if (!__dlm_lockres_unused(res)) { in __dlm_do_purge_lockres()
166 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
167 __dlm_print_one_lock_resource(res); in __dlm_do_purge_lockres()
171 __dlm_unhash_lockres(dlm, res); in __dlm_do_purge_lockres()
174 if (!list_empty(&res->tracking)) in __dlm_do_purge_lockres()
175 list_del_init(&res->tracking); in __dlm_do_purge_lockres()
178 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
179 __dlm_print_one_lock_resource(res); in __dlm_do_purge_lockres()
187 res->state &= ~DLM_LOCK_RES_DROPPING_REF; in __dlm_do_purge_lockres()
191 struct dlm_lock_resource *res) in dlm_purge_lockres() argument
197 assert_spin_locked(&res->spinlock); in dlm_purge_lockres()
199 master = (res->owner == dlm->node_num); in dlm_purge_lockres()
202 res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
205 if (res->state & DLM_LOCK_RES_DROPPING_REF) { in dlm_purge_lockres()
207 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
208 spin_unlock(&res->spinlock); in dlm_purge_lockres()
212 res->state |= DLM_LOCK_RES_DROPPING_REF; in dlm_purge_lockres()
214 spin_unlock(&res->spinlock); in dlm_purge_lockres()
217 spin_lock(&res->spinlock); in dlm_purge_lockres()
219 __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG); in dlm_purge_lockres()
220 spin_unlock(&res->spinlock); in dlm_purge_lockres()
223 ret = dlm_drop_lockres_ref(dlm, res); in dlm_purge_lockres()
229 spin_lock(&res->spinlock); in dlm_purge_lockres()
232 if (!list_empty(&res->purge)) { in dlm_purge_lockres()
234 dlm->name, res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
235 list_del_init(&res->purge); in dlm_purge_lockres()
236 dlm_lockres_put(res); in dlm_purge_lockres()
242 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
243 spin_unlock(&res->spinlock); in dlm_purge_lockres()
247 if (!__dlm_lockres_unused(res)) { in dlm_purge_lockres()
249 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
250 __dlm_print_one_lock_resource(res); in dlm_purge_lockres()
254 __dlm_unhash_lockres(dlm, res); in dlm_purge_lockres()
257 if (!list_empty(&res->tracking)) in dlm_purge_lockres()
258 list_del_init(&res->tracking); in dlm_purge_lockres()
261 res->lockname.len, res->lockname.name); in dlm_purge_lockres()
262 __dlm_print_one_lock_resource(res); in dlm_purge_lockres()
269 res->state &= ~DLM_LOCK_RES_DROPPING_REF; in dlm_purge_lockres()
270 spin_unlock(&res->spinlock); in dlm_purge_lockres()
271 wake_up(&res->wq); in dlm_purge_lockres()
273 spin_unlock(&res->spinlock); in dlm_purge_lockres()
341 struct dlm_lock_resource *res) in dlm_shuffle_lists() argument
353 assert_spin_locked(&res->spinlock); in dlm_shuffle_lists()
354 BUG_ON((res->state & (DLM_LOCK_RES_MIGRATING| in dlm_shuffle_lists()
359 if (list_empty(&res->converting)) in dlm_shuffle_lists()
362 res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
364 target = list_entry(res->converting.next, struct dlm_lock, list); in dlm_shuffle_lists()
367 dlm->name, res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
370 list_for_each_entry(lock, &res->granted, list) { in dlm_shuffle_lists()
378 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
388 list_for_each_entry(lock, &res->converting, list) { in dlm_shuffle_lists()
395 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
410 "%d => %d, node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
411 res->lockname.name, in dlm_shuffle_lists()
419 list_move_tail(&target->list, &res->granted); in dlm_shuffle_lists()
426 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
433 if (list_empty(&res->blocked)) in dlm_shuffle_lists()
435 target = list_entry(res->blocked.next, struct dlm_lock, list); in dlm_shuffle_lists()
437 list_for_each_entry(lock, &res->granted, list) { in dlm_shuffle_lists()
443 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
451 list_for_each_entry(lock, &res->converting, list) { in dlm_shuffle_lists()
457 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
472 "node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
473 res->lockname.name, in dlm_shuffle_lists()
479 list_move_tail(&target->list, &res->granted); in dlm_shuffle_lists()
486 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
497 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_kick_thread() argument
499 if (res) { in dlm_kick_thread()
501 spin_lock(&res->spinlock); in dlm_kick_thread()
502 __dlm_dirty_lockres(dlm, res); in dlm_kick_thread()
503 spin_unlock(&res->spinlock); in dlm_kick_thread()
509 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_dirty_lockres() argument
512 assert_spin_locked(&res->spinlock); in __dlm_dirty_lockres()
515 if (res->owner == dlm->node_num) { in __dlm_dirty_lockres()
516 if (res->state & (DLM_LOCK_RES_MIGRATING | in __dlm_dirty_lockres()
520 if (list_empty(&res->dirty)) { in __dlm_dirty_lockres()
522 dlm_lockres_get(res); in __dlm_dirty_lockres()
523 list_add_tail(&res->dirty, &dlm->dirty_list); in __dlm_dirty_lockres()
524 res->state |= DLM_LOCK_RES_DIRTY; in __dlm_dirty_lockres()
528 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, in __dlm_dirty_lockres()
529 res->lockname.name); in __dlm_dirty_lockres()
573 struct dlm_lock_resource *res; in dlm_flush_asts() local
582 res = lock->lockres; in dlm_flush_asts()
584 "node %u\n", dlm->name, res->lockname.len, in dlm_flush_asts()
585 res->lockname.name, in dlm_flush_asts()
598 ret = dlm_do_remote_ast(dlm, res, lock); in dlm_flush_asts()
602 dlm_do_local_ast(dlm, res, lock); in dlm_flush_asts()
610 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
611 res->lockname.name); in dlm_flush_asts()
618 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
626 res = lock->lockres; in dlm_flush_asts()
644 dlm->name, res->lockname.len, res->lockname.name, in dlm_flush_asts()
650 ret = dlm_send_proxy_bast(dlm, res, lock, hi); in dlm_flush_asts()
654 dlm_do_local_bast(dlm, res, lock, hi); in dlm_flush_asts()
662 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
663 res->lockname.name); in dlm_flush_asts()
670 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
682 struct dlm_lock_resource *res; in dlm_thread() local
707 res = list_entry(dlm->dirty_list.next, in dlm_thread()
712 BUG_ON(!res); in dlm_thread()
713 dlm_lockres_get(res); in dlm_thread()
715 spin_lock(&res->spinlock); in dlm_thread()
717 list_del_init(&res->dirty); in dlm_thread()
718 spin_unlock(&res->spinlock); in dlm_thread()
721 dlm_lockres_put(res); in dlm_thread()
727 spin_lock(&res->spinlock); in dlm_thread()
728 if (res->owner != dlm->node_num) { in dlm_thread()
729 __dlm_print_one_lock_resource(res); in dlm_thread()
732 !!(res->state & DLM_LOCK_RES_IN_PROGRESS), in dlm_thread()
733 !!(res->state & DLM_LOCK_RES_MIGRATING), in dlm_thread()
734 !!(res->state & DLM_LOCK_RES_RECOVERING), in dlm_thread()
735 !!(res->state & DLM_LOCK_RES_DIRTY)); in dlm_thread()
737 BUG_ON(res->owner != dlm->node_num); in dlm_thread()
742 BUG_ON(res->state & DLM_LOCK_RES_MIGRATING); in dlm_thread()
743 if (res->state & (DLM_LOCK_RES_IN_PROGRESS | in dlm_thread()
747 res->state &= ~DLM_LOCK_RES_DIRTY; in dlm_thread()
748 spin_unlock(&res->spinlock); in dlm_thread()
752 res->lockname.len, res->lockname.name, in dlm_thread()
753 res->state); in dlm_thread()
764 dlm_shuffle_lists(dlm, res); in dlm_thread()
765 res->state &= ~DLM_LOCK_RES_DIRTY; in dlm_thread()
766 spin_unlock(&res->spinlock); in dlm_thread()
769 dlm_lockres_calc_usage(dlm, res); in dlm_thread()
777 spin_lock(&res->spinlock); in dlm_thread()
778 __dlm_dirty_lockres(dlm, res); in dlm_thread()
779 spin_unlock(&res->spinlock); in dlm_thread()
781 dlm_lockres_put(res); in dlm_thread()