Whamcloud - gitweb
LU-8569 lfsck: cleanup lfsck requests list before exit
[fs/lustre-release.git] / lustre / lfsck / lfsck_layout.c
index 5dcd285..d1cff12 100644 (file)
@@ -20,7 +20,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright (c) 2014, Intel Corporation.
+ * Copyright (c) 2014, 2015, Intel Corporation.
  */
 /*
  * lustre/lfsck/lfsck_layout.c
@@ -72,6 +72,8 @@ struct lfsck_layout_slave_target {
        __u64                   llst_gen;
        atomic_t                llst_ref;
        __u32                   llst_index;
+       /* How many times we have failed to get the master status. */
+       int                     llst_failures;
 };
 
 struct lfsck_layout_slave_data {
@@ -395,7 +397,7 @@ static int lfsck_layout_verify_header(struct lov_mds_md_v1 *lmm)
        return 0;
 }
 
-#define LFSCK_RBTREE_BITMAP_SIZE       PAGE_CACHE_SIZE
+#define LFSCK_RBTREE_BITMAP_SIZE       PAGE_SIZE
 #define LFSCK_RBTREE_BITMAP_WIDTH      (LFSCK_RBTREE_BITMAP_SIZE << 3)
 #define LFSCK_RBTREE_BITMAP_MASK       (LFSCK_RBTREE_BITMAP_WIDTH - 1)
 
@@ -761,7 +763,7 @@ static int lfsck_layout_load_bitmap(const struct lu_env *env,
        struct dt_object                *obj    = com->lc_obj;
        struct lfsck_assistant_data     *lad    = com->lc_data;
        struct lfsck_layout             *lo     = com->lc_file_ram;
-       cfs_bitmap_t                    *bitmap = lad->lad_bitmap;
+       struct cfs_bitmap                       *bitmap = lad->lad_bitmap;
        loff_t                           pos    = com->lc_file_size;
        ssize_t                          size;
        __u32                            nbits;
@@ -779,7 +781,7 @@ static int lfsck_layout_load_bitmap(const struct lu_env *env,
 
        if (nbits > bitmap->size) {
                __u32 new_bits = bitmap->size;
-               cfs_bitmap_t *new_bitmap;
+               struct cfs_bitmap *new_bitmap;
 
                while (new_bits < nbits)
                        new_bits <<= 1;
@@ -887,7 +889,7 @@ static int lfsck_layout_store(const struct lu_env *env,
        struct lfsck_layout     *lo     = com->lc_file_disk;
        struct thandle          *th;
        struct dt_device        *dev    = lfsck_obj2dev(obj);
-       cfs_bitmap_t            *bitmap = NULL;
+       struct cfs_bitmap       *bitmap = NULL;
        loff_t                   pos;
        ssize_t                  size   = com->lc_file_size;
        __u32                    nbits  = 0;
@@ -1093,7 +1095,7 @@ stop:
 
 log:
        CDEBUG(D_LFSCK, "%s: layout LFSCK will create LAST_ID for <seq> "
-              LPX64": rc = %d\n",
+              "%#llx: rc = %d\n",
               lfsck_lfsck2name(lfsck), fid_seq(lfsck_dto2fid(obj)), rc);
 
        return rc;
@@ -1130,8 +1132,8 @@ lfsck_layout_lastid_reload(const struct lu_env *env,
                        lo->ll_flags |= LF_CRASHED_LASTID;
 
                        CDEBUG(D_LFSCK, "%s: layout LFSCK finds crashed "
-                              "LAST_ID file (1) for the sequence "LPX64
-                              ", old value "LPU64", known value "LPU64"\n",
+                              "LAST_ID file (1) for the sequence %#llx"
+                              ", old value %llu, known value %llu\n",
                               lfsck_lfsck2name(lfsck), lls->lls_seq,
                               lastid, lls->lls_lastid);
                }
@@ -1164,7 +1166,7 @@ lfsck_layout_lastid_store(const struct lu_env *env,
                        continue;
 
                CDEBUG(D_LFSCK, "%s: layout LFSCK will sync the LAST_ID for "
-                      "<seq> "LPX64" as <oid> "LPU64"\n",
+                      "<seq> %#llx as <oid> %llu\n",
                       lfsck_lfsck2name(lfsck), lls->lls_seq, lls->lls_lastid);
 
                if (bk->lb_param & LPF_DRYRUN) {
@@ -1176,7 +1178,7 @@ lfsck_layout_lastid_store(const struct lu_env *env,
                if (IS_ERR(th)) {
                        rc1 = PTR_ERR(th);
                        CDEBUG(D_LFSCK, "%s: layout LFSCK failed to store "
-                              "the LAST_ID for <seq> "LPX64"(1): rc = %d\n",
+                              "the LAST_ID for <seq> %#llx(1): rc = %d\n",
                               lfsck_lfsck2name(com->lc_lfsck),
                               lls->lls_seq, rc1);
                        continue;
@@ -1207,7 +1209,7 @@ stop:
                if (rc != 0) {
                        rc1 = rc;
                        CDEBUG(D_LFSCK, "%s: layout LFSCK failed to store "
-                              "the LAST_ID for <seq> "LPX64"(2): rc = %d\n",
+                              "the LAST_ID for <seq> %#llx(2): rc = %d\n",
                               lfsck_lfsck2name(com->lc_lfsck),
                               lls->lls_seq, rc1);
                }
@@ -1244,7 +1246,7 @@ lfsck_layout_lastid_load(const struct lu_env *env,
                        lo->ll_flags |= LF_CRASHED_LASTID;
 
                        CDEBUG(D_LFSCK, "%s: layout LFSCK cannot find the "
-                              "LAST_ID file for sequence "LPX64"\n",
+                              "LAST_ID file for sequence %#llx\n",
                               lfsck_lfsck2name(lfsck), lls->lls_seq);
 
                        if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DELAY4) &&
@@ -1287,7 +1289,7 @@ lfsck_layout_lastid_load(const struct lu_env *env,
                        lo->ll_flags |= LF_CRASHED_LASTID;
 
                        CDEBUG(D_LFSCK, "%s: layout LFSCK finds invalid "
-                              "LAST_ID file for the sequence "LPX64
+                              "LAST_ID file for the sequence %#llx"
                               ": rc = %d\n",
                               lfsck_lfsck2name(lfsck), lls->lls_seq, rc);
                }
@@ -1321,7 +1323,7 @@ static void lfsck_layout_record_failure(const struct lu_env *env,
                lo->ll_pos_first_inconsistent = cookie;
 
                CDEBUG(D_LFSCK, "%s: layout LFSCK hit first non-repaired "
-                      "inconsistency at the pos ["LPU64"]\n",
+                      "inconsistency at the pos [%llu]\n",
                       lfsck_lfsck2name(lfsck),
                       lo->ll_pos_first_inconsistent);
        }
@@ -1955,7 +1957,7 @@ static int lfsck_layout_slave_conditional_destroy(const struct lu_env *env,
 {
        struct lfsck_thread_info        *info   = lfsck_env_info(env);
        struct lu_attr                  *la     = &info->lti_la;
-       ldlm_policy_data_t              *policy = &info->lti_policy;
+       union ldlm_policy_data          *policy = &info->lti_policy;
        struct ldlm_res_id              *resid  = &info->lti_resid;
        struct lfsck_instance           *lfsck  = com->lc_lfsck;
        struct dt_device                *dev    = lfsck->li_bottom;
@@ -3246,6 +3248,8 @@ static int lfsck_layout_assistant_handler_p1(const struct lu_env *env,
        if (lso->lso_dead)
                RETURN(0);
 
+       CFS_FAIL_TIMEOUT(OBD_FAIL_LFSCK_ASSISTANT_DIRECT, cfs_fail_val);
+
        rc = dt_attr_get(env, child, cla);
        if (rc == -ENOENT) {
                parent = lfsck_assistant_object_load(env, lfsck, lso);
@@ -3442,11 +3446,22 @@ lfsck_layout_slave_async_interpret(const struct lu_env *env,
        bool                                  done  = false;
 
        if (rc != 0) {
-               /* It is quite probably caused by target crash,
-                * to make the LFSCK can go ahead, assume that
-                * the target finished the LFSCK prcoessing. */
-               done = true;
+               /* It is probably caused by network trouble, or target crash,
+                * it will try several times (depends on the obd_timeout, and
+                * will not less than 3 times). But to make the LFSCK can go
+                * ahead, we should not try for ever. After some try but still
+                * hit failure, it will assume that the target exit the LFSCK
+                * prcoessing and stop try. */
+               if (rc == -ENOTCONN || rc == -ESHUTDOWN) {
+                       int max_try = max_t(int, obd_timeout / 30, 3);
+
+                       if (++(llst->llst_failures) > max_try)
+                               done = true;
+               } else {
+                       done = true;
+               }
        } else {
+               llst->llst_failures = 0;
                lr = req_capsule_server_get(&req->rq_pill, &RMF_LFSCK_REPLY);
                if (lr->lr_status != LS_SCANNING_PHASE1 &&
                    lr->lr_status != LS_SCANNING_PHASE2)
@@ -3455,8 +3470,9 @@ lfsck_layout_slave_async_interpret(const struct lu_env *env,
 
        if (done) {
                CDEBUG(D_LFSCK, "%s: layout LFSCK slave gets the MDT %x "
-                      "status %d\n", lfsck_lfsck2name(com->lc_lfsck),
-                      llst->llst_index, lr != NULL ? lr->lr_status : rc);
+                      "status %d, failures_try %d\n", lfsck_lfsck2name(com->lc_lfsck),
+                      llst->llst_index, lr != NULL ? lr->lr_status : rc,
+                      llst->llst_failures);
 
                lfsck_layout_llst_del(llsd, llst);
        }
@@ -3500,6 +3516,7 @@ static int lfsck_layout_async_query(const struct lu_env *env,
        llsaa->llsaa_com = lfsck_component_get(com);
        llsaa->llsaa_llst = llst;
        req->rq_interpret_reply = lfsck_layout_slave_async_interpret;
+       req->rq_allow_intr = 1;
        ptlrpc_set_add_req(set, req);
 
        RETURN(0);
@@ -3528,6 +3545,7 @@ static int lfsck_layout_async_notify(const struct lu_env *env,
        tmp = req_capsule_client_get(&req->rq_pill, &RMF_LFSCK_REQUEST);
        *tmp = *lr;
        ptlrpc_request_set_replen(req);
+       req->rq_allow_intr = 1;
        ptlrpc_set_add_req(set, req);
 
        RETURN(0);
@@ -3954,8 +3972,8 @@ static int lfsck_layout_master_checkpoint(const struct lu_env *env,
        up_write(&com->lc_sem);
 
        CDEBUG(D_LFSCK, "%s: layout LFSCK master checkpoint at the pos ["
-              LPU64"]: rc = %d\n", lfsck_lfsck2name(lfsck),
-              lfsck->li_pos_current.lp_oit_cookie, rc);
+              "%llu], status = %d: rc = %d\n", lfsck_lfsck2name(lfsck),
+              lfsck->li_pos_current.lp_oit_cookie, lo->ll_status, rc);
 
        return rc;
 }
@@ -3988,8 +4006,8 @@ static int lfsck_layout_slave_checkpoint(const struct lu_env *env,
        up_write(&com->lc_sem);
 
        CDEBUG(D_LFSCK, "%s: layout LFSCK slave checkpoint at the pos ["
-              LPU64"]: rc = %d\n", lfsck_lfsck2name(lfsck),
-              lfsck->li_pos_current.lp_oit_cookie, rc);
+              "%llu], status = %d: rc = %d\n", lfsck_lfsck2name(lfsck),
+              lfsck->li_pos_current.lp_oit_cookie, lo->ll_status, rc);
 
        return rc;
 }
@@ -4097,7 +4115,7 @@ static int lfsck_layout_slave_prep(const struct lu_env *env,
        }
 
        CDEBUG(D_LFSCK, "%s: layout LFSCK slave prep done, start pos ["
-              LPU64"]\n", lfsck_lfsck2name(lfsck),
+              "%llu]\n", lfsck_lfsck2name(lfsck),
               com->lc_pos_start.lp_oit_cookie);
 
        return rc;
@@ -4131,7 +4149,7 @@ static int lfsck_layout_master_prep(const struct lu_env *env,
 
 log:
        CDEBUG(D_LFSCK, "%s: layout LFSCK master prep done, start pos ["
-              LPU64"]\n", lfsck_lfsck2name(com->lc_lfsck),
+              "%llu]\n", lfsck_lfsck2name(com->lc_lfsck),
               com->lc_pos_start.lp_oit_cookie);
 
        return 0;
@@ -4262,22 +4280,23 @@ static int lfsck_layout_scan_stripes(const struct lu_env *env,
                        goto next;
                }
 
-               rc = dt_declare_attr_get(env, cobj);
-               if (rc != 0)
-                       goto next;
+               if (!OBD_FAIL_CHECK(OBD_FAIL_LFSCK_ASSISTANT_DIRECT)) {
+                       rc = dt_declare_attr_get(env, cobj);
+                       if (rc != 0)
+                               goto next;
 
-               rc = dt_declare_xattr_get(env, cobj, &buf, XATTR_NAME_FID);
-               if (rc != 0)
-                       goto next;
+                       rc = dt_declare_xattr_get(env, cobj, &buf,
+                                                 XATTR_NAME_FID);
+                       if (rc != 0)
+                               goto next;
+               }
 
                if (lso == NULL) {
                        struct lu_attr *attr = &info->lti_la;
 
                        rc = dt_attr_get(env, parent, attr);
-                       if (rc != 0) {
-                               rc = PTR_ERR(lso);
+                       if (rc != 0)
                                goto next;
-                       }
 
                        lso = lfsck_assistant_object_init(env,
                                lfsck_dto2fid(parent), attr,
@@ -4532,7 +4551,7 @@ static int lfsck_layout_slave_exec_oit(const struct lu_env *env,
                rc = lfsck_layout_lastid_load(env, com, lls);
                if (rc != 0) {
                        CDEBUG(D_LFSCK, "%s: layout LFSCK failed to "
-                             "load LAST_ID for "LPX64": rc = %d\n",
+                             "load LAST_ID for %#llx: rc = %d\n",
                              lfsck_lfsck2name(com->lc_lfsck), seq, rc);
                        lo->ll_objs_failed_phase1++;
                        OBD_FREE_PTR(lls);
@@ -4559,7 +4578,7 @@ static int lfsck_layout_slave_exec_oit(const struct lu_env *env,
                        rc = lfsck_layout_lastid_reload(env, com, lls);
                        if (unlikely(rc != 0)) {
                                CDEBUG(D_LFSCK, "%s: layout LFSCK failed to "
-                                     "reload LAST_ID for "LPX64": rc = %d\n",
+                                     "reload LAST_ID for %#llx: rc = %d\n",
                                      lfsck_lfsck2name(com->lc_lfsck),
                                      lls->lls_seq, rc);
 
@@ -4577,8 +4596,8 @@ static int lfsck_layout_slave_exec_oit(const struct lu_env *env,
                        lo->ll_flags |= LF_CRASHED_LASTID;
 
                        CDEBUG(D_LFSCK, "%s: layout LFSCK finds crashed "
-                              "LAST_ID file (2) for the sequence "LPX64
-                              ", old value "LPU64", known value "LPU64"\n",
+                              "LAST_ID file (2) for the sequence %#llx"
+                              ", old value %llu, known value %llu\n",
                               lfsck_lfsck2name(lfsck), lls->lls_seq,
                               lls->lls_lastid, oid);
                }
@@ -4667,13 +4686,13 @@ static int lfsck_layout_slave_post(const struct lu_env *env,
        int                      rc;
        bool                     done  = false;
 
+       down_write(&com->lc_sem);
        rc = lfsck_layout_lastid_store(env, com);
        if (rc != 0)
                result = rc;
 
        LASSERT(lfsck->li_out_notify != NULL);
 
-       down_write(&com->lc_sem);
        spin_lock(&lfsck->li_lock);
        if (!init)
                lo->ll_pos_last_checkpoint =
@@ -4728,73 +4747,59 @@ static int lfsck_layout_slave_post(const struct lu_env *env,
        return rc;
 }
 
-static int lfsck_layout_dump(const struct lu_env *env,
-                            struct lfsck_component *com, struct seq_file *m)
+static void lfsck_layout_dump(const struct lu_env *env,
+                             struct lfsck_component *com, struct seq_file *m)
 {
        struct lfsck_instance   *lfsck = com->lc_lfsck;
        struct lfsck_bookmark   *bk    = &lfsck->li_bookmark_ram;
        struct lfsck_layout     *lo    = com->lc_file_ram;
-       int                      rc;
 
        down_read(&com->lc_sem);
        seq_printf(m, "name: lfsck_layout\n"
-                     "magic: %#x\n"
-                     "version: %d\n"
-                     "status: %s\n",
-                     lo->ll_magic,
-                     bk->lb_version,
-                     lfsck_status2names(lo->ll_status));
-
-       rc = lfsck_bits_dump(m, lo->ll_flags, lfsck_flags_names, "flags");
-       if (rc < 0)
-               goto out;
+                  "magic: %#x\n"
+                  "version: %d\n"
+                  "status: %s\n",
+                  lo->ll_magic,
+                  bk->lb_version,
+                  lfsck_status2name(lo->ll_status));
 
-       rc = lfsck_bits_dump(m, bk->lb_param, lfsck_param_names, "param");
-       if (rc < 0)
-               goto out;
+       lfsck_bits_dump(m, lo->ll_flags, lfsck_flags_names, "flags");
 
-       rc = lfsck_time_dump(m, lo->ll_time_last_complete,
-                            "last_completed");
-       if (rc < 0)
-               goto out;
+       lfsck_bits_dump(m, bk->lb_param, lfsck_param_names, "param");
 
-       rc = lfsck_time_dump(m, lo->ll_time_latest_start,
-                            "latest_start");
-       if (rc < 0)
-               goto out;
+       lfsck_time_dump(m, lo->ll_time_last_complete, "last_completed");
 
-       rc = lfsck_time_dump(m, lo->ll_time_last_checkpoint,
-                            "last_checkpoint");
-       if (rc < 0)
-               goto out;
+       lfsck_time_dump(m, lo->ll_time_latest_start, "latest_start");
+
+       lfsck_time_dump(m, lo->ll_time_last_checkpoint, "last_checkpoint");
 
-       seq_printf(m, "latest_start_position: "LPU64"\n"
-                     "last_checkpoint_position: "LPU64"\n"
-                     "first_failure_position: "LPU64"\n",
-                     lo->ll_pos_latest_start,
-                     lo->ll_pos_last_checkpoint,
-                     lo->ll_pos_first_inconsistent);
+       seq_printf(m, "latest_start_position: %llu\n"
+                  "last_checkpoint_position: %llu\n"
+                  "first_failure_position: %llu\n",
+                  lo->ll_pos_latest_start,
+                  lo->ll_pos_last_checkpoint,
+                  lo->ll_pos_first_inconsistent);
 
        seq_printf(m, "success_count: %u\n"
-                     "repaired_dangling: "LPU64"\n"
-                     "repaired_unmatched_pair: "LPU64"\n"
-                     "repaired_multiple_referenced: "LPU64"\n"
-                     "repaired_orphan: "LPU64"\n"
-                     "repaired_inconsistent_owner: "LPU64"\n"
-                     "repaired_others: "LPU64"\n"
-                     "skipped: "LPU64"\n"
-                     "failed_phase1: "LPU64"\n"
-                     "failed_phase2: "LPU64"\n",
-                     lo->ll_success_count,
-                     lo->ll_objs_repaired[LLIT_DANGLING - 1],
-                     lo->ll_objs_repaired[LLIT_UNMATCHED_PAIR - 1],
-                     lo->ll_objs_repaired[LLIT_MULTIPLE_REFERENCED - 1],
-                     lo->ll_objs_repaired[LLIT_ORPHAN - 1],
-                     lo->ll_objs_repaired[LLIT_INCONSISTENT_OWNER - 1],
-                     lo->ll_objs_repaired[LLIT_OTHERS - 1],
-                     lo->ll_objs_skipped,
-                     lo->ll_objs_failed_phase1,
-                     lo->ll_objs_failed_phase2);
+                  "repaired_dangling: %llu\n"
+                  "repaired_unmatched_pair: %llu\n"
+                  "repaired_multiple_referenced: %llu\n"
+                  "repaired_orphan: %llu\n"
+                  "repaired_inconsistent_owner: %llu\n"
+                  "repaired_others: %llu\n"
+                  "skipped: %llu\n"
+                  "failed_phase1: %llu\n"
+                  "failed_phase2: %llu\n",
+                  lo->ll_success_count,
+                  lo->ll_objs_repaired[LLIT_DANGLING - 1],
+                  lo->ll_objs_repaired[LLIT_UNMATCHED_PAIR - 1],
+                  lo->ll_objs_repaired[LLIT_MULTIPLE_REFERENCED - 1],
+                  lo->ll_objs_repaired[LLIT_ORPHAN - 1],
+                  lo->ll_objs_repaired[LLIT_INCONSISTENT_OWNER - 1],
+                  lo->ll_objs_repaired[LLIT_OTHERS - 1],
+                  lo->ll_objs_skipped,
+                  lo->ll_objs_failed_phase1,
+                  lo->ll_objs_failed_phase2);
 
        if (lo->ll_status == LS_SCANNING_PHASE1) {
                __u64 pos;
@@ -4813,20 +4818,20 @@ static int lfsck_layout_dump(const struct lu_env *env,
                        do_div(new_checked, duration);
                if (rtime != 0)
                        do_div(speed, rtime);
-               seq_printf(m, "checked_phase1: "LPU64"\n"
-                             "checked_phase2: "LPU64"\n"
-                             "run_time_phase1: %u seconds\n"
-                             "run_time_phase2: %u seconds\n"
-                             "average_speed_phase1: "LPU64" items/sec\n"
-                             "average_speed_phase2: N/A\n"
-                             "real-time_speed_phase1: "LPU64" items/sec\n"
-                             "real-time_speed_phase2: N/A\n",
-                             checked,
-                             lo->ll_objs_checked_phase2,
-                             rtime,
-                             lo->ll_run_time_phase2,
-                             speed,
-                             new_checked);
+               seq_printf(m, "checked_phase1: %llu\n"
+                          "checked_phase2: %llu\n"
+                          "run_time_phase1: %u seconds\n"
+                          "run_time_phase2: %u seconds\n"
+                          "average_speed_phase1: %llu items/sec\n"
+                          "average_speed_phase2: N/A\n"
+                          "real-time_speed_phase1: %llu items/sec\n"
+                          "real-time_speed_phase2: N/A\n",
+                          checked,
+                          lo->ll_objs_checked_phase2,
+                          rtime,
+                          lo->ll_run_time_phase2,
+                          speed,
+                          new_checked);
 
                LASSERT(lfsck->li_di_oit != NULL);
 
@@ -4839,7 +4844,7 @@ static int lfsck_layout_dump(const struct lu_env *env,
                pos = iops->store(env, lfsck->li_di_oit);
                if (!lfsck->li_current_oit_processed)
                        pos--;
-               seq_printf(m, "current_position: "LPU64"\n", pos);
+               seq_printf(m, "current_position: %llu\n", pos);
 
        } else if (lo->ll_status == LS_SCANNING_PHASE2) {
                cfs_duration_t duration = cfs_time_current() -
@@ -4859,26 +4864,23 @@ static int lfsck_layout_dump(const struct lu_env *env,
                        do_div(speed1, lo->ll_run_time_phase1);
                if (rtime != 0)
                        do_div(speed2, rtime);
-               rc = seq_printf(m, "checked_phase1: "LPU64"\n"
-                               "checked_phase2: "LPU64"\n"
-                               "run_time_phase1: %u seconds\n"
-                               "run_time_phase2: %u seconds\n"
-                               "average_speed_phase1: "LPU64" items/sec\n"
-                               "average_speed_phase2: "LPU64" items/sec\n"
-                               "real-time_speed_phase1: N/A\n"
-                               "real-time_speed_phase2: "LPU64" items/sec\n"
-                               "current_position: "DFID"\n",
-                               lo->ll_objs_checked_phase1,
-                               checked,
-                               lo->ll_run_time_phase1,
-                               rtime,
-                               speed1,
-                               speed2,
-                               new_checked,
-                               PFID(&com->lc_fid_latest_scanned_phase2));
-               if (rc <= 0)
-                       goto out;
-
+               seq_printf(m, "checked_phase1: %llu\n"
+                          "checked_phase2: %llu\n"
+                          "run_time_phase1: %u seconds\n"
+                          "run_time_phase2: %u seconds\n"
+                          "average_speed_phase1: %llu items/sec\n"
+                          "average_speed_phase2: %llu items/sec\n"
+                          "real-time_speed_phase1: N/A\n"
+                          "real-time_speed_phase2: %llu items/sec\n"
+                          "current_position: "DFID"\n",
+                          lo->ll_objs_checked_phase1,
+                          checked,
+                          lo->ll_run_time_phase1,
+                          rtime,
+                          speed1,
+                          speed2,
+                          new_checked,
+                          PFID(&com->lc_fid_latest_scanned_phase2));
        } else {
                __u64 speed1 = lo->ll_objs_checked_phase1;
                __u64 speed2 = lo->ll_objs_checked_phase2;
@@ -4887,12 +4889,12 @@ static int lfsck_layout_dump(const struct lu_env *env,
                        do_div(speed1, lo->ll_run_time_phase1);
                if (lo->ll_run_time_phase2 != 0)
                        do_div(speed2, lo->ll_run_time_phase2);
-               seq_printf(m, "checked_phase1: "LPU64"\n"
-                          "checked_phase2: "LPU64"\n"
+               seq_printf(m, "checked_phase1: %llu\n"
+                          "checked_phase2: %llu\n"
                           "run_time_phase1: %u seconds\n"
                           "run_time_phase2: %u seconds\n"
-                          "average_speed_phase1: "LPU64" items/sec\n"
-                          "average_speed_phase2: "LPU64" objs/sec\n"
+                          "average_speed_phase1: %llu items/sec\n"
+                          "average_speed_phase2: %llu objs/sec\n"
                           "real-time_speed_phase1: N/A\n"
                           "real-time_speed_phase2: N/A\n"
                           "current_position: N/A\n",
@@ -4903,10 +4905,8 @@ static int lfsck_layout_dump(const struct lu_env *env,
                           speed1,
                           speed2);
        }
-out:
-       up_read(&com->lc_sem);
 
-       return rc;
+       up_read(&com->lc_sem);
 }
 
 static int lfsck_layout_master_double_scan(const struct lu_env *env,
@@ -5136,12 +5136,14 @@ static void lfsck_layout_slave_quit(const struct lu_env *env,
 
        LASSERT(llsd != NULL);
 
+       down_write(&com->lc_sem);
        list_for_each_entry_safe(lls, next, &llsd->llsd_seq_list,
                                 lls_list) {
                list_del_init(&lls->lls_list);
                lfsck_object_put(env, lls->lls_lastid_obj);
                OBD_FREE_PTR(lls);
        }
+       up_write(&com->lc_sem);
 
        spin_lock(&llsd->llsd_lock);
        while (!list_empty(&llsd->llsd_master_list)) {
@@ -5372,12 +5374,85 @@ static int lfsck_layout_slave_in_notify(const struct lu_env *env,
        RETURN(0);
 }
 
+static void lfsck_layout_repaired(struct lfsck_layout *lo, __u64 *count)
+{
+       int i;
+
+       for (i = 0; i < LLIT_MAX; i++)
+               *count += lo->ll_objs_repaired[i];
+}
+
+static int lfsck_layout_query_all(const struct lu_env *env,
+                                 struct lfsck_component *com,
+                                 __u32 *mdts_count, __u32 *osts_count,
+                                 __u64 *repaired)
+{
+       struct lfsck_layout *lo = com->lc_file_ram;
+       struct lfsck_tgt_descs *ltds;
+       struct lfsck_tgt_desc *ltd;
+       int idx;
+       int rc;
+       ENTRY;
+
+       rc = lfsck_query_all(env, com);
+       if (rc != 0)
+               RETURN(rc);
+
+       ltds = &com->lc_lfsck->li_mdt_descs;
+       down_read(&ltds->ltd_rw_sem);
+       cfs_foreach_bit(ltds->ltd_tgts_bitmap, idx) {
+               ltd = lfsck_ltd2tgt(ltds, idx);
+               LASSERT(ltd != NULL);
+
+               mdts_count[ltd->ltd_layout_status]++;
+               *repaired += ltd->ltd_layout_repaired;
+       }
+       up_read(&ltds->ltd_rw_sem);
+
+       ltds = &com->lc_lfsck->li_ost_descs;
+       down_read(&ltds->ltd_rw_sem);
+       cfs_foreach_bit(ltds->ltd_tgts_bitmap, idx) {
+               ltd = lfsck_ltd2tgt(ltds, idx);
+               LASSERT(ltd != NULL);
+
+               osts_count[ltd->ltd_layout_status]++;
+               *repaired += ltd->ltd_layout_repaired;
+       }
+       up_read(&ltds->ltd_rw_sem);
+
+       down_read(&com->lc_sem);
+       mdts_count[lo->ll_status]++;
+       lfsck_layout_repaired(lo, repaired);
+       up_read(&com->lc_sem);
+
+       RETURN(0);
+}
+
 static int lfsck_layout_query(const struct lu_env *env,
-                             struct lfsck_component *com)
+                             struct lfsck_component *com,
+                             struct lfsck_request *req,
+                             struct lfsck_reply *rep,
+                             struct lfsck_query *que, int idx)
 {
        struct lfsck_layout *lo = com->lc_file_ram;
+       int rc = 0;
+
+       if (que != NULL) {
+               LASSERT(com->lc_lfsck->li_master);
+
+               rc = lfsck_layout_query_all(env, com,
+                                           que->lu_mdts_count[idx],
+                                           que->lu_osts_count[idx],
+                                           &que->lu_repaired[idx]);
+       } else {
+               down_read(&com->lc_sem);
+               rep->lr_status = lo->ll_status;
+               if (req->lr_flags & LEF_QUERY_ALL)
+                       lfsck_layout_repaired(lo, &rep->lr_repaired);
+               up_read(&com->lc_sem);
+       }
 
-       return lo->ll_status;
+       return rc;
 }
 
 /* with lfsck::li_lock held */
@@ -5460,6 +5535,10 @@ static void lfsck_layout_assistant_fill_pos(const struct lu_env *env,
        struct lfsck_assistant_data     *lad = com->lc_data;
        struct lfsck_layout_req         *llr;
 
+       if (((struct lfsck_layout *)(com->lc_file_ram))->ll_status !=
+           LS_SCANNING_PHASE1)
+               return;
+
        if (list_empty(&lad->lad_req_list))
                return;
 
@@ -6141,9 +6220,9 @@ static int lfsck_orphan_it_load(const struct lu_env *env,
        LASSERT(llst != NULL);
 
        if (hash != llst->llst_hash) {
-               CDEBUG(D_LFSCK, "%s: the given hash "LPU64" for orphan "
+               CDEBUG(D_LFSCK, "%s: the given hash %llu for orphan "
                       "iteration does not match the one when fini "
-                      LPU64", to be reset.\n",
+                      "%llu, to be reset.\n",
                       lfsck_lfsck2name(it->loi_com->lc_lfsck), hash,
                       llst->llst_hash);
                fid_zero(&llst->llst_fid);