Lines Matching full:ls
23 static int dlm_create_masters_list(struct dlm_ls *ls) in dlm_create_masters_list() argument
28 write_lock_bh(&ls->ls_masters_lock); in dlm_create_masters_list()
29 if (!list_empty(&ls->ls_masters_list)) { in dlm_create_masters_list()
30 log_error(ls, "root list not empty"); in dlm_create_masters_list()
35 read_lock_bh(&ls->ls_rsbtbl_lock); in dlm_create_masters_list()
36 list_for_each_entry(r, &ls->ls_slow_active, res_slow_list) { in dlm_create_masters_list()
40 list_add(&r->res_masters_list, &ls->ls_masters_list); in dlm_create_masters_list()
43 read_unlock_bh(&ls->ls_rsbtbl_lock); in dlm_create_masters_list()
45 write_unlock_bh(&ls->ls_masters_lock); in dlm_create_masters_list()
49 static void dlm_release_masters_list(struct dlm_ls *ls) in dlm_release_masters_list() argument
53 write_lock_bh(&ls->ls_masters_lock); in dlm_release_masters_list()
54 list_for_each_entry_safe(r, safe, &ls->ls_masters_list, res_masters_list) { in dlm_release_masters_list()
58 write_unlock_bh(&ls->ls_masters_lock); in dlm_release_masters_list()
61 static void dlm_create_root_list(struct dlm_ls *ls, struct list_head *root_list) in dlm_create_root_list() argument
65 read_lock_bh(&ls->ls_rsbtbl_lock); in dlm_create_root_list()
66 list_for_each_entry(r, &ls->ls_slow_active, res_slow_list) { in dlm_create_root_list()
71 WARN_ON_ONCE(!list_empty(&ls->ls_slow_inactive)); in dlm_create_root_list()
72 read_unlock_bh(&ls->ls_rsbtbl_lock); in dlm_create_root_list()
92 static int enable_locking(struct dlm_ls *ls, uint64_t seq) in enable_locking() argument
96 write_lock_bh(&ls->ls_recv_active); in enable_locking()
98 spin_lock_bh(&ls->ls_recover_lock); in enable_locking()
99 if (ls->ls_recover_seq == seq) { in enable_locking()
100 set_bit(LSFL_RUNNING, &ls->ls_flags); in enable_locking()
110 resume_scan_timer(ls); in enable_locking()
112 up_write(&ls->ls_in_recovery); in enable_locking()
113 clear_bit(LSFL_RECOVER_LOCK, &ls->ls_flags); in enable_locking()
116 spin_unlock_bh(&ls->ls_recover_lock); in enable_locking()
118 write_unlock_bh(&ls->ls_recv_active); in enable_locking()
122 static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv) in ls_recover() argument
128 log_rinfo(ls, "dlm_recover %llu", (unsigned long long)rv->seq); in ls_recover()
130 mutex_lock(&ls->ls_recoverd_active); in ls_recover()
132 dlm_callback_suspend(ls); in ls_recover()
134 dlm_clear_inactive(ls); in ls_recover()
141 dlm_create_root_list(ls, &root_list); in ls_recover()
151 error = dlm_recover_members(ls, rv, &neg); in ls_recover()
153 log_rinfo(ls, "dlm_recover_members error %d", error); in ls_recover()
157 dlm_recover_dir_nodeid(ls, &root_list); in ls_recover()
170 error = dlm_create_masters_list(ls); in ls_recover()
172 log_rinfo(ls, "dlm_create_masters_list error %d", error); in ls_recover()
176 ls->ls_recover_locks_in = 0; in ls_recover()
178 dlm_set_recover_status(ls, DLM_RS_NODES); in ls_recover()
180 error = dlm_recover_members_wait(ls, rv->seq); in ls_recover()
182 log_rinfo(ls, "dlm_recover_members_wait error %d", error); in ls_recover()
183 dlm_release_masters_list(ls); in ls_recover()
194 error = dlm_recover_directory(ls, rv->seq); in ls_recover()
196 log_rinfo(ls, "dlm_recover_directory error %d", error); in ls_recover()
197 dlm_release_masters_list(ls); in ls_recover()
201 dlm_set_recover_status(ls, DLM_RS_DIR); in ls_recover()
203 error = dlm_recover_directory_wait(ls, rv->seq); in ls_recover()
205 log_rinfo(ls, "dlm_recover_directory_wait error %d", error); in ls_recover()
206 dlm_release_masters_list(ls); in ls_recover()
210 dlm_release_masters_list(ls); in ls_recover()
218 dlm_recover_waiters_pre(ls); in ls_recover()
220 if (dlm_recovery_stopped(ls)) { in ls_recover()
225 if (neg || dlm_no_directory(ls)) { in ls_recover()
230 dlm_recover_purge(ls, &root_list); in ls_recover()
237 error = dlm_recover_masters(ls, rv->seq, &root_list); in ls_recover()
239 log_rinfo(ls, "dlm_recover_masters error %d", error); in ls_recover()
247 error = dlm_recover_locks(ls, rv->seq, &root_list); in ls_recover()
249 log_rinfo(ls, "dlm_recover_locks error %d", error); in ls_recover()
253 dlm_set_recover_status(ls, DLM_RS_LOCKS); in ls_recover()
255 error = dlm_recover_locks_wait(ls, rv->seq); in ls_recover()
257 log_rinfo(ls, "dlm_recover_locks_wait error %d", error); in ls_recover()
261 log_rinfo(ls, "dlm_recover_locks %u in", in ls_recover()
262 ls->ls_recover_locks_in); in ls_recover()
270 dlm_recover_rsbs(ls, &root_list); in ls_recover()
277 dlm_set_recover_status(ls, DLM_RS_LOCKS); in ls_recover()
279 error = dlm_recover_locks_wait(ls, rv->seq); in ls_recover()
281 log_rinfo(ls, "dlm_recover_locks_wait error %d", error); in ls_recover()
294 dlm_purge_requestqueue(ls); in ls_recover()
296 dlm_set_recover_status(ls, DLM_RS_DONE); in ls_recover()
298 error = dlm_recover_done_wait(ls, rv->seq); in ls_recover()
300 log_rinfo(ls, "dlm_recover_done_wait error %d", error); in ls_recover()
304 dlm_clear_members_gone(ls); in ls_recover()
306 dlm_callback_resume(ls); in ls_recover()
308 error = enable_locking(ls, rv->seq); in ls_recover()
310 log_rinfo(ls, "enable_locking error %d", error); in ls_recover()
314 error = dlm_process_requestqueue(ls); in ls_recover()
316 log_rinfo(ls, "dlm_process_requestqueue error %d", error); in ls_recover()
320 error = dlm_recover_waiters_post(ls); in ls_recover()
322 log_rinfo(ls, "dlm_recover_waiters_post error %d", error); in ls_recover()
326 dlm_recover_grant(ls); in ls_recover()
328 log_rinfo(ls, "dlm_recover %llu generation %u done: %u ms", in ls_recover()
329 (unsigned long long)rv->seq, ls->ls_generation, in ls_recover()
331 mutex_unlock(&ls->ls_recoverd_active); in ls_recover()
338 mutex_unlock(&ls->ls_recoverd_active); in ls_recover()
347 static void do_ls_recovery(struct dlm_ls *ls) in do_ls_recovery() argument
352 spin_lock_bh(&ls->ls_recover_lock); in do_ls_recovery()
353 rv = ls->ls_recover_args; in do_ls_recovery()
354 ls->ls_recover_args = NULL; in do_ls_recovery()
355 if (rv && ls->ls_recover_seq == rv->seq) in do_ls_recovery()
356 clear_bit(LSFL_RECOVER_STOP, &ls->ls_flags); in do_ls_recovery()
357 spin_unlock_bh(&ls->ls_recover_lock); in do_ls_recovery()
360 error = ls_recover(ls, rv); in do_ls_recovery()
363 ls->ls_recovery_result = 0; in do_ls_recovery()
364 complete(&ls->ls_recovery_done); in do_ls_recovery()
366 dlm_lsop_recover_done(ls); in do_ls_recovery()
372 log_rinfo(ls, "%s %llu interrupted and should be queued to run again", in do_ls_recovery()
376 log_rinfo(ls, "%s %llu error %d", __func__, in do_ls_recovery()
380 ls->ls_recovery_result = error; in do_ls_recovery()
381 complete(&ls->ls_recovery_done); in do_ls_recovery()
392 struct dlm_ls *ls; in dlm_recoverd() local
394 ls = dlm_find_lockspace_local(arg); in dlm_recoverd()
395 if (!ls) { in dlm_recoverd()
400 down_write(&ls->ls_in_recovery); in dlm_recoverd()
401 set_bit(LSFL_RECOVER_LOCK, &ls->ls_flags); in dlm_recoverd()
402 wake_up(&ls->ls_recover_lock_wait); in dlm_recoverd()
415 if (!test_bit(LSFL_RECOVER_WORK, &ls->ls_flags) && in dlm_recoverd()
416 !test_bit(LSFL_RECOVER_DOWN, &ls->ls_flags)) { in dlm_recoverd()
423 if (test_and_clear_bit(LSFL_RECOVER_DOWN, &ls->ls_flags)) { in dlm_recoverd()
424 down_write(&ls->ls_in_recovery); in dlm_recoverd()
425 set_bit(LSFL_RECOVER_LOCK, &ls->ls_flags); in dlm_recoverd()
426 wake_up(&ls->ls_recover_lock_wait); in dlm_recoverd()
429 if (test_and_clear_bit(LSFL_RECOVER_WORK, &ls->ls_flags)) in dlm_recoverd()
430 do_ls_recovery(ls); in dlm_recoverd()
433 if (test_bit(LSFL_RECOVER_LOCK, &ls->ls_flags)) in dlm_recoverd()
434 up_write(&ls->ls_in_recovery); in dlm_recoverd()
436 dlm_put_lockspace(ls); in dlm_recoverd()
440 int dlm_recoverd_start(struct dlm_ls *ls) in dlm_recoverd_start() argument
445 p = kthread_run(dlm_recoverd, ls, "dlm_recoverd"); in dlm_recoverd_start()
449 ls->ls_recoverd_task = p; in dlm_recoverd_start()
453 void dlm_recoverd_stop(struct dlm_ls *ls) in dlm_recoverd_stop() argument
455 kthread_stop(ls->ls_recoverd_task); in dlm_recoverd_stop()
458 void dlm_recoverd_suspend(struct dlm_ls *ls) in dlm_recoverd_suspend() argument
460 wake_up(&ls->ls_wait_general); in dlm_recoverd_suspend()
461 mutex_lock(&ls->ls_recoverd_active); in dlm_recoverd_suspend()
464 void dlm_recoverd_resume(struct dlm_ls *ls) in dlm_recoverd_resume() argument
466 mutex_unlock(&ls->ls_recoverd_active); in dlm_recoverd_resume()