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:
parent
682bb91b6b
commit
3182599f5f
@ -243,27 +243,12 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
|
|||||||
jiffies_to_msecs(jiffies - start));
|
jiffies_to_msecs(jiffies - start));
|
||||||
mutex_unlock(&ls->ls_recoverd_active);
|
mutex_unlock(&ls->ls_recoverd_active);
|
||||||
|
|
||||||
ls->ls_recovery_result = 0;
|
|
||||||
complete(&ls->ls_recovery_done);
|
|
||||||
|
|
||||||
dlm_lsop_recover_done(ls);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
dlm_release_root_list(ls);
|
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);
|
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;
|
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)
|
static void do_ls_recovery(struct dlm_ls *ls)
|
||||||
{
|
{
|
||||||
struct dlm_recover *rv = NULL;
|
struct dlm_recover *rv = NULL;
|
||||||
|
int error;
|
||||||
|
|
||||||
spin_lock(&ls->ls_recover_lock);
|
spin_lock(&ls->ls_recover_lock);
|
||||||
rv = ls->ls_recover_args;
|
rv = ls->ls_recover_args;
|
||||||
@ -283,7 +269,31 @@ static void do_ls_recovery(struct dlm_ls *ls)
|
|||||||
spin_unlock(&ls->ls_recover_lock);
|
spin_unlock(&ls->ls_recover_lock);
|
||||||
|
|
||||||
if (rv) {
|
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->nodes);
|
||||||
kfree(rv);
|
kfree(rv);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user