Lines Matching refs:res
61 void __dlm_wait_on_lockres_flags(struct dlm_lock_resource *res, int flags) in __dlm_wait_on_lockres_flags() argument
65 assert_spin_locked(&res->spinlock); in __dlm_wait_on_lockres_flags()
67 add_wait_queue(&res->wq, &wait); in __dlm_wait_on_lockres_flags()
70 if (res->state & flags) { in __dlm_wait_on_lockres_flags()
71 spin_unlock(&res->spinlock); in __dlm_wait_on_lockres_flags()
73 spin_lock(&res->spinlock); in __dlm_wait_on_lockres_flags()
76 remove_wait_queue(&res->wq, &wait); in __dlm_wait_on_lockres_flags()
80 int __dlm_lockres_has_locks(struct dlm_lock_resource *res) in __dlm_lockres_has_locks() argument
82 if (list_empty(&res->granted) && in __dlm_lockres_has_locks()
83 list_empty(&res->converting) && in __dlm_lockres_has_locks()
84 list_empty(&res->blocked)) in __dlm_lockres_has_locks()
93 int __dlm_lockres_unused(struct dlm_lock_resource *res) in __dlm_lockres_unused() argument
97 assert_spin_locked(&res->spinlock); in __dlm_lockres_unused()
99 if (__dlm_lockres_has_locks(res)) in __dlm_lockres_unused()
103 if (res->inflight_locks) in __dlm_lockres_unused()
106 if (!list_empty(&res->dirty) || res->state & DLM_LOCK_RES_DIRTY) in __dlm_lockres_unused()
109 if (res->state & (DLM_LOCK_RES_RECOVERING| in __dlm_lockres_unused()
114 bit = find_next_bit(res->refmap, O2NM_MAX_NODES, 0); in __dlm_lockres_unused()
126 struct dlm_lock_resource *res) in __dlm_lockres_calc_usage() argument
129 assert_spin_locked(&res->spinlock); in __dlm_lockres_calc_usage()
131 if (__dlm_lockres_unused(res)){ in __dlm_lockres_calc_usage()
132 if (list_empty(&res->purge)) { in __dlm_lockres_calc_usage()
134 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
136 res->last_used = jiffies; in __dlm_lockres_calc_usage()
137 dlm_lockres_get(res); in __dlm_lockres_calc_usage()
138 list_add_tail(&res->purge, &dlm->purge_list); in __dlm_lockres_calc_usage()
141 } else if (!list_empty(&res->purge)) { in __dlm_lockres_calc_usage()
143 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
145 list_del_init(&res->purge); in __dlm_lockres_calc_usage()
146 dlm_lockres_put(res); in __dlm_lockres_calc_usage()
152 struct dlm_lock_resource *res) in dlm_lockres_calc_usage() argument
155 spin_lock(&res->spinlock); in dlm_lockres_calc_usage()
157 __dlm_lockres_calc_usage(dlm, res); in dlm_lockres_calc_usage()
159 spin_unlock(&res->spinlock); in dlm_lockres_calc_usage()
170 struct dlm_lock_resource *res) in __dlm_do_purge_lockres() argument
173 assert_spin_locked(&res->spinlock); in __dlm_do_purge_lockres()
175 if (!list_empty(&res->purge)) { in __dlm_do_purge_lockres()
177 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
178 list_del_init(&res->purge); in __dlm_do_purge_lockres()
179 dlm_lockres_put(res); in __dlm_do_purge_lockres()
183 if (!__dlm_lockres_unused(res)) { in __dlm_do_purge_lockres()
185 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
186 __dlm_print_one_lock_resource(res); in __dlm_do_purge_lockres()
190 __dlm_unhash_lockres(dlm, res); in __dlm_do_purge_lockres()
193 if (!list_empty(&res->tracking)) in __dlm_do_purge_lockres()
194 list_del_init(&res->tracking); in __dlm_do_purge_lockres()
197 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
198 __dlm_print_one_lock_resource(res); in __dlm_do_purge_lockres()
206 res->state &= ~DLM_LOCK_RES_DROPPING_REF; in __dlm_do_purge_lockres()
210 struct dlm_lock_resource *res) in dlm_purge_lockres() argument
216 assert_spin_locked(&res->spinlock); in dlm_purge_lockres()
218 master = (res->owner == dlm->node_num); in dlm_purge_lockres()
221 res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
224 if (res->state & DLM_LOCK_RES_DROPPING_REF) { in dlm_purge_lockres()
226 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
227 spin_unlock(&res->spinlock); in dlm_purge_lockres()
231 res->state |= DLM_LOCK_RES_DROPPING_REF; in dlm_purge_lockres()
233 spin_unlock(&res->spinlock); in dlm_purge_lockres()
236 spin_lock(&res->spinlock); in dlm_purge_lockres()
238 __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG); in dlm_purge_lockres()
239 spin_unlock(&res->spinlock); in dlm_purge_lockres()
242 ret = dlm_drop_lockres_ref(dlm, res); in dlm_purge_lockres()
248 spin_lock(&res->spinlock); in dlm_purge_lockres()
251 if (!list_empty(&res->purge)) { in dlm_purge_lockres()
253 dlm->name, res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
254 list_del_init(&res->purge); in dlm_purge_lockres()
255 dlm_lockres_put(res); in dlm_purge_lockres()
261 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
262 spin_unlock(&res->spinlock); in dlm_purge_lockres()
266 if (!__dlm_lockres_unused(res)) { in dlm_purge_lockres()
268 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
269 __dlm_print_one_lock_resource(res); in dlm_purge_lockres()
273 __dlm_unhash_lockres(dlm, res); in dlm_purge_lockres()
276 if (!list_empty(&res->tracking)) in dlm_purge_lockres()
277 list_del_init(&res->tracking); in dlm_purge_lockres()
280 res->lockname.len, res->lockname.name); in dlm_purge_lockres()
281 __dlm_print_one_lock_resource(res); in dlm_purge_lockres()
288 res->state &= ~DLM_LOCK_RES_DROPPING_REF; in dlm_purge_lockres()
289 spin_unlock(&res->spinlock); in dlm_purge_lockres()
290 wake_up(&res->wq); in dlm_purge_lockres()
292 spin_unlock(&res->spinlock); in dlm_purge_lockres()
360 struct dlm_lock_resource *res) in dlm_shuffle_lists() argument
372 assert_spin_locked(&res->spinlock); in dlm_shuffle_lists()
373 BUG_ON((res->state & (DLM_LOCK_RES_MIGRATING| in dlm_shuffle_lists()
378 if (list_empty(&res->converting)) in dlm_shuffle_lists()
381 res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
383 target = list_entry(res->converting.next, struct dlm_lock, list); in dlm_shuffle_lists()
386 dlm->name, res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
389 list_for_each_entry(lock, &res->granted, list) { in dlm_shuffle_lists()
397 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
407 list_for_each_entry(lock, &res->converting, list) { in dlm_shuffle_lists()
414 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
429 "%d => %d, node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
430 res->lockname.name, in dlm_shuffle_lists()
438 list_move_tail(&target->list, &res->granted); in dlm_shuffle_lists()
445 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
452 if (list_empty(&res->blocked)) in dlm_shuffle_lists()
454 target = list_entry(res->blocked.next, struct dlm_lock, list); in dlm_shuffle_lists()
456 list_for_each_entry(lock, &res->granted, list) { in dlm_shuffle_lists()
462 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
470 list_for_each_entry(lock, &res->converting, list) { in dlm_shuffle_lists()
476 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
491 "node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
492 res->lockname.name, in dlm_shuffle_lists()
498 list_move_tail(&target->list, &res->granted); in dlm_shuffle_lists()
505 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
516 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_kick_thread() argument
518 if (res) { in dlm_kick_thread()
520 spin_lock(&res->spinlock); in dlm_kick_thread()
521 __dlm_dirty_lockres(dlm, res); in dlm_kick_thread()
522 spin_unlock(&res->spinlock); in dlm_kick_thread()
528 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_dirty_lockres() argument
531 assert_spin_locked(&res->spinlock); in __dlm_dirty_lockres()
534 if ((res->owner == dlm->node_num)) { in __dlm_dirty_lockres()
535 if (res->state & (DLM_LOCK_RES_MIGRATING | in __dlm_dirty_lockres()
539 if (list_empty(&res->dirty)) { in __dlm_dirty_lockres()
541 dlm_lockres_get(res); in __dlm_dirty_lockres()
542 list_add_tail(&res->dirty, &dlm->dirty_list); in __dlm_dirty_lockres()
543 res->state |= DLM_LOCK_RES_DIRTY; in __dlm_dirty_lockres()
547 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, in __dlm_dirty_lockres()
548 res->lockname.name); in __dlm_dirty_lockres()
592 struct dlm_lock_resource *res; in dlm_flush_asts() local
601 res = lock->lockres; in dlm_flush_asts()
603 "node %u\n", dlm->name, res->lockname.len, in dlm_flush_asts()
604 res->lockname.name, in dlm_flush_asts()
617 ret = dlm_do_remote_ast(dlm, res, lock); in dlm_flush_asts()
621 dlm_do_local_ast(dlm, res, lock); in dlm_flush_asts()
629 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
630 res->lockname.name); in dlm_flush_asts()
637 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
645 res = lock->lockres; in dlm_flush_asts()
663 dlm->name, res->lockname.len, res->lockname.name, in dlm_flush_asts()
669 ret = dlm_send_proxy_bast(dlm, res, lock, hi); in dlm_flush_asts()
673 dlm_do_local_bast(dlm, res, lock, hi); in dlm_flush_asts()
681 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
682 res->lockname.name); in dlm_flush_asts()
689 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
702 struct dlm_lock_resource *res; in dlm_thread() local
727 res = list_entry(dlm->dirty_list.next, in dlm_thread()
732 BUG_ON(!res); in dlm_thread()
733 dlm_lockres_get(res); in dlm_thread()
735 spin_lock(&res->spinlock); in dlm_thread()
737 list_del_init(&res->dirty); in dlm_thread()
738 spin_unlock(&res->spinlock); in dlm_thread()
741 dlm_lockres_put(res); in dlm_thread()
747 spin_lock(&res->spinlock); in dlm_thread()
748 if (res->owner != dlm->node_num) { in dlm_thread()
749 __dlm_print_one_lock_resource(res); in dlm_thread()
752 !!(res->state & DLM_LOCK_RES_IN_PROGRESS), in dlm_thread()
753 !!(res->state & DLM_LOCK_RES_MIGRATING), in dlm_thread()
754 !!(res->state & DLM_LOCK_RES_RECOVERING), in dlm_thread()
755 !!(res->state & DLM_LOCK_RES_DIRTY)); in dlm_thread()
757 BUG_ON(res->owner != dlm->node_num); in dlm_thread()
762 BUG_ON(res->state & DLM_LOCK_RES_MIGRATING); in dlm_thread()
763 if (res->state & (DLM_LOCK_RES_IN_PROGRESS | in dlm_thread()
767 res->state &= ~DLM_LOCK_RES_DIRTY; in dlm_thread()
768 spin_unlock(&res->spinlock); in dlm_thread()
772 res->lockname.len, res->lockname.name, in dlm_thread()
773 res->state); in dlm_thread()
784 dlm_shuffle_lists(dlm, res); in dlm_thread()
785 res->state &= ~DLM_LOCK_RES_DIRTY; in dlm_thread()
786 spin_unlock(&res->spinlock); in dlm_thread()
789 dlm_lockres_calc_usage(dlm, res); in dlm_thread()
797 spin_lock(&res->spinlock); in dlm_thread()
798 __dlm_dirty_lockres(dlm, res); in dlm_thread()
799 spin_unlock(&res->spinlock); in dlm_thread()
801 dlm_lockres_put(res); in dlm_thread()