Lines Matching refs:res

44 void __dlm_wait_on_lockres_flags(struct dlm_lock_resource *res, int flags)  in __dlm_wait_on_lockres_flags()  argument
48 assert_spin_locked(&res->spinlock); in __dlm_wait_on_lockres_flags()
50 add_wait_queue(&res->wq, &wait); in __dlm_wait_on_lockres_flags()
53 if (res->state & flags) { in __dlm_wait_on_lockres_flags()
54 spin_unlock(&res->spinlock); in __dlm_wait_on_lockres_flags()
56 spin_lock(&res->spinlock); in __dlm_wait_on_lockres_flags()
59 remove_wait_queue(&res->wq, &wait); in __dlm_wait_on_lockres_flags()
63 int __dlm_lockres_has_locks(struct dlm_lock_resource *res) in __dlm_lockres_has_locks() argument
65 if (list_empty(&res->granted) && in __dlm_lockres_has_locks()
66 list_empty(&res->converting) && in __dlm_lockres_has_locks()
67 list_empty(&res->blocked)) in __dlm_lockres_has_locks()
76 int __dlm_lockres_unused(struct dlm_lock_resource *res) in __dlm_lockres_unused() argument
80 assert_spin_locked(&res->spinlock); in __dlm_lockres_unused()
82 if (__dlm_lockres_has_locks(res)) in __dlm_lockres_unused()
86 if (res->inflight_locks) in __dlm_lockres_unused()
89 if (!list_empty(&res->dirty) || res->state & DLM_LOCK_RES_DIRTY) in __dlm_lockres_unused()
92 if (res->state & (DLM_LOCK_RES_RECOVERING| in __dlm_lockres_unused()
97 bit = find_next_bit(res->refmap, O2NM_MAX_NODES, 0); in __dlm_lockres_unused()
109 struct dlm_lock_resource *res) in __dlm_lockres_calc_usage() argument
112 assert_spin_locked(&res->spinlock); in __dlm_lockres_calc_usage()
114 if (__dlm_lockres_unused(res)){ in __dlm_lockres_calc_usage()
115 if (list_empty(&res->purge)) { in __dlm_lockres_calc_usage()
117 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
119 res->last_used = jiffies; in __dlm_lockres_calc_usage()
120 dlm_lockres_get(res); in __dlm_lockres_calc_usage()
121 list_add_tail(&res->purge, &dlm->purge_list); in __dlm_lockres_calc_usage()
124 } else if (!list_empty(&res->purge)) { in __dlm_lockres_calc_usage()
126 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
128 list_del_init(&res->purge); in __dlm_lockres_calc_usage()
129 dlm_lockres_put(res); in __dlm_lockres_calc_usage()
135 struct dlm_lock_resource *res) in dlm_lockres_calc_usage() argument
138 spin_lock(&res->spinlock); in dlm_lockres_calc_usage()
140 __dlm_lockres_calc_usage(dlm, res); in dlm_lockres_calc_usage()
142 spin_unlock(&res->spinlock); in dlm_lockres_calc_usage()
153 struct dlm_lock_resource *res) in __dlm_do_purge_lockres() argument
156 assert_spin_locked(&res->spinlock); in __dlm_do_purge_lockres()
158 if (!list_empty(&res->purge)) { in __dlm_do_purge_lockres()
160 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
161 list_del_init(&res->purge); in __dlm_do_purge_lockres()
162 dlm_lockres_put(res); in __dlm_do_purge_lockres()
166 if (!__dlm_lockres_unused(res)) { in __dlm_do_purge_lockres()
168 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
169 __dlm_print_one_lock_resource(res); in __dlm_do_purge_lockres()
173 __dlm_unhash_lockres(dlm, res); in __dlm_do_purge_lockres()
176 if (!list_empty(&res->tracking)) in __dlm_do_purge_lockres()
177 list_del_init(&res->tracking); in __dlm_do_purge_lockres()
180 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
181 __dlm_print_one_lock_resource(res); in __dlm_do_purge_lockres()
189 res->state &= ~DLM_LOCK_RES_DROPPING_REF; in __dlm_do_purge_lockres()
193 struct dlm_lock_resource *res) in dlm_purge_lockres() argument
199 assert_spin_locked(&res->spinlock); in dlm_purge_lockres()
201 master = (res->owner == dlm->node_num); in dlm_purge_lockres()
204 res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
207 if (res->state & DLM_LOCK_RES_DROPPING_REF) { in dlm_purge_lockres()
209 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
210 spin_unlock(&res->spinlock); in dlm_purge_lockres()
214 res->state |= DLM_LOCK_RES_DROPPING_REF; in dlm_purge_lockres()
216 spin_unlock(&res->spinlock); in dlm_purge_lockres()
219 spin_lock(&res->spinlock); in dlm_purge_lockres()
221 __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG); in dlm_purge_lockres()
222 spin_unlock(&res->spinlock); in dlm_purge_lockres()
225 ret = dlm_drop_lockres_ref(dlm, res); in dlm_purge_lockres()
231 spin_lock(&res->spinlock); in dlm_purge_lockres()
234 if (!list_empty(&res->purge)) { in dlm_purge_lockres()
236 dlm->name, res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
237 list_del_init(&res->purge); in dlm_purge_lockres()
238 dlm_lockres_put(res); in dlm_purge_lockres()
244 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
245 spin_unlock(&res->spinlock); in dlm_purge_lockres()
249 if (!__dlm_lockres_unused(res)) { in dlm_purge_lockres()
251 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
252 __dlm_print_one_lock_resource(res); in dlm_purge_lockres()
256 __dlm_unhash_lockres(dlm, res); in dlm_purge_lockres()
259 if (!list_empty(&res->tracking)) in dlm_purge_lockres()
260 list_del_init(&res->tracking); in dlm_purge_lockres()
263 res->lockname.len, res->lockname.name); in dlm_purge_lockres()
264 __dlm_print_one_lock_resource(res); in dlm_purge_lockres()
271 res->state &= ~DLM_LOCK_RES_DROPPING_REF; in dlm_purge_lockres()
272 spin_unlock(&res->spinlock); in dlm_purge_lockres()
273 wake_up(&res->wq); in dlm_purge_lockres()
275 spin_unlock(&res->spinlock); in dlm_purge_lockres()
343 struct dlm_lock_resource *res) in dlm_shuffle_lists() argument
355 assert_spin_locked(&res->spinlock); in dlm_shuffle_lists()
356 BUG_ON((res->state & (DLM_LOCK_RES_MIGRATING| in dlm_shuffle_lists()
361 if (list_empty(&res->converting)) in dlm_shuffle_lists()
364 res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
366 target = list_entry(res->converting.next, struct dlm_lock, list); in dlm_shuffle_lists()
369 dlm->name, res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
372 list_for_each_entry(lock, &res->granted, list) { in dlm_shuffle_lists()
380 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
390 list_for_each_entry(lock, &res->converting, list) { in dlm_shuffle_lists()
397 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
412 "%d => %d, node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
413 res->lockname.name, in dlm_shuffle_lists()
421 list_move_tail(&target->list, &res->granted); in dlm_shuffle_lists()
428 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
435 if (list_empty(&res->blocked)) in dlm_shuffle_lists()
437 target = list_entry(res->blocked.next, struct dlm_lock, list); in dlm_shuffle_lists()
439 list_for_each_entry(lock, &res->granted, list) { in dlm_shuffle_lists()
445 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
453 list_for_each_entry(lock, &res->converting, list) { in dlm_shuffle_lists()
459 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
474 "node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
475 res->lockname.name, in dlm_shuffle_lists()
481 list_move_tail(&target->list, &res->granted); in dlm_shuffle_lists()
488 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
499 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_kick_thread() argument
501 if (res) { in dlm_kick_thread()
503 spin_lock(&res->spinlock); in dlm_kick_thread()
504 __dlm_dirty_lockres(dlm, res); in dlm_kick_thread()
505 spin_unlock(&res->spinlock); in dlm_kick_thread()
511 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_dirty_lockres() argument
514 assert_spin_locked(&res->spinlock); in __dlm_dirty_lockres()
517 if (res->owner == dlm->node_num) { in __dlm_dirty_lockres()
518 if (res->state & (DLM_LOCK_RES_MIGRATING | in __dlm_dirty_lockres()
522 if (list_empty(&res->dirty)) { in __dlm_dirty_lockres()
524 dlm_lockres_get(res); in __dlm_dirty_lockres()
525 list_add_tail(&res->dirty, &dlm->dirty_list); in __dlm_dirty_lockres()
526 res->state |= DLM_LOCK_RES_DIRTY; in __dlm_dirty_lockres()
530 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, in __dlm_dirty_lockres()
531 res->lockname.name); in __dlm_dirty_lockres()
575 struct dlm_lock_resource *res; in dlm_flush_asts() local
584 res = lock->lockres; in dlm_flush_asts()
586 "node %u\n", dlm->name, res->lockname.len, in dlm_flush_asts()
587 res->lockname.name, in dlm_flush_asts()
600 ret = dlm_do_remote_ast(dlm, res, lock); in dlm_flush_asts()
604 dlm_do_local_ast(dlm, res, lock); in dlm_flush_asts()
612 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
613 res->lockname.name); in dlm_flush_asts()
620 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
628 res = lock->lockres; in dlm_flush_asts()
646 dlm->name, res->lockname.len, res->lockname.name, in dlm_flush_asts()
652 ret = dlm_send_proxy_bast(dlm, res, lock, hi); in dlm_flush_asts()
656 dlm_do_local_bast(dlm, res, lock, hi); in dlm_flush_asts()
664 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
665 res->lockname.name); in dlm_flush_asts()
672 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
684 struct dlm_lock_resource *res; in dlm_thread() local
709 res = list_entry(dlm->dirty_list.next, in dlm_thread()
714 BUG_ON(!res); in dlm_thread()
715 dlm_lockres_get(res); in dlm_thread()
717 spin_lock(&res->spinlock); in dlm_thread()
719 list_del_init(&res->dirty); in dlm_thread()
720 spin_unlock(&res->spinlock); in dlm_thread()
723 dlm_lockres_put(res); in dlm_thread()
729 spin_lock(&res->spinlock); in dlm_thread()
730 if (res->owner != dlm->node_num) { in dlm_thread()
731 __dlm_print_one_lock_resource(res); in dlm_thread()
734 !!(res->state & DLM_LOCK_RES_IN_PROGRESS), in dlm_thread()
735 !!(res->state & DLM_LOCK_RES_MIGRATING), in dlm_thread()
736 !!(res->state & DLM_LOCK_RES_RECOVERING), in dlm_thread()
737 !!(res->state & DLM_LOCK_RES_DIRTY)); in dlm_thread()
739 BUG_ON(res->owner != dlm->node_num); in dlm_thread()
744 BUG_ON(res->state & DLM_LOCK_RES_MIGRATING); in dlm_thread()
745 if (res->state & (DLM_LOCK_RES_IN_PROGRESS | in dlm_thread()
749 res->state &= ~DLM_LOCK_RES_DIRTY; in dlm_thread()
750 spin_unlock(&res->spinlock); in dlm_thread()
754 res->lockname.len, res->lockname.name, in dlm_thread()
755 res->state); in dlm_thread()
766 dlm_shuffle_lists(dlm, res); in dlm_thread()
767 res->state &= ~DLM_LOCK_RES_DIRTY; in dlm_thread()
768 spin_unlock(&res->spinlock); in dlm_thread()
771 dlm_lockres_calc_usage(dlm, res); in dlm_thread()
779 spin_lock(&res->spinlock); in dlm_thread()
780 __dlm_dirty_lockres(dlm, res); in dlm_thread()
781 spin_unlock(&res->spinlock); in dlm_thread()
783 dlm_lockres_put(res); in dlm_thread()