Lines Matching refs:res
46 void __dlm_wait_on_lockres_flags(struct dlm_lock_resource *res, int flags) in __dlm_wait_on_lockres_flags() argument
50 assert_spin_locked(&res->spinlock); in __dlm_wait_on_lockres_flags()
52 add_wait_queue(&res->wq, &wait); in __dlm_wait_on_lockres_flags()
55 if (res->state & flags) { in __dlm_wait_on_lockres_flags()
56 spin_unlock(&res->spinlock); in __dlm_wait_on_lockres_flags()
58 spin_lock(&res->spinlock); in __dlm_wait_on_lockres_flags()
61 remove_wait_queue(&res->wq, &wait); in __dlm_wait_on_lockres_flags()
65 int __dlm_lockres_has_locks(struct dlm_lock_resource *res) in __dlm_lockres_has_locks() argument
67 if (list_empty(&res->granted) && in __dlm_lockres_has_locks()
68 list_empty(&res->converting) && in __dlm_lockres_has_locks()
69 list_empty(&res->blocked)) in __dlm_lockres_has_locks()
78 int __dlm_lockres_unused(struct dlm_lock_resource *res) in __dlm_lockres_unused() argument
82 assert_spin_locked(&res->spinlock); in __dlm_lockres_unused()
84 if (__dlm_lockres_has_locks(res)) in __dlm_lockres_unused()
88 if (res->inflight_locks) in __dlm_lockres_unused()
91 if (!list_empty(&res->dirty) || res->state & DLM_LOCK_RES_DIRTY) in __dlm_lockres_unused()
94 if (res->state & (DLM_LOCK_RES_RECOVERING| in __dlm_lockres_unused()
99 bit = find_next_bit(res->refmap, O2NM_MAX_NODES, 0); in __dlm_lockres_unused()
111 struct dlm_lock_resource *res) in __dlm_lockres_calc_usage() argument
114 assert_spin_locked(&res->spinlock); in __dlm_lockres_calc_usage()
116 if (__dlm_lockres_unused(res)){ in __dlm_lockres_calc_usage()
117 if (list_empty(&res->purge)) { in __dlm_lockres_calc_usage()
119 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
121 res->last_used = jiffies; in __dlm_lockres_calc_usage()
122 dlm_lockres_get(res); in __dlm_lockres_calc_usage()
123 list_add_tail(&res->purge, &dlm->purge_list); in __dlm_lockres_calc_usage()
126 } else if (!list_empty(&res->purge)) { in __dlm_lockres_calc_usage()
128 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
130 list_del_init(&res->purge); in __dlm_lockres_calc_usage()
131 dlm_lockres_put(res); in __dlm_lockres_calc_usage()
137 struct dlm_lock_resource *res) in dlm_lockres_calc_usage() argument
140 spin_lock(&res->spinlock); in dlm_lockres_calc_usage()
142 __dlm_lockres_calc_usage(dlm, res); in dlm_lockres_calc_usage()
144 spin_unlock(&res->spinlock); in dlm_lockres_calc_usage()
155 struct dlm_lock_resource *res) in __dlm_do_purge_lockres() argument
158 assert_spin_locked(&res->spinlock); in __dlm_do_purge_lockres()
160 if (!list_empty(&res->purge)) { in __dlm_do_purge_lockres()
162 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
163 list_del_init(&res->purge); in __dlm_do_purge_lockres()
164 dlm_lockres_put(res); in __dlm_do_purge_lockres()
168 if (!__dlm_lockres_unused(res)) { in __dlm_do_purge_lockres()
170 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
171 __dlm_print_one_lock_resource(res); in __dlm_do_purge_lockres()
175 __dlm_unhash_lockres(dlm, res); in __dlm_do_purge_lockres()
178 if (!list_empty(&res->tracking)) in __dlm_do_purge_lockres()
179 list_del_init(&res->tracking); in __dlm_do_purge_lockres()
182 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
183 __dlm_print_one_lock_resource(res); in __dlm_do_purge_lockres()
191 res->state &= ~DLM_LOCK_RES_DROPPING_REF; in __dlm_do_purge_lockres()
195 struct dlm_lock_resource *res) in dlm_purge_lockres() argument
201 assert_spin_locked(&res->spinlock); in dlm_purge_lockres()
203 master = (res->owner == dlm->node_num); in dlm_purge_lockres()
206 res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
209 if (res->state & DLM_LOCK_RES_DROPPING_REF) { in dlm_purge_lockres()
211 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
212 spin_unlock(&res->spinlock); in dlm_purge_lockres()
216 res->state |= DLM_LOCK_RES_DROPPING_REF; in dlm_purge_lockres()
218 spin_unlock(&res->spinlock); in dlm_purge_lockres()
221 spin_lock(&res->spinlock); in dlm_purge_lockres()
223 __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG); in dlm_purge_lockres()
224 spin_unlock(&res->spinlock); in dlm_purge_lockres()
227 ret = dlm_drop_lockres_ref(dlm, res); in dlm_purge_lockres()
233 spin_lock(&res->spinlock); in dlm_purge_lockres()
236 if (!list_empty(&res->purge)) { in dlm_purge_lockres()
238 dlm->name, res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
239 list_del_init(&res->purge); in dlm_purge_lockres()
240 dlm_lockres_put(res); in dlm_purge_lockres()
246 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
247 spin_unlock(&res->spinlock); in dlm_purge_lockres()
251 if (!__dlm_lockres_unused(res)) { in dlm_purge_lockres()
253 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
254 __dlm_print_one_lock_resource(res); in dlm_purge_lockres()
258 __dlm_unhash_lockres(dlm, res); in dlm_purge_lockres()
261 if (!list_empty(&res->tracking)) in dlm_purge_lockres()
262 list_del_init(&res->tracking); in dlm_purge_lockres()
265 res->lockname.len, res->lockname.name); in dlm_purge_lockres()
266 __dlm_print_one_lock_resource(res); in dlm_purge_lockres()
273 res->state &= ~DLM_LOCK_RES_DROPPING_REF; in dlm_purge_lockres()
274 spin_unlock(&res->spinlock); in dlm_purge_lockres()
275 wake_up(&res->wq); in dlm_purge_lockres()
277 spin_unlock(&res->spinlock); in dlm_purge_lockres()
345 struct dlm_lock_resource *res) in dlm_shuffle_lists() argument
357 assert_spin_locked(&res->spinlock); in dlm_shuffle_lists()
358 BUG_ON((res->state & (DLM_LOCK_RES_MIGRATING| in dlm_shuffle_lists()
363 if (list_empty(&res->converting)) in dlm_shuffle_lists()
366 res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
368 target = list_entry(res->converting.next, struct dlm_lock, list); in dlm_shuffle_lists()
371 dlm->name, res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
374 list_for_each_entry(lock, &res->granted, list) { in dlm_shuffle_lists()
382 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
392 list_for_each_entry(lock, &res->converting, list) { in dlm_shuffle_lists()
399 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
414 "%d => %d, node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
415 res->lockname.name, in dlm_shuffle_lists()
423 list_move_tail(&target->list, &res->granted); in dlm_shuffle_lists()
430 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
437 if (list_empty(&res->blocked)) in dlm_shuffle_lists()
439 target = list_entry(res->blocked.next, struct dlm_lock, list); in dlm_shuffle_lists()
441 list_for_each_entry(lock, &res->granted, list) { in dlm_shuffle_lists()
447 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
455 list_for_each_entry(lock, &res->converting, list) { in dlm_shuffle_lists()
461 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
476 "node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
477 res->lockname.name, in dlm_shuffle_lists()
483 list_move_tail(&target->list, &res->granted); in dlm_shuffle_lists()
490 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
501 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_kick_thread() argument
503 if (res) { in dlm_kick_thread()
505 spin_lock(&res->spinlock); in dlm_kick_thread()
506 __dlm_dirty_lockres(dlm, res); in dlm_kick_thread()
507 spin_unlock(&res->spinlock); in dlm_kick_thread()
513 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_dirty_lockres() argument
516 assert_spin_locked(&res->spinlock); in __dlm_dirty_lockres()
519 if (res->owner == dlm->node_num) { in __dlm_dirty_lockres()
520 if (res->state & (DLM_LOCK_RES_MIGRATING | in __dlm_dirty_lockres()
524 if (list_empty(&res->dirty)) { in __dlm_dirty_lockres()
526 dlm_lockres_get(res); in __dlm_dirty_lockres()
527 list_add_tail(&res->dirty, &dlm->dirty_list); in __dlm_dirty_lockres()
528 res->state |= DLM_LOCK_RES_DIRTY; in __dlm_dirty_lockres()
532 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, in __dlm_dirty_lockres()
533 res->lockname.name); in __dlm_dirty_lockres()
577 struct dlm_lock_resource *res; in dlm_flush_asts() local
586 res = lock->lockres; in dlm_flush_asts()
588 "node %u\n", dlm->name, res->lockname.len, in dlm_flush_asts()
589 res->lockname.name, in dlm_flush_asts()
602 ret = dlm_do_remote_ast(dlm, res, lock); in dlm_flush_asts()
606 dlm_do_local_ast(dlm, res, lock); in dlm_flush_asts()
614 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
615 res->lockname.name); in dlm_flush_asts()
622 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
630 res = lock->lockres; in dlm_flush_asts()
648 dlm->name, res->lockname.len, res->lockname.name, in dlm_flush_asts()
654 ret = dlm_send_proxy_bast(dlm, res, lock, hi); in dlm_flush_asts()
658 dlm_do_local_bast(dlm, res, lock, hi); in dlm_flush_asts()
666 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
667 res->lockname.name); in dlm_flush_asts()
674 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
687 struct dlm_lock_resource *res; in dlm_thread() local
712 res = list_entry(dlm->dirty_list.next, in dlm_thread()
717 BUG_ON(!res); in dlm_thread()
718 dlm_lockres_get(res); in dlm_thread()
720 spin_lock(&res->spinlock); in dlm_thread()
722 list_del_init(&res->dirty); in dlm_thread()
723 spin_unlock(&res->spinlock); in dlm_thread()
726 dlm_lockres_put(res); in dlm_thread()
732 spin_lock(&res->spinlock); in dlm_thread()
733 if (res->owner != dlm->node_num) { in dlm_thread()
734 __dlm_print_one_lock_resource(res); in dlm_thread()
737 !!(res->state & DLM_LOCK_RES_IN_PROGRESS), in dlm_thread()
738 !!(res->state & DLM_LOCK_RES_MIGRATING), in dlm_thread()
739 !!(res->state & DLM_LOCK_RES_RECOVERING), in dlm_thread()
740 !!(res->state & DLM_LOCK_RES_DIRTY)); in dlm_thread()
742 BUG_ON(res->owner != dlm->node_num); in dlm_thread()
747 BUG_ON(res->state & DLM_LOCK_RES_MIGRATING); in dlm_thread()
748 if (res->state & (DLM_LOCK_RES_IN_PROGRESS | in dlm_thread()
752 res->state &= ~DLM_LOCK_RES_DIRTY; in dlm_thread()
753 spin_unlock(&res->spinlock); in dlm_thread()
757 res->lockname.len, res->lockname.name, in dlm_thread()
758 res->state); in dlm_thread()
769 dlm_shuffle_lists(dlm, res); in dlm_thread()
770 res->state &= ~DLM_LOCK_RES_DIRTY; in dlm_thread()
771 spin_unlock(&res->spinlock); in dlm_thread()
774 dlm_lockres_calc_usage(dlm, res); in dlm_thread()
782 spin_lock(&res->spinlock); in dlm_thread()
783 __dlm_dirty_lockres(dlm, res); in dlm_thread()
784 spin_unlock(&res->spinlock); in dlm_thread()
786 dlm_lockres_put(res); in dlm_thread()