Lines Matching refs:res

40 /* will exit holding res->spinlock, but may drop in function */
41 /* waits until flags are cleared on res->state */
42 void __dlm_wait_on_lockres_flags(struct dlm_lock_resource *res, int flags)
46 assert_spin_locked(&res->spinlock);
48 add_wait_queue(&res->wq, &wait);
51 if (res->state & flags) {
52 spin_unlock(&res->spinlock);
54 spin_lock(&res->spinlock);
57 remove_wait_queue(&res->wq, &wait);
61 int __dlm_lockres_has_locks(struct dlm_lock_resource *res)
63 if (list_empty(&res->granted) &&
64 list_empty(&res->converting) &&
65 list_empty(&res->blocked))
74 int __dlm_lockres_unused(struct dlm_lock_resource *res)
78 assert_spin_locked(&res->spinlock);
80 if (__dlm_lockres_has_locks(res))
84 if (res->inflight_locks)
87 if (!list_empty(&res->dirty) || res->state & DLM_LOCK_RES_DIRTY)
90 if (res->state & (DLM_LOCK_RES_RECOVERING|
95 bit = find_first_bit(res->refmap, O2NM_MAX_NODES);
107 struct dlm_lock_resource *res)
110 assert_spin_locked(&res->spinlock);
112 if (__dlm_lockres_unused(res)){
113 if (list_empty(&res->purge)) {
114 mlog(0, "%s: Adding res %.*s to purge list\n",
115 dlm->name, res->lockname.len, res->lockname.name);
117 res->last_used = jiffies;
118 dlm_lockres_get(res);
119 list_add_tail(&res->purge, &dlm->purge_list);
122 } else if (!list_empty(&res->purge)) {
123 mlog(0, "%s: Removing res %.*s from purge list\n",
124 dlm->name, res->lockname.len, res->lockname.name);
126 list_del_init(&res->purge);
127 dlm_lockres_put(res);
133 struct dlm_lock_resource *res)
136 spin_lock(&res->spinlock);
138 __dlm_lockres_calc_usage(dlm, res);
140 spin_unlock(&res->spinlock);
151 struct dlm_lock_resource *res)
154 assert_spin_locked(&res->spinlock);
156 if (!list_empty(&res->purge)) {
157 mlog(0, "%s: Removing res %.*s from purgelist\n",
158 dlm->name, res->lockname.len, res->lockname.name);
159 list_del_init(&res->purge);
160 dlm_lockres_put(res);
164 if (!__dlm_lockres_unused(res)) {
165 mlog(ML_ERROR, "%s: res %.*s in use after deref\n",
166 dlm->name, res->lockname.len, res->lockname.name);
167 __dlm_print_one_lock_resource(res);
171 __dlm_unhash_lockres(dlm, res);
174 if (!list_empty(&res->tracking))
175 list_del_init(&res->tracking);
178 dlm->name, res->lockname.len, res->lockname.name);
179 __dlm_print_one_lock_resource(res);
187 res->state &= ~DLM_LOCK_RES_DROPPING_REF;
191 struct dlm_lock_resource *res)
197 assert_spin_locked(&res->spinlock);
199 master = (res->owner == dlm->node_num);
201 mlog(0, "%s: Purging res %.*s, master %d\n", dlm->name,
202 res->lockname.len, res->lockname.name, master);
205 if (res->state & DLM_LOCK_RES_DROPPING_REF) {
206 mlog(ML_NOTICE, "%s: res %.*s already in DLM_LOCK_RES_DROPPING_REF state\n",
207 dlm->name, res->lockname.len, res->lockname.name);
208 spin_unlock(&res->spinlock);
212 res->state |= DLM_LOCK_RES_DROPPING_REF;
214 spin_unlock(&res->spinlock);
217 spin_lock(&res->spinlock);
219 __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG);
220 spin_unlock(&res->spinlock);
223 ret = dlm_drop_lockres_ref(dlm, res);
229 spin_lock(&res->spinlock);
232 if (!list_empty(&res->purge)) {
233 mlog(0, "%s: Removing res %.*s from purgelist, master %d\n",
234 dlm->name, res->lockname.len, res->lockname.name, master);
235 list_del_init(&res->purge);
236 dlm_lockres_put(res);
242 dlm->name, res->lockname.len, res->lockname.name);
243 spin_unlock(&res->spinlock);
247 if (!__dlm_lockres_unused(res)) {
248 mlog(ML_ERROR, "%s: res %.*s in use after deref\n",
249 dlm->name, res->lockname.len, res->lockname.name);
250 __dlm_print_one_lock_resource(res);
254 __dlm_unhash_lockres(dlm, res);
257 if (!list_empty(&res->tracking))
258 list_del_init(&res->tracking);
261 res->lockname.len, res->lockname.name);
262 __dlm_print_one_lock_resource(res);
269 res->state &= ~DLM_LOCK_RES_DROPPING_REF;
270 spin_unlock(&res->spinlock);
271 wake_up(&res->wq);
273 spin_unlock(&res->spinlock);
316 mlog(0, "%s: res %.*s is in use or being remastered, "
341 struct dlm_lock_resource *res)
353 assert_spin_locked(&res->spinlock);
354 BUG_ON((res->state & (DLM_LOCK_RES_MIGRATING|
359 if (list_empty(&res->converting))
361 mlog(0, "%s: res %.*s has locks on the convert queue\n", dlm->name,
362 res->lockname.len, res->lockname.name);
364 target = list_entry(res->converting.next, struct dlm_lock, list);
366 mlog(ML_ERROR, "%s: res %.*s converting lock to invalid mode\n",
367 dlm->name, res->lockname.len, res->lockname.name);
370 list_for_each_entry(lock, &res->granted, list) {
378 __dlm_lockres_reserve_ast(res);
388 list_for_each_entry(lock, &res->converting, list) {
395 __dlm_lockres_reserve_ast(res);
409 mlog(0, "%s: res %.*s, AST for Converting lock %u:%llu, type "
410 "%d => %d, node %u\n", dlm->name, res->lockname.len,
411 res->lockname.name,
419 list_move_tail(&target->list, &res->granted);
426 __dlm_lockres_reserve_ast(res);
433 if (list_empty(&res->blocked))
435 target = list_entry(res->blocked.next, struct dlm_lock, list);
437 list_for_each_entry(lock, &res->granted, list) {
443 __dlm_lockres_reserve_ast(res);
451 list_for_each_entry(lock, &res->converting, list) {
457 __dlm_lockres_reserve_ast(res);
471 mlog(0, "%s: res %.*s, AST for Blocked lock %u:%llu, type %d, "
472 "node %u\n", dlm->name, res->lockname.len,
473 res->lockname.name,
479 list_move_tail(&target->list, &res->granted);
486 __dlm_lockres_reserve_ast(res);
496 /* must have NO locks when calling this with res !=NULL * */
497 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res)
499 if (res) {
501 spin_lock(&res->spinlock);
502 __dlm_dirty_lockres(dlm, res);
503 spin_unlock(&res->spinlock);
509 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res)
512 assert_spin_locked(&res->spinlock);
515 if (res->owner == dlm->node_num) {
516 if (res->state & (DLM_LOCK_RES_MIGRATING |
520 if (list_empty(&res->dirty)) {
522 dlm_lockres_get(res);
523 list_add_tail(&res->dirty, &dlm->dirty_list);
524 res->state |= DLM_LOCK_RES_DIRTY;
528 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len,
529 res->lockname.name);
573 struct dlm_lock_resource *res;
582 res = lock->lockres;
583 mlog(0, "%s: res %.*s, Flush AST for lock %u:%llu, type %d, "
584 "node %u\n", dlm->name, res->lockname.len,
585 res->lockname.name,
598 ret = dlm_do_remote_ast(dlm, res, lock);
602 dlm_do_local_ast(dlm, res, lock);
609 mlog(0, "%s: res %.*s, AST queued while flushing last "
610 "one\n", dlm->name, res->lockname.len,
611 res->lockname.name);
618 dlm_lockres_release_ast(dlm, res);
626 res = lock->lockres;
642 mlog(0, "%s: res %.*s, Flush BAST for lock %u:%llu, "
644 dlm->name, res->lockname.len, res->lockname.name,
650 ret = dlm_send_proxy_bast(dlm, res, lock, hi);
654 dlm_do_local_bast(dlm, res, lock, hi);
661 mlog(0, "%s: res %.*s, BAST queued while flushing last "
662 "one\n", dlm->name, res->lockname.len,
663 res->lockname.name);
670 dlm_lockres_release_ast(dlm, res);
682 struct dlm_lock_resource *res;
702 * res->spinlock needs to be taken again to protect
707 res = list_entry(dlm->dirty_list.next,
712 BUG_ON(!res);
713 dlm_lockres_get(res);
715 spin_lock(&res->spinlock);
717 list_del_init(&res->dirty);
718 spin_unlock(&res->spinlock);
721 dlm_lockres_put(res);
727 spin_lock(&res->spinlock);
728 if (res->owner != dlm->node_num) {
729 __dlm_print_one_lock_resource(res);
732 !!(res->state & DLM_LOCK_RES_IN_PROGRESS),
733 !!(res->state & DLM_LOCK_RES_MIGRATING),
734 !!(res->state & DLM_LOCK_RES_RECOVERING),
735 !!(res->state & DLM_LOCK_RES_DIRTY));
737 BUG_ON(res->owner != dlm->node_num);
742 BUG_ON(res->state & DLM_LOCK_RES_MIGRATING);
743 if (res->state & (DLM_LOCK_RES_IN_PROGRESS |
747 res->state &= ~DLM_LOCK_RES_DIRTY;
748 spin_unlock(&res->spinlock);
750 mlog(0, "%s: res %.*s, inprogress, delay list "
752 res->lockname.len, res->lockname.name,
753 res->state);
764 dlm_shuffle_lists(dlm, res);
765 res->state &= ~DLM_LOCK_RES_DIRTY;
766 spin_unlock(&res->spinlock);
769 dlm_lockres_calc_usage(dlm, res);
777 spin_lock(&res->spinlock);
778 __dlm_dirty_lockres(dlm, res);
779 spin_unlock(&res->spinlock);
781 dlm_lockres_put(res);