fs: dlm: handle recovery result outside of ls_recover
This patch cleans up the handling of recovery results by moving it from ls_recover() to the caller do_ls_recovery(). This makes the error handling clearer. Signed-off-by: Alexander Aring <aahringo@redhat.com> Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
Родитель
682bb91b6b
Коммит
3182599f5f
|
@ -243,27 +243,12 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
|
|||
jiffies_to_msecs(jiffies - start));
|
||||
mutex_unlock(&ls->ls_recoverd_active);
|
||||
|
||||
ls->ls_recovery_result = 0;
|
||||
complete(&ls->ls_recovery_done);
|
||||
|
||||
dlm_lsop_recover_done(ls);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
dlm_release_root_list(ls);
|
||||
log_rinfo(ls, "dlm_recover %llu error %d",
|
||||
(unsigned long long)rv->seq, error);
|
||||
mutex_unlock(&ls->ls_recoverd_active);
|
||||
|
||||
/* let new_lockspace() get aware of critical error if recovery
|
||||
* was interrupted -EINTR we wait for the next ls_recover()
|
||||
* iteration until it succeeds.
|
||||
*/
|
||||
if (error != -EINTR) {
|
||||
ls->ls_recovery_result = error;
|
||||
complete(&ls->ls_recovery_done);
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -274,6 +259,7 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
|
|||
static void do_ls_recovery(struct dlm_ls *ls)
|
||||
{
|
||||
struct dlm_recover *rv = NULL;
|
||||
int error;
|
||||
|
||||
spin_lock(&ls->ls_recover_lock);
|
||||
rv = ls->ls_recover_args;
|
||||
|
@ -283,7 +269,31 @@ static void do_ls_recovery(struct dlm_ls *ls)
|
|||
spin_unlock(&ls->ls_recover_lock);
|
||||
|
||||
if (rv) {
|
||||
ls_recover(ls, rv);
|
||||
error = ls_recover(ls, rv);
|
||||
switch (error) {
|
||||
case 0:
|
||||
ls->ls_recovery_result = 0;
|
||||
complete(&ls->ls_recovery_done);
|
||||
|
||||
dlm_lsop_recover_done(ls);
|
||||
break;
|
||||
case -EINTR:
|
||||
/* if recovery was interrupted -EINTR we wait for the next
|
||||
* ls_recover() iteration until it hopefully succeeds.
|
||||
*/
|
||||
log_rinfo(ls, "%s %llu interrupted and should be queued to run again",
|
||||
__func__, (unsigned long long)rv->seq);
|
||||
break;
|
||||
default:
|
||||
log_rinfo(ls, "%s %llu error %d", __func__,
|
||||
(unsigned long long)rv->seq, error);
|
||||
|
||||
/* let new_lockspace() get aware of critical error */
|
||||
ls->ls_recovery_result = error;
|
||||
complete(&ls->ls_recovery_done);
|
||||
break;
|
||||
}
|
||||
|
||||
kfree(rv->nodes);
|
||||
kfree(rv);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче