static int dlm_recoverd(void *arg) { struct dlm_ls *ls; ls = dlm_find_lockspace_local(arg); if (!ls) { log_print("dlm_recoverd: no lockspace %p", arg); return -1; } down_write(&ls->ls_in_recovery); set_bit(LSFL_RECOVER_LOCK, &ls->ls_flags); wake_up(&ls->ls_recover_lock_wait); while (1) { /* * We call kthread_should_stop() after set_current_state(). * This is because it works correctly if kthread_stop() is * called just before set_current_state(). */ set_current_state(TASK_INTERRUPTIBLE); if (kthread_should_stop()) { set_current_state(TASK_RUNNING); break; } if (!test_bit(LSFL_RECOVER_WORK, &ls->ls_flags) && !test_bit(LSFL_RECOVER_DOWN, &ls->ls_flags)) { if (kthread_should_stop()) break; schedule(); } set_current_state(TASK_RUNNING); if (test_and_clear_bit(LSFL_RECOVER_DOWN, &ls->ls_flags)) { down_write(&ls->ls_in_recovery); set_bit(LSFL_RECOVER_LOCK, &ls->ls_flags); wake_up(&ls->ls_recover_lock_wait); } if (test_and_clear_bit(LSFL_RECOVER_WORK, &ls->ls_flags)) do_ls_recovery(ls); } if (test_bit(LSFL_RECOVER_LOCK, &ls->ls_flags)) up_write(&ls->ls_in_recovery); dlm_put_lockspace(ls); return 0; }
static int dlm_recoverd(void *arg) { struct dlm_ls *ls; ls = dlm_find_lockspace_local(arg); if (!ls) { log_print("dlm_recoverd: no lockspace %p", arg); return -1; } while (!kthread_should_stop()) { set_current_state(TASK_INTERRUPTIBLE); if (!test_bit(LSFL_WORK, &ls->ls_flags)) schedule(); set_current_state(TASK_RUNNING); if (test_and_clear_bit(LSFL_WORK, &ls->ls_flags)) do_ls_recovery(ls); } dlm_put_lockspace(ls); return 0; }
static int dlm_recoverd(void *arg) { struct dlm_ls *ls; ls = dlm_find_lockspace_local(arg); if (!ls) { log_print("dlm_recoverd: no lockspace %p", arg); return -1; } down_write(&ls->ls_in_recovery); set_bit(LSFL_RECOVER_LOCK, &ls->ls_flags); wake_up(&ls->ls_recover_lock_wait); while (!kthread_should_stop()) { set_current_state(TASK_INTERRUPTIBLE); if (!test_bit(LSFL_RECOVER_WORK, &ls->ls_flags) && !test_bit(LSFL_RECOVER_DOWN, &ls->ls_flags)) schedule(); set_current_state(TASK_RUNNING); if (test_and_clear_bit(LSFL_RECOVER_DOWN, &ls->ls_flags)) { down_write(&ls->ls_in_recovery); set_bit(LSFL_RECOVER_LOCK, &ls->ls_flags); wake_up(&ls->ls_recover_lock_wait); } if (test_and_clear_bit(LSFL_RECOVER_WORK, &ls->ls_flags)) do_ls_recovery(ls); } if (test_bit(LSFL_RECOVER_LOCK, &ls->ls_flags)) up_write(&ls->ls_in_recovery); dlm_put_lockspace(ls); return 0; }