diff options
author | Alexander Aring <aahringo@redhat.com> | 2022-06-22 20:45:16 +0200 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2022-06-24 18:57:48 +0200 |
commit | 3182599f5fff93a30bc094a4a20924eea47fcf42 (patch) | |
tree | d8816fb8c2b6113952de7683ecf978215c85667f | |
parent | fs: dlm: make new_lockspace() wait until recovery completes (diff) | |
download | linux-3182599f5fff93a30bc094a4a20924eea47fcf42.tar.xz linux-3182599f5fff93a30bc094a4a20924eea47fcf42.zip |
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>
-rw-r--r-- | fs/dlm/recoverd.c | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/fs/dlm/recoverd.c b/fs/dlm/recoverd.c index ff00b710486b..e15eb511b04b 100644 --- a/fs/dlm/recoverd.c +++ b/fs/dlm/recoverd.c @@ -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); } |