Lines Matching refs:res
42 /* will exit holding res->spinlock, but may drop in function */
43 /* waits until flags are cleared on res->state */
44 void __dlm_wait_on_lockres_flags(struct dlm_lock_resource *res, int flags)
48 assert_spin_locked(&res->spinlock);
50 add_wait_queue(&res->wq, &wait);
53 if (res->state & flags) {
54 spin_unlock(&res->spinlock);
56 spin_lock(&res->spinlock);
59 remove_wait_queue(&res->wq, &wait);
63 int __dlm_lockres_has_locks(struct dlm_lock_resource *res)
65 if (list_empty(&res->granted) &&
66 list_empty(&res->converting) &&
67 list_empty(&res->blocked))
76 int __dlm_lockres_unused(struct dlm_lock_resource *res)
80 assert_spin_locked(&res->spinlock);
82 if (__dlm_lockres_has_locks(res))
86 if (res->inflight_locks)
89 if (!list_empty(&res->dirty) || res->state & DLM_LOCK_RES_DIRTY)
92 if (res->state & (DLM_LOCK_RES_RECOVERING|
97 bit = find_next_bit(res->refmap, O2NM_MAX_NODES, 0);
109 struct dlm_lock_resource *res)
112 assert_spin_locked(&res->spinlock);
114 if (__dlm_lockres_unused(res)){
115 if (list_empty(&res->purge)) {
116 mlog(0, "%s: Adding res %.*s to purge list\n",
117 dlm->name, res->lockname.len, res->lockname.name);
119 res->last_used = jiffies;
120 dlm_lockres_get(res);
121 list_add_tail(&res->purge, &dlm->purge_list);
124 } else if (!list_empty(&res->purge)) {
125 mlog(0, "%s: Removing res %.*s from purge list\n",
126 dlm->name, res->lockname.len, res->lockname.name);
128 list_del_init(&res->purge);
129 dlm_lockres_put(res);
135 struct dlm_lock_resource *res)
138 spin_lock(&res->spinlock);
140 __dlm_lockres_calc_usage(dlm, res);
142 spin_unlock(&res->spinlock);
153 struct dlm_lock_resource *res)
156 assert_spin_locked(&res->spinlock);
158 if (!list_empty(&res->purge)) {
159 mlog(0, "%s: Removing res %.*s from purgelist\n",
160 dlm->name, res->lockname.len, res->lockname.name);
161 list_del_init(&res->purge);
162 dlm_lockres_put(res);
166 if (!__dlm_lockres_unused(res)) {
167 mlog(ML_ERROR, "%s: res %.*s in use after deref\n",
168 dlm->name, res->lockname.len, res->lockname.name);
169 __dlm_print_one_lock_resource(res);
173 __dlm_unhash_lockres(dlm, res);
176 if (!list_empty(&res->tracking))
177 list_del_init(&res->tracking);
180 dlm->name, res->lockname.len, res->lockname.name);
181 __dlm_print_one_lock_resource(res);
189 res->state &= ~DLM_LOCK_RES_DROPPING_REF;
193 struct dlm_lock_resource *res)
199 assert_spin_locked(&res->spinlock);
201 master = (res->owner == dlm->node_num);
203 mlog(0, "%s: Purging res %.*s, master %d\n", dlm->name,
204 res->lockname.len, res->lockname.name, master);
207 if (res->state & DLM_LOCK_RES_DROPPING_REF) {
208 mlog(ML_NOTICE, "%s: res %.*s already in DLM_LOCK_RES_DROPPING_REF state\n",
209 dlm->name, res->lockname.len, res->lockname.name);
210 spin_unlock(&res->spinlock);
214 res->state |= DLM_LOCK_RES_DROPPING_REF;
216 spin_unlock(&res->spinlock);
219 spin_lock(&res->spinlock);
221 __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG);
222 spin_unlock(&res->spinlock);
225 ret = dlm_drop_lockres_ref(dlm, res);
231 spin_lock(&res->spinlock);
234 if (!list_empty(&res->purge)) {
235 mlog(0, "%s: Removing res %.*s from purgelist, master %d\n",
236 dlm->name, res->lockname.len, res->lockname.name, master);
237 list_del_init(&res->purge);
238 dlm_lockres_put(res);
244 dlm->name, res->lockname.len, res->lockname.name);
245 spin_unlock(&res->spinlock);
249 if (!__dlm_lockres_unused(res)) {
250 mlog(ML_ERROR, "%s: res %.*s in use after deref\n",
251 dlm->name, res->lockname.len, res->lockname.name);
252 __dlm_print_one_lock_resource(res);
256 __dlm_unhash_lockres(dlm, res);
259 if (!list_empty(&res->tracking))
260 list_del_init(&res->tracking);
263 res->lockname.len, res->lockname.name);
264 __dlm_print_one_lock_resource(res);
271 res->state &= ~DLM_LOCK_RES_DROPPING_REF;
272 spin_unlock(&res->spinlock);
273 wake_up(&res->wq);
275 spin_unlock(&res->spinlock);
318 mlog(0, "%s: res %.*s is in use or being remastered, "
343 struct dlm_lock_resource *res)
355 assert_spin_locked(&res->spinlock);
356 BUG_ON((res->state & (DLM_LOCK_RES_MIGRATING|
361 if (list_empty(&res->converting))
363 mlog(0, "%s: res %.*s has locks on the convert queue\n", dlm->name,
364 res->lockname.len, res->lockname.name);
366 target = list_entry(res->converting.next, struct dlm_lock, list);
368 mlog(ML_ERROR, "%s: res %.*s converting lock to invalid mode\n",
369 dlm->name, res->lockname.len, res->lockname.name);
372 list_for_each_entry(lock, &res->granted, list) {
380 __dlm_lockres_reserve_ast(res);
390 list_for_each_entry(lock, &res->converting, list) {
397 __dlm_lockres_reserve_ast(res);
411 mlog(0, "%s: res %.*s, AST for Converting lock %u:%llu, type "
412 "%d => %d, node %u\n", dlm->name, res->lockname.len,
413 res->lockname.name,
421 list_move_tail(&target->list, &res->granted);
428 __dlm_lockres_reserve_ast(res);
435 if (list_empty(&res->blocked))
437 target = list_entry(res->blocked.next, struct dlm_lock, list);
439 list_for_each_entry(lock, &res->granted, list) {
445 __dlm_lockres_reserve_ast(res);
453 list_for_each_entry(lock, &res->converting, list) {
459 __dlm_lockres_reserve_ast(res);
473 mlog(0, "%s: res %.*s, AST for Blocked lock %u:%llu, type %d, "
474 "node %u\n", dlm->name, res->lockname.len,
475 res->lockname.name,
481 list_move_tail(&target->list, &res->granted);
488 __dlm_lockres_reserve_ast(res);
498 /* must have NO locks when calling this with res !=NULL * */
499 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res)
501 if (res) {
503 spin_lock(&res->spinlock);
504 __dlm_dirty_lockres(dlm, res);
505 spin_unlock(&res->spinlock);
511 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res)
514 assert_spin_locked(&res->spinlock);
517 if (res->owner == dlm->node_num) {
518 if (res->state & (DLM_LOCK_RES_MIGRATING |
522 if (list_empty(&res->dirty)) {
524 dlm_lockres_get(res);
525 list_add_tail(&res->dirty, &dlm->dirty_list);
526 res->state |= DLM_LOCK_RES_DIRTY;
530 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len,
531 res->lockname.name);
575 struct dlm_lock_resource *res;
584 res = lock->lockres;
585 mlog(0, "%s: res %.*s, Flush AST for lock %u:%llu, type %d, "
586 "node %u\n", dlm->name, res->lockname.len,
587 res->lockname.name,
600 ret = dlm_do_remote_ast(dlm, res, lock);
604 dlm_do_local_ast(dlm, res, lock);
611 mlog(0, "%s: res %.*s, AST queued while flushing last "
612 "one\n", dlm->name, res->lockname.len,
613 res->lockname.name);
620 dlm_lockres_release_ast(dlm, res);
628 res = lock->lockres;
644 mlog(0, "%s: res %.*s, Flush BAST for lock %u:%llu, "
646 dlm->name, res->lockname.len, res->lockname.name,
652 ret = dlm_send_proxy_bast(dlm, res, lock, hi);
656 dlm_do_local_bast(dlm, res, lock, hi);
663 mlog(0, "%s: res %.*s, BAST queued while flushing last "
664 "one\n", dlm->name, res->lockname.len,
665 res->lockname.name);
672 dlm_lockres_release_ast(dlm, res);
684 struct dlm_lock_resource *res;
704 * res->spinlock needs to be taken again to protect
709 res = list_entry(dlm->dirty_list.next,
714 BUG_ON(!res);
715 dlm_lockres_get(res);
717 spin_lock(&res->spinlock);
719 list_del_init(&res->dirty);
720 spin_unlock(&res->spinlock);
723 dlm_lockres_put(res);
729 spin_lock(&res->spinlock);
730 if (res->owner != dlm->node_num) {
731 __dlm_print_one_lock_resource(res);
734 !!(res->state & DLM_LOCK_RES_IN_PROGRESS),
735 !!(res->state & DLM_LOCK_RES_MIGRATING),
736 !!(res->state & DLM_LOCK_RES_RECOVERING),
737 !!(res->state & DLM_LOCK_RES_DIRTY));
739 BUG_ON(res->owner != dlm->node_num);
744 BUG_ON(res->state & DLM_LOCK_RES_MIGRATING);
745 if (res->state & (DLM_LOCK_RES_IN_PROGRESS |
749 res->state &= ~DLM_LOCK_RES_DIRTY;
750 spin_unlock(&res->spinlock);
752 mlog(0, "%s: res %.*s, inprogress, delay list "
754 res->lockname.len, res->lockname.name,
755 res->state);
766 dlm_shuffle_lists(dlm, res);
767 res->state &= ~DLM_LOCK_RES_DIRTY;
768 spin_unlock(&res->spinlock);
771 dlm_lockres_calc_usage(dlm, res);
779 spin_lock(&res->spinlock);
780 __dlm_dirty_lockres(dlm, res);
781 spin_unlock(&res->spinlock);
783 dlm_lockres_put(res);