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()
113 bit = find_next_bit(res->refmap, O2NM_MAX_NODES, 0); in __dlm_lockres_unused()
125 struct dlm_lock_resource *res) in __dlm_lockres_calc_usage() argument
128 assert_spin_locked(&res->spinlock); in __dlm_lockres_calc_usage()
130 if (__dlm_lockres_unused(res)){ in __dlm_lockres_calc_usage()
131 if (list_empty(&res->purge)) { in __dlm_lockres_calc_usage()
133 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
135 res->last_used = jiffies; in __dlm_lockres_calc_usage()
136 dlm_lockres_get(res); in __dlm_lockres_calc_usage()
137 list_add_tail(&res->purge, &dlm->purge_list); in __dlm_lockres_calc_usage()
140 } else if (!list_empty(&res->purge)) { in __dlm_lockres_calc_usage()
142 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
144 list_del_init(&res->purge); in __dlm_lockres_calc_usage()
145 dlm_lockres_put(res); in __dlm_lockres_calc_usage()
151 struct dlm_lock_resource *res) in dlm_lockres_calc_usage() argument
154 spin_lock(&res->spinlock); in dlm_lockres_calc_usage()
156 __dlm_lockres_calc_usage(dlm, res); in dlm_lockres_calc_usage()
158 spin_unlock(&res->spinlock); in dlm_lockres_calc_usage()
163 struct dlm_lock_resource *res) in dlm_purge_lockres() argument
169 assert_spin_locked(&res->spinlock); in dlm_purge_lockres()
171 master = (res->owner == dlm->node_num); in dlm_purge_lockres()
174 res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
177 res->state |= DLM_LOCK_RES_DROPPING_REF; in dlm_purge_lockres()
179 spin_unlock(&res->spinlock); in dlm_purge_lockres()
182 spin_lock(&res->spinlock); in dlm_purge_lockres()
184 __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG); in dlm_purge_lockres()
185 spin_unlock(&res->spinlock); in dlm_purge_lockres()
188 ret = dlm_drop_lockres_ref(dlm, res); in dlm_purge_lockres()
194 spin_lock(&res->spinlock); in dlm_purge_lockres()
197 if (!list_empty(&res->purge)) { in dlm_purge_lockres()
199 dlm->name, res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
200 list_del_init(&res->purge); in dlm_purge_lockres()
201 dlm_lockres_put(res); in dlm_purge_lockres()
205 if (!__dlm_lockres_unused(res)) { in dlm_purge_lockres()
207 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
208 __dlm_print_one_lock_resource(res); in dlm_purge_lockres()
212 __dlm_unhash_lockres(dlm, res); in dlm_purge_lockres()
217 res->state &= ~DLM_LOCK_RES_DROPPING_REF; in dlm_purge_lockres()
218 spin_unlock(&res->spinlock); in dlm_purge_lockres()
219 wake_up(&res->wq); in dlm_purge_lockres()
221 spin_unlock(&res->spinlock); in dlm_purge_lockres()
286 struct dlm_lock_resource *res) in dlm_shuffle_lists() argument
300 assert_spin_locked(&res->spinlock); in dlm_shuffle_lists()
301 BUG_ON((res->state & (DLM_LOCK_RES_MIGRATING| in dlm_shuffle_lists()
306 if (list_empty(&res->converting)) in dlm_shuffle_lists()
309 res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
311 target = list_entry(res->converting.next, struct dlm_lock, list); in dlm_shuffle_lists()
314 dlm->name, res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
317 head = &res->granted; in dlm_shuffle_lists()
327 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
336 head = &res->converting; in dlm_shuffle_lists()
345 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
360 "%d => %d, node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
361 res->lockname.name, in dlm_shuffle_lists()
369 list_move_tail(&target->list, &res->granted); in dlm_shuffle_lists()
376 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
383 if (list_empty(&res->blocked)) in dlm_shuffle_lists()
385 target = list_entry(res->blocked.next, struct dlm_lock, list); in dlm_shuffle_lists()
387 head = &res->granted; in dlm_shuffle_lists()
395 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
403 head = &res->converting; in dlm_shuffle_lists()
411 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
426 "node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
427 res->lockname.name, in dlm_shuffle_lists()
433 list_move_tail(&target->list, &res->granted); in dlm_shuffle_lists()
440 __dlm_lockres_reserve_ast(res); in dlm_shuffle_lists()
451 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_kick_thread() argument
453 if (res) { in dlm_kick_thread()
455 spin_lock(&res->spinlock); in dlm_kick_thread()
456 __dlm_dirty_lockres(dlm, res); in dlm_kick_thread()
457 spin_unlock(&res->spinlock); in dlm_kick_thread()
463 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_dirty_lockres() argument
466 assert_spin_locked(&res->spinlock); in __dlm_dirty_lockres()
469 if ((res->owner == dlm->node_num)) { in __dlm_dirty_lockres()
470 if (res->state & (DLM_LOCK_RES_MIGRATING | in __dlm_dirty_lockres()
474 if (list_empty(&res->dirty)) { in __dlm_dirty_lockres()
476 dlm_lockres_get(res); in __dlm_dirty_lockres()
477 list_add_tail(&res->dirty, &dlm->dirty_list); in __dlm_dirty_lockres()
478 res->state |= DLM_LOCK_RES_DIRTY; in __dlm_dirty_lockres()
482 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, in __dlm_dirty_lockres()
483 res->lockname.name); in __dlm_dirty_lockres()
526 struct dlm_lock_resource *res; in dlm_flush_asts() local
535 res = lock->lockres; in dlm_flush_asts()
537 "node %u\n", dlm->name, res->lockname.len, in dlm_flush_asts()
538 res->lockname.name, in dlm_flush_asts()
551 ret = dlm_do_remote_ast(dlm, res, lock); in dlm_flush_asts()
555 dlm_do_local_ast(dlm, res, lock); in dlm_flush_asts()
563 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
564 res->lockname.name); in dlm_flush_asts()
571 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
579 res = lock->lockres; in dlm_flush_asts()
597 dlm->name, res->lockname.len, res->lockname.name, in dlm_flush_asts()
603 ret = dlm_send_proxy_bast(dlm, res, lock, hi); in dlm_flush_asts()
607 dlm_do_local_bast(dlm, res, lock, hi); in dlm_flush_asts()
615 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
616 res->lockname.name); in dlm_flush_asts()
623 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
636 struct dlm_lock_resource *res; in dlm_thread() local
661 res = list_entry(dlm->dirty_list.next, in dlm_thread()
666 BUG_ON(!res); in dlm_thread()
667 dlm_lockres_get(res); in dlm_thread()
669 spin_lock(&res->spinlock); in dlm_thread()
671 list_del_init(&res->dirty); in dlm_thread()
672 spin_unlock(&res->spinlock); in dlm_thread()
675 dlm_lockres_put(res); in dlm_thread()
681 spin_lock(&res->spinlock); in dlm_thread()
682 if (res->owner != dlm->node_num) { in dlm_thread()
683 __dlm_print_one_lock_resource(res); in dlm_thread()
686 !!(res->state & DLM_LOCK_RES_IN_PROGRESS), in dlm_thread()
687 !!(res->state & DLM_LOCK_RES_MIGRATING), in dlm_thread()
688 !!(res->state & DLM_LOCK_RES_RECOVERING), in dlm_thread()
689 !!(res->state & DLM_LOCK_RES_DIRTY)); in dlm_thread()
691 BUG_ON(res->owner != dlm->node_num); in dlm_thread()
696 BUG_ON(res->state & DLM_LOCK_RES_MIGRATING); in dlm_thread()
697 if (res->state & (DLM_LOCK_RES_IN_PROGRESS | in dlm_thread()
700 res->state &= ~DLM_LOCK_RES_DIRTY; in dlm_thread()
701 spin_unlock(&res->spinlock); in dlm_thread()
705 res->lockname.len, res->lockname.name, in dlm_thread()
706 res->state); in dlm_thread()
717 dlm_shuffle_lists(dlm, res); in dlm_thread()
718 res->state &= ~DLM_LOCK_RES_DIRTY; in dlm_thread()
719 spin_unlock(&res->spinlock); in dlm_thread()
722 dlm_lockres_calc_usage(dlm, res); in dlm_thread()
730 spin_lock(&res->spinlock); in dlm_thread()
731 __dlm_dirty_lockres(dlm, res); in dlm_thread()
732 spin_unlock(&res->spinlock); in dlm_thread()
734 dlm_lockres_put(res); in dlm_thread()