* GPL HEADER END
*/
/*
- * Copyright (c) 2013, 2015, Intel Corporation.
+ * Copyright (c) 2013, 2016, Intel Corporation.
*/
/*
* lustre/lfsck/lfsck_engine.c
GOTO(out, rc = PTR_ERR(di));
rc = iops->load(env, di, cookie);
- if (rc == 0 || (rc > 0 && cookie > 0))
+ if (rc == -ENODATA)
+ rc = 1;
+ else if (rc == 0 || (rc > 0 && cookie > 0))
rc = iops->next(env, di);
else if (rc > 0)
rc = 0;
/* Init otable-based iterator. */
if (pos == NULL) {
rc = iops->load(env, lfsck->li_di_oit, 0);
- if (rc > 0) {
+ if (rc > 0 || unlikely(rc == -ENODATA)) {
lfsck->li_oit_over = 1;
rc = 0;
}
}
rc = iops->load(env, lfsck->li_di_oit, pos->lp_oit_cookie);
- if (rc < 0)
- GOTO(out, rc);
- else if (rc > 0)
+ if (rc > 0 || unlikely(rc == -ENODATA))
lfsck->li_oit_over = 1;
+ else if (rc < 0)
+ GOTO(out, rc);
if (!lfsck->li_master || fid_is_zero(&pos->lp_dir_parent))
GOTO(out, rc = 0);
if (unlikely(lad->lad_exit ||
!thread_is_running(mthread)))
- GOTO(cleanup1, rc = lad->lad_post_result);
+ GOTO(cleanup, rc = lad->lad_post_result);
lar = list_entry(lad->lad_req_list.next,
struct lfsck_assistant_req,
lao->la_req_fini(env, lar);
if (rc < 0 && bk->lb_param & LPF_FAILOUT)
- GOTO(cleanup1, rc);
+ GOTO(cleanup, rc);
}
l_wait_event(athread->t_ctl_waitq,
&lwi);
if (unlikely(lad->lad_exit))
- GOTO(cleanup1, rc = lad->lad_post_result);
+ GOTO(cleanup, rc = lad->lad_post_result);
if (!list_empty(&lad->lad_req_list))
continue;
lfsck_lfsck2name(lfsck), lad->lad_name);
if (unlikely(lad->lad_exit))
- GOTO(cleanup1, rc = lad->lad_post_result);
+ GOTO(cleanup, rc = lad->lad_post_result);
lad->lad_to_post = 0;
LASSERT(lad->lad_post_result > 0);
lfsck_lfsck2name(lfsck), rc2);
if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_NO_DOUBLESCAN))
- GOTO(cleanup2, rc = 0);
+ GOTO(cleanup, rc = 0);
while (lad->lad_in_double_scan) {
rc = lfsck_assistant_query_others(env, com);
goto p2_next;
if (rc < 0)
- GOTO(cleanup2, rc);
+ GOTO(cleanup, rc);
/* Pull LFSCK status on related targets once
* per 30 seconds if we are not notified. */
if (unlikely(lad->lad_exit ||
!thread_is_running(mthread)))
- GOTO(cleanup2, rc = 0);
+ GOTO(cleanup, rc = 0);
if (rc == -ETIMEDOUT)
continue;
if (rc < 0)
- GOTO(cleanup2, rc);
+ GOTO(cleanup, rc);
p2_next:
rc = lao->la_handler_p2(env, com);
if (rc != 0)
- GOTO(cleanup2, rc);
+ GOTO(cleanup, rc);
if (unlikely(lad->lad_exit ||
!thread_is_running(mthread)))
- GOTO(cleanup2, rc = 0);
+ GOTO(cleanup, rc = 0);
}
}
}
-cleanup1:
+cleanup:
/* Cleanup the unfinished requests. */
spin_lock(&lad->lad_lock);
if (rc < 0)
if (lad->lad_exit && lad->lad_post_result <= 0)
lao->la_fill_pos(env, com, &lfsck->li_pos_checkpoint);
+ thread_set_flags(athread, SVC_STOPPING);
while (!list_empty(&lad->lad_req_list)) {
lar = list_entry(lad->lad_req_list.next,
struct lfsck_assistant_req,
LASSERTF(lad->lad_prefetched == 0, "unmatched prefeteched objs %d\n",
lad->lad_prefetched);
-cleanup2:
memset(lr, 0, sizeof(*lr));
if (rc > 0) {
lr->lr_event = LE_PHASE2_DONE;