Whamcloud - gitweb
LU-13535 lfsck: fix possible PFL layout corruption
[fs/lustre-release.git] / lustre / lfsck / lfsck_layout.c
index e866566..68ca022 100644 (file)
@@ -86,7 +86,7 @@ struct lfsck_layout_slave_data {
        __u64                    llsd_touch_gen;
        struct dt_object        *llsd_rb_obj;
        struct rb_root           llsd_rb_root;
-       rwlock_t                 llsd_rb_lock;
+       struct rw_semaphore      llsd_rb_rwsem;
        unsigned int             llsd_rbtree_valid:1;
 };
 
@@ -270,7 +270,7 @@ static void lfsck_layout_assistant_sync_failures(const struct lu_env *env,
        int                                rc    = 0;
        ENTRY;
 
-       if (!lad->lad_incomplete)
+       if (!test_bit(LAD_INCOMPLETE, &lad->lad_flags))
                RETURN_EXIT;
 
        /* If the MDT has ever failed to verfiy some OST-objects,
@@ -368,7 +368,7 @@ static int lfsck_layout_verify_header_v1v3(struct dt_object *obj,
        }
 #endif
 
-       if (lov_pattern(pattern) != LOV_PATTERN_RAID0) {
+       if (!lov_pattern_supported_normal_comp(lov_pattern(pattern))) {
                CDEBUG(D_LFSCK, "Unsupported LOV EA pattern %u for the file "
                       DFID" in the component %x\n",
                       pattern, PFID(lfsck_dto2fid(obj)), comp_id);
@@ -379,8 +379,29 @@ static int lfsck_layout_verify_header_v1v3(struct dt_object *obj,
        return 0;
 }
 
+static int lfsck_layout_verify_header_foreign(struct dt_object *obj,
+                                             struct lov_foreign_md *lfm,
+                                             size_t len)
+{
+       /* magic has been verified already */
+       __u32 value_len = le32_to_cpu(lfm->lfm_length);
+       /* type and flags are not checked for instance */
+
+       CDEBUG(D_INFO, "foreign LOV EA, magic %x, len %u, type %x, flags %x, for file "DFID"\n",
+              le32_to_cpu(lfm->lfm_magic), value_len,
+              le32_to_cpu(lfm->lfm_type), le32_to_cpu(lfm->lfm_flags),
+              PFID(lfsck_dto2fid(obj)));
+
+       if (len != value_len + offsetof(typeof(*lfm), lfm_value))
+               CDEBUG(D_LFSCK, "foreign LOV EA internal size %u does not match EA full size %zu for file "DFID"\n",
+                      value_len, len, PFID(lfsck_dto2fid(obj)));
+
+       /* nothing to repair */
+       return -ENODATA;
+}
+
 static int lfsck_layout_verify_header(struct dt_object *obj,
-                                     struct lov_mds_md_v1 *lmm)
+                                     struct lov_mds_md_v1 *lmm, size_t len)
 {
        int rc = 0;
 
@@ -430,6 +451,10 @@ static int lfsck_layout_verify_header(struct dt_object *obj,
                                        le32_to_cpu(lcme->lcme_offset)), start,
                                        comp_id);
                }
+       } else if (le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC_FOREIGN) {
+               rc = lfsck_layout_verify_header_foreign(obj,
+                                               (struct lov_foreign_md *)lmm,
+                                               len);
        } else {
                rc = lfsck_layout_verify_header_v1v3(obj, lmm, 1, 0);
        }
@@ -468,7 +493,7 @@ again:
                goto again;
        }
 
-       rc1 = lfsck_layout_verify_header(obj, buf->lb_buf);
+       rc1 = lfsck_layout_verify_header(obj, buf->lb_buf, rc);
 
        return rc1 ? rc1 : rc;
 }
@@ -622,7 +647,7 @@ lfsck_rbtree_insert(struct lfsck_layout_slave_data *llsd,
        return lrn;
 }
 
-extern const struct dt_index_operations lfsck_orphan_index_ops;
+static const struct dt_index_operations lfsck_orphan_index_ops;
 
 static int lfsck_rbtree_setup(const struct lu_env *env,
                              struct lfsck_component *com)
@@ -669,9 +694,9 @@ static void lfsck_rbtree_cleanup(const struct lu_env *env,
 
        lfsck->li_bottom->dd_record_fid_accessed = 0;
        /* Invalid the rbtree, then no others will use it. */
-       write_lock(&llsd->llsd_rb_lock);
+       down_write(&llsd->llsd_rb_rwsem);
        llsd->llsd_rbtree_valid = 0;
-       write_unlock(&llsd->llsd_rb_lock);
+       up_write(&llsd->llsd_rb_rwsem);
 
        while (node != NULL) {
                next = rb_next(node);
@@ -708,7 +733,7 @@ static void lfsck_rbtree_update_bitmap(const struct lu_env *env,
        if (!fid_is_idif(fid) && !fid_is_norm(fid))
                RETURN_EXIT;
 
-       read_lock(&llsd->llsd_rb_lock);
+       down_read(&llsd->llsd_rb_rwsem);
        if (!llsd->llsd_rbtree_valid)
                GOTO(unlock, rc = 0);
 
@@ -718,13 +743,13 @@ static void lfsck_rbtree_update_bitmap(const struct lu_env *env,
 
                LASSERT(!insert);
 
-               read_unlock(&llsd->llsd_rb_lock);
+               up_read(&llsd->llsd_rb_rwsem);
                tmp = lfsck_rbtree_new(env, fid);
                if (IS_ERR(tmp))
                        GOTO(out, rc = PTR_ERR(tmp));
 
                insert = true;
-               write_lock(&llsd->llsd_rb_lock);
+               down_write(&llsd->llsd_rb_rwsem);
                if (!llsd->llsd_rbtree_valid) {
                        lfsck_rbtree_free(tmp);
                        GOTO(unlock, rc = 0);
@@ -746,9 +771,9 @@ static void lfsck_rbtree_update_bitmap(const struct lu_env *env,
 
 unlock:
        if (insert)
-               write_unlock(&llsd->llsd_rb_lock);
+               up_write(&llsd->llsd_rb_rwsem);
        else
-               read_unlock(&llsd->llsd_rb_lock);
+               up_read(&llsd->llsd_rb_rwsem);
 out:
        if (rc != 0 && accessed) {
                struct lfsck_layout *lo = com->lc_file_ram;
@@ -908,7 +933,7 @@ static int lfsck_layout_load_bitmap(const struct lu_env *env,
        }
 
        if (lo->ll_bitmap_size == 0) {
-               lad->lad_incomplete = 0;
+               clear_bit(LAD_INCOMPLETE, &lad->lad_flags);
                CFS_RESET_BITMAP(bitmap);
 
                RETURN(0);
@@ -920,9 +945,9 @@ static int lfsck_layout_load_bitmap(const struct lu_env *env,
                RETURN(rc >= 0 ? -EINVAL : rc);
 
        if (cfs_bitmap_check_empty(bitmap))
-               lad->lad_incomplete = 0;
+               clear_bit(LAD_INCOMPLETE, &lad->lad_flags);
        else
-               lad->lad_incomplete = 1;
+               set_bit(LAD_INCOMPLETE, &lad->lad_flags);
 
        RETURN(0);
 }
@@ -1106,7 +1131,7 @@ static int fid_is_for_ostobj(const struct lu_env *env,
        loa = &lfsck_env_info(env)->lti_loa;
        rc = dt_xattr_get(env, obj, lfsck_buf_get(env, loa, sizeof(*loa)),
                          XATTR_NAME_LMA);
-       if (rc >= sizeof(struct lustre_mdt_attrs)) {
+       if (rc >= (int)sizeof(struct lustre_mdt_attrs)) {
                lustre_lma_swab(&loa->loa_lma);
 
                return loa->loa_lma.lma_compat & LMAC_FID_ON_OST ? 1 : 0;
@@ -1366,23 +1391,15 @@ lfsck_layout_lastid_load(const struct lu_env *env,
 
                        if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DELAY4) &&
                            cfs_fail_val > 0) {
-                               struct l_wait_info lwi = LWI_TIMEOUT(
-                                               cfs_time_seconds(cfs_fail_val),
-                                               NULL, NULL);
-
-                               /* Some others may changed the cfs_fail_val
-                                * as zero after above check, re-check it for
-                                * sure to avoid falling into wait for ever. */
-                               if (likely(lwi.lwi_timeout > 0)) {
-                                       struct ptlrpc_thread *thread =
-                                               &lfsck->li_thread;
-
-                                       up_write(&com->lc_sem);
-                                       l_wait_event(thread->t_ctl_waitq,
-                                                    !thread_is_running(thread),
-                                                    &lwi);
-                                       down_write(&com->lc_sem);
-                               }
+                               struct ptlrpc_thread *thread =
+                                       &lfsck->li_thread;
+
+                               up_write(&com->lc_sem);
+                               wait_event_idle_timeout(
+                                       thread->t_ctl_waitq,
+                                       !thread_is_running(thread),
+                                       cfs_time_seconds(cfs_fail_val));
+                               down_write(&com->lc_sem);
                        }
                }
 
@@ -1467,7 +1484,7 @@ static int lfsck_layout_double_scan_result(const struct lu_env *env,
                        if (lfsck->li_master) {
                                struct lfsck_assistant_data *lad = com->lc_data;
 
-                               if (lad->lad_incomplete)
+                               if (test_bit(LAD_INCOMPLETE, &lad->lad_flags))
                                        lo->ll_status = LS_PARTIAL;
                                else
                                        lo->ll_status = LS_COMPLETED;
@@ -1560,7 +1577,7 @@ static int lfsck_layout_ins_dangling_rec(const struct lu_env *env,
                GOTO(unlock, rc);
 
        rc = dt_insert(env, obj, (const struct dt_rec *)rec,
-                      (const struct dt_key *)key, th, 1);
+                      (const struct dt_key *)key, th);
 
        GOTO(unlock, rc);
 
@@ -2312,6 +2329,9 @@ static int lfsck_layout_recreate_parent(const struct lu_env *env,
        int                              rc     = 0;
        ENTRY;
 
+       if (lfsck_is_dryrun(lfsck))
+               GOTO(log, rc = 0);
+
        if (unlikely(lpf == NULL))
                GOTO(log, rc = -ENXIO);
 
@@ -2439,7 +2459,7 @@ again:
                GOTO(stop, rc);
 
        rc = dt_insert(env, lpf, (const struct dt_rec *)dtrec,
-                      (const struct dt_key *)name, th, 1);
+                      (const struct dt_key *)name, th);
        if (rc != 0)
                GOTO(stop, rc);
 
@@ -2712,6 +2732,9 @@ static int lfsck_layout_conflict_create(const struct lu_env *env,
        if (rc != 0 && rc != -ENOENT)
                GOTO(unlock, rc);
 
+       if (lfsck_is_dryrun(com->lc_lfsck))
+               GOTO(unlock, rc = 0);
+
        th = dt_trans_create(env, dev);
        if (IS_ERR(th))
                GOTO(unlock, rc = PTR_ERR(th));
@@ -2791,6 +2814,9 @@ static int lfsck_layout_recreate_lovea(const struct lu_env *env,
        bool new_mirror = true;
        ENTRY;
 
+       if (lfsck_is_dryrun(lfsck))
+               RETURN(0);
+
        rc = lfsck_ibits_lock(env, lfsck, parent, &lh,
                              MDS_INODELOCK_LAYOUT | MDS_INODELOCK_XATTR,
                              LCK_EX);
@@ -2881,7 +2907,7 @@ again:
        }
 
        lmm = buf->lb_buf;
-       rc1 = lfsck_layout_verify_header(parent, lmm);
+       rc1 = lfsck_layout_verify_header(parent, lmm, lovea_size);
 
        /* If the LOV EA crashed, the rebuild it. */
        if (rc1 == -EINVAL) {
@@ -2910,6 +2936,9 @@ again:
                __u16 mirror_id0 = mirror_id_of(ol->ol_comp_id);
                __u16 mirror_id1;
 
+               if (bk->lb_param & LPF_DRYRUN)
+                       GOTO(unlock_parent, rc = 1);
+
                lcm = buf->lb_buf;
                count = le16_to_cpu(lcm->lcm_entry_count);
                for (i = 0; i < count; pos = ++i) {
@@ -3976,6 +4005,7 @@ static int lfsck_layout_repair_owner(const struct lu_env *env,
        struct dt_device                *dev    = lfsck_obj2dev(child);
        struct thandle                  *handle;
        int                              rc;
+       dt_obj_version_t                 version;
        ENTRY;
 
        tla->la_uid = pla->la_uid;
@@ -3998,14 +4028,18 @@ static int lfsck_layout_repair_owner(const struct lu_env *env,
        if (unlikely(lfsck_is_dead_obj(parent)))
                GOTO(unlock, rc = 1);
 
+       version = dt_version_get(env, child);
+       if (version == -EOPNOTSUPP)
+               version = 0;
+
        /* Get the latest parent's owner. */
        rc = dt_attr_get(env, parent, pla);
        if (rc != 0)
                GOTO(unlock, rc);
 
        /* Some others chown/chgrp during the LFSCK, needs to do nothing. */
-       if (unlikely(tla->la_uid != pla->la_uid ||
-                    tla->la_gid != pla->la_gid))
+       if (unlikely((!version && tla->la_ctime == 0) ||
+                    tla->la_uid != pla->la_uid || tla->la_gid != pla->la_gid))
                rc = 1;
        else
                rc = dt_attr_set(env, child, tla, handle);
@@ -4032,6 +4066,11 @@ log:
        return rc;
 }
 
+#define CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid, msg)              \
+       CDEBUG(D_LFSCK, "%s:("DFID"|"DFID")/"DFID":XATTR %s: %s\n",      \
+              lfsck_lfsck2name(lfsck), PFID(&lso->lso_fid), PFID(pfid), \
+              PFID(cfid), XATTR_NAME_FID, msg);
+
 /* Check whether the OST-object correctly back points to the
  * MDT-object (@parent) via the XATTR_NAME_FID xattr (@pfid). */
 static int lfsck_layout_check_parent(const struct lu_env *env,
@@ -4049,6 +4088,7 @@ static int lfsck_layout_check_parent(const struct lu_env *env,
        struct lov_mds_md_v1            *lmm;
        struct lov_ost_data_v1          *objs;
        struct lustre_handle             lh     = { 0 };
+       struct lfsck_instance           *lfsck  = com->lc_lfsck;
        int                              rc;
        int                              i;
        __u32                            magic;
@@ -4060,13 +4100,20 @@ static int lfsck_layout_check_parent(const struct lu_env *env,
        idx = pfid->f_stripe_idx;
        pfid->f_ver = 0;
 
-       if (unlikely(!fid_is_sane(pfid)))
+       if (unlikely(!fid_is_sane(pfid))) {
+               CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+                                     "the parent FID is invalid");
+
                RETURN(LLIT_UNMATCHED_PAIR);
+       }
 
        if (lu_fid_eq(pfid, &lso->lso_fid)) {
                if (likely(llr->llr_lov_idx == idx))
                        RETURN(0);
 
+               CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+                                     "the stripe index is unmatched");
+
                RETURN(LLIT_UNMATCHED_PAIR);
        }
 
@@ -4074,17 +4121,38 @@ static int lfsck_layout_check_parent(const struct lu_env *env,
        if (IS_ERR(tobj))
                RETURN(PTR_ERR(tobj));
 
-       if (dt_object_exists(tobj) == 0 || lfsck_is_dead_obj(tobj) ||
-           !S_ISREG(lfsck_object_type(tobj)))
+       if (dt_object_exists(tobj) == 0) {
+               CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+                                     "the parent is nonexistent");
+
                GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+       }
+
+       if (lfsck_is_dead_obj(tobj)) {
+               CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+                                     "the parent is dead object");
+
+               GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+       }
+
+       if (!S_ISREG(lfsck_object_type(tobj))) {
+               CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+                                     "the parent is not a regular file");
+
+               GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+       }
 
        /* Load the tobj's layout EA, in spite of it is a local MDT-object or
         * remote one on another MDT. Then check whether the given OST-object
         * is in such layout. If yes, it is multiple referenced, otherwise it
         * is unmatched referenced case. */
        rc = lfsck_layout_get_lovea(env, tobj, buf);
-       if (rc == 0 || rc == -ENODATA || rc == -ENOENT)
+       if (rc == 0 || rc == -ENODATA || rc == -ENOENT) {
+               CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+                                     "the parent has no stripe data");
+
                GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+       }
 
        if (unlikely(rc == -EOPNOTSUPP))
                GOTO(out, rc = LLIT_NONE);
@@ -4098,8 +4166,12 @@ static int lfsck_layout_check_parent(const struct lu_env *env,
                struct lov_comp_md_v1 *lcm = buf->lb_buf;
                struct lov_comp_md_entry_v1 *lcme;
 
-               if (ff->ff_layout.ol_comp_id == 0)
+               if (ff->ff_layout.ol_comp_id == 0) {
+                       CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+                                             "the parent has incorrect comp_id");
+
                        GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+               }
 
                count = le16_to_cpu(lcm->lcm_entry_count);
                for (i = 0; i < count; i++) {
@@ -4110,13 +4182,21 @@ static int lfsck_layout_check_parent(const struct lu_env *env,
                                        le32_to_cpu(lcme->lcme_offset);
                                magic = le32_to_cpu(lmm->lmm_magic);
                                if (!(le32_to_cpu(lcme->lcme_flags) &
-                                     LCME_FL_INIT))
+                                     LCME_FL_INIT)) {
+                                       CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid,
+                                                             cfid,
+                                                             "the parent has uninitialized component");
+
                                        GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+                               }
 
                                goto further;
                        }
                }
 
+               CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+                                     "the parent has no matched comp_id");
+
                GOTO(out, rc = LLIT_UNMATCHED_PAIR);
        }
 
@@ -4164,10 +4244,15 @@ further:
                         * after taken the lock. */
                        if (!dt_object_remote(tobj)) {
                                if (dt_object_exists(tobj) == 0 ||
-                                   lfsck_is_dead_obj(tobj))
+                                   lfsck_is_dead_obj(tobj)) {
+                                       CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid,
+                                                             cfid,
+                                                             "the parent doesn't exist anymore after lock");
+
                                        rc = LLIT_UNMATCHED_PAIR;
-                               else
+                               } else {
                                        rc = LLIT_MULTIPLE_REFERENCED;
+                               }
 
                                GOTO(unlock, rc);
                        }
@@ -4182,15 +4267,22 @@ further:
                         * has been been removed or not. */
                        rc = dt_xattr_get(env, tobj, &LU_BUF_NULL,
                                          XATTR_NAME_DUMMY);
-                       if (unlikely(rc == -ENOENT || rc >= 0))
+                       if (unlikely(rc == -ENOENT || rc >= 0)) {
+                               CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+                                                     "the parent is remote object and nonexistent after lock");
+
                                rc = LLIT_UNMATCHED_PAIR;
-                       else if (rc == -ENODATA)
+                       } else if (rc == -ENODATA) {
                                rc = LLIT_MULTIPLE_REFERENCED;
+                       }
 
                        GOTO(unlock, rc);
                }
        }
 
+       CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+                             "the parent has no matched stripe");
+
        GOTO(out, rc = LLIT_UNMATCHED_PAIR);
 
 unlock:
@@ -4251,6 +4343,12 @@ static int lfsck_layout_assistant_handler_p1(const struct lu_env *env,
        lfsck_buf_init(&buf, ff, sizeof(*ff));
        rc = dt_xattr_get(env, child, &buf, XATTR_NAME_FID);
        if (unlikely(rc > 0 && rc < sizeof(struct lu_fid))) {
+               CDEBUG(D_LFSCK, "%s:"DFID"/"DFID": "
+                      "the child object's %s is corrupted\n",
+                      lfsck_lfsck2name(lfsck), PFID(&lso->lso_fid),
+                      PFID(lu_object_fid(&child->do_lu)),
+                      XATTR_NAME_FID);
+
                type = LLIT_UNMATCHED_PAIR;
                goto repair;
        }
@@ -4338,7 +4436,7 @@ out:
        if (rc < 0) {
                struct lfsck_assistant_data *lad = com->lc_data;
 
-               if (unlikely(lad->lad_exit)) {
+               if (unlikely(test_bit(LAD_EXIT, &lad->lad_flags))) {
                        rc = 0;
                } else if (rc == -ENOTCONN || rc == -ESHUTDOWN ||
                           rc == -ETIMEDOUT || rc == -EHOSTDOWN ||
@@ -4528,7 +4626,7 @@ static int lfsck_layout_assistant_handler_p2(const struct lu_env *env,
                        if (rc != 0 && bk->lb_param & LPF_FAILOUT)
                                RETURN(rc);
 
-                       if (unlikely(lad->lad_exit ||
+                       if (unlikely(test_bit(LAD_EXIT, &lad->lad_flags) ||
                                     !thread_is_running(&lfsck->li_thread)))
                                RETURN(0);
                        spin_lock(&ltds->ltd_lock);
@@ -4576,12 +4674,12 @@ lfsck_layout_slave_async_interpret(const struct lu_env *env,
                                   void *args, int rc)
 {
        struct lfsck_layout_slave_async_args *llsaa = args;
-       struct obd_export                    *exp   = llsaa->llsaa_exp;
-       struct lfsck_component               *com   = llsaa->llsaa_com;
-       struct lfsck_layout_slave_target     *llst  = llsaa->llsaa_llst;
-       struct lfsck_layout_slave_data       *llsd  = com->lc_data;
-       struct lfsck_reply                   *lr    = NULL;
-       bool                                  done  = false;
+       struct obd_export *exp = llsaa->llsaa_exp;
+       struct lfsck_component *com = llsaa->llsaa_com;
+       struct lfsck_layout_slave_target *llst = llsaa->llsaa_llst;
+       struct lfsck_layout_slave_data *llsd = com->lc_data;
+       struct lfsck_reply *lr = NULL;
+       bool done = false;
 
        if (rc != 0) {
                /* It is probably caused by network trouble, or target crash,
@@ -4649,7 +4747,7 @@ static int lfsck_layout_async_query(const struct lu_env *env,
        *tmp = *lr;
        ptlrpc_request_set_replen(req);
 
-       llsaa = ptlrpc_req_async_args(req);
+       llsaa = ptlrpc_req_async_args(llsaa, req);
        llsaa->llsaa_exp = exp;
        llsaa->llsaa_com = lfsck_component_get(com);
        llsaa->llsaa_llst = llst;
@@ -5075,7 +5173,7 @@ static int lfsck_layout_reset(const struct lu_env *env,
        if (com->lc_lfsck->li_master) {
                struct lfsck_assistant_data *lad = com->lc_data;
 
-               lad->lad_incomplete = 0;
+               clear_bit(LAD_INCOMPLETE, &lad->lad_flags);
                CFS_RESET_BITMAP(lad->lad_bitmap);
        }
 
@@ -5271,9 +5369,9 @@ static int lfsck_layout_slave_prep(const struct lu_env *env,
        if (rc == 0 && start != NULL && start->ls_flags & LPF_OST_ORPHAN) {
                LASSERT(!llsd->llsd_rbtree_valid);
 
-               write_lock(&llsd->llsd_rb_lock);
+               down_write(&llsd->llsd_rb_rwsem);
                rc = lfsck_rbtree_setup(env, com);
-               write_unlock(&llsd->llsd_rb_lock);
+               up_write(&llsd->llsd_rb_rwsem);
        }
 
        CDEBUG(D_LFSCK, "%s: layout LFSCK slave prep done, start pos ["
@@ -5323,7 +5421,7 @@ static int lfsck_layout_scan_stripes(const struct lu_env *env,
                                     struct dt_object *parent,
                                     struct lov_mds_md_v1 *lmm, __u32 comp_id)
 {
-       struct lfsck_thread_info        *info    = lfsck_env_info(env);
+       struct lfsck_thread_info        *info    = lfsck_env_info(env);
        struct lfsck_instance           *lfsck   = com->lc_lfsck;
        struct lfsck_bookmark           *bk      = &lfsck->li_bookmark_ram;
        struct lfsck_layout             *lo      = com->lc_file_ram;
@@ -5333,7 +5431,6 @@ static int lfsck_layout_scan_stripes(const struct lu_env *env,
        struct lfsck_tgt_descs          *ltds    = &lfsck->li_ost_descs;
        struct ptlrpc_thread            *mthread = &lfsck->li_thread;
        struct ptlrpc_thread            *athread = &lad->lad_thread;
-       struct l_wait_info               lwi     = { 0 };
        struct lu_buf                    buf;
        int                              rc      = 0;
        int                              i;
@@ -5363,11 +5460,10 @@ static int lfsck_layout_scan_stripes(const struct lu_env *env,
                if (unlikely(lovea_slot_is_dummy(objs)))
                        continue;
 
-               l_wait_event(mthread->t_ctl_waitq,
-                            lad->lad_prefetched < bk->lb_async_windows ||
-                            !thread_is_running(mthread) ||
-                            thread_is_stopped(athread),
-                            &lwi);
+               wait_event_idle(mthread->t_ctl_waitq,
+                               lad->lad_prefetched < bk->lb_async_windows ||
+                               !thread_is_running(mthread) ||
+                               thread_is_stopped(athread));
 
                if (unlikely(!thread_is_running(mthread)) ||
                             thread_is_stopped(athread))
@@ -5575,14 +5671,15 @@ again:
        lmm = buf->lb_buf;
        magic = le32_to_cpu(lmm->lmm_magic);
        if (magic == LOV_MAGIC_COMP_V1) {
+               struct lov_mds_md_v1 *v1;
                int i;
 
                lcm = buf->lb_buf;
                count = le16_to_cpu(lcm->lcm_entry_count);
                for (i = 0; i < count; i++) {
                        lcme = &lcm->lcm_entries[i];
-                       lmm = buf->lb_buf + le32_to_cpu(lcme->lcme_offset);
-                       if (memcmp(oi, &lmm->lmm_oi, sizeof(*oi)) != 0)
+                       v1 = buf->lb_buf + le32_to_cpu(lcme->lcme_offset);
+                       if (memcmp(oi, &v1->lmm_oi, sizeof(*oi)) != 0)
                                goto fix;
                }
 
@@ -5614,7 +5711,7 @@ fix:
                if (IS_ERR(handle))
                        GOTO(out, rc = PTR_ERR(handle));
 
-               lfsck_buf_init(&ea_buf, lmm, size);
+               lfsck_buf_init(&ea_buf, buf->lb_buf, size);
                rc = dt_declare_xattr_set(env, obj, &ea_buf, XATTR_NAME_LOV,
                                          LU_XATTR_REPLACE, handle);
                if (rc != 0)
@@ -5631,12 +5728,13 @@ fix:
        }
 
        if (magic == LOV_MAGIC_COMP_V1) {
+               struct lov_mds_md_v1 *v1;
                int i;
 
                for (i = 0; i < count; i++) {
                        lcme = &lcm->lcm_entries[i];
-                       lmm = buf->lb_buf + le32_to_cpu(lcme->lcme_offset);
-                       lmm->lmm_oi = *oi;
+                       v1 = buf->lb_buf + le32_to_cpu(lcme->lcme_offset);
+                       v1->lmm_oi = *oi;
                }
        } else {
                lmm->lmm_oi = *oi;
@@ -5717,13 +5815,11 @@ static int lfsck_layout_slave_exec_oit(const struct lu_env *env,
 
        if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DELAY5) &&
            cfs_fail_val == lfsck_dev_idx(lfsck)) {
-               struct l_wait_info       lwi = LWI_TIMEOUT(cfs_time_seconds(1),
-                                                          NULL, NULL);
                struct ptlrpc_thread    *thread = &lfsck->li_thread;
 
-               l_wait_event(thread->t_ctl_waitq,
-                            !thread_is_running(thread),
-                            &lwi);
+               wait_event_idle_timeout(thread->t_ctl_waitq,
+                                       !thread_is_running(thread),
+                                       cfs_time_seconds(1));
        }
 
        lfsck_rbtree_update_bitmap(env, com, fid, false);
@@ -6025,8 +6121,8 @@ static void lfsck_layout_dump(const struct lu_env *env,
                           "run_time_phase2: %lld 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",
+                          "real_time_speed_phase1: %llu items/sec\n"
+                          "real_time_speed_phase2: N/A\n",
                           checked,
                           lo->ll_objs_checked_phase2,
                           rtime,
@@ -6072,8 +6168,8 @@ static void lfsck_layout_dump(const struct lu_env *env,
                           "run_time_phase2: %lld 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"
+                          "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,
@@ -6097,8 +6193,8 @@ static void lfsck_layout_dump(const struct lu_env *env,
                           "run_time_phase2: %lld seconds\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"
+                          "real_time_speed_phase1: N/A\n"
+                          "real_time_speed_phase2: N/A\n"
                           "current_position: N/A\n",
                           lo->ll_objs_checked_phase1,
                           lo->ll_objs_checked_phase2,
@@ -6174,9 +6270,6 @@ static int lfsck_layout_slave_double_scan(const struct lu_env *env,
                                       LFSCK_CHECKPOINT_INTERVAL;
 
        while (1) {
-               struct l_wait_info lwi = LWI_TIMEOUT(cfs_time_seconds(30),
-                                                    NULL, NULL);
-
                rc = lfsck_layout_slave_query_master(env, com);
                if (list_empty(&llsd->llsd_master_list)) {
                        if (unlikely(!thread_is_running(thread)))
@@ -6190,21 +6283,22 @@ static int lfsck_layout_slave_double_scan(const struct lu_env *env,
                if (rc < 0)
                        GOTO(done, rc);
 
-               rc = l_wait_event(thread->t_ctl_waitq,
-                                 !thread_is_running(thread) ||
-                                 lo->ll_flags & LF_INCOMPLETE ||
-                                 list_empty(&llsd->llsd_master_list),
-                                 &lwi);
+               rc = wait_event_idle_timeout(
+                       thread->t_ctl_waitq,
+                       !thread_is_running(thread) ||
+                       lo->ll_flags & LF_INCOMPLETE ||
+                       list_empty(&llsd->llsd_master_list),
+                       cfs_time_seconds(30));
                if (unlikely(!thread_is_running(thread)))
                        GOTO(done, rc = 0);
 
                if (lo->ll_flags & LF_INCOMPLETE)
                        GOTO(done, rc = 1);
 
-               if (rc == -ETIMEDOUT)
+               if (rc == 0)
                        continue;
 
-               GOTO(done, rc = (rc < 0 ? rc : 1));
+               GOTO(done, rc = 1);
        }
 
 done:
@@ -6819,7 +6913,7 @@ int lfsck_layout_setup(const struct lu_env *env, struct lfsck_instance *lfsck)
                INIT_LIST_HEAD(&llsd->llsd_master_list);
                spin_lock_init(&llsd->llsd_lock);
                llsd->llsd_rb_root = RB_ROOT;
-               rwlock_init(&llsd->llsd_rb_lock);
+               init_rwsem(&llsd->llsd_rb_rwsem);
                com->lc_data = llsd;
        }
        com->lc_file_size = sizeof(*lo);
@@ -7028,8 +7122,7 @@ static int lfsck_orphan_index_insert(const struct lu_env *env,
                                     struct dt_object *dt,
                                     const struct dt_rec *rec,
                                     const struct dt_key *key,
-                                    struct thandle *handle,
-                                    int ignore_quota)
+                                    struct thandle *handle)
 {
        return -EOPNOTSUPP;
 }
@@ -7090,7 +7183,7 @@ static struct dt_it *lfsck_orphan_it_init(const struct lu_env *env,
        if (dev->dd_record_fid_accessed) {
                /* The first iteration against the rbtree, scan the whole rbtree
                 * to remove the nodes which do NOT need to be handled. */
-               write_lock(&llsd->llsd_rb_lock);
+               down_write(&llsd->llsd_rb_rwsem);
                if (dev->dd_record_fid_accessed) {
                        struct rb_node                  *node;
                        struct rb_node                  *next;
@@ -7112,11 +7205,11 @@ static struct dt_it *lfsck_orphan_it_init(const struct lu_env *env,
                                node = next;
                        }
                }
-               write_unlock(&llsd->llsd_rb_lock);
+               up_write(&llsd->llsd_rb_rwsem);
        }
 
        /* read lock the rbtree when init, and unlock when fini */
-       read_lock(&llsd->llsd_rb_lock);
+       down_read(&llsd->llsd_rb_rwsem);
        it->loi_com = com;
        com = NULL;
 
@@ -7153,7 +7246,7 @@ static void lfsck_orphan_it_fini(const struct lu_env *env,
                       lfsck_lfsck2name(com->lc_lfsck));
 
                llsd = com->lc_data;
-               read_unlock(&llsd->llsd_rb_lock);
+               up_read(&llsd->llsd_rb_rwsem);
                llst = it->loi_llst;
                LASSERT(llst != NULL);
 
@@ -7489,7 +7582,7 @@ static int lfsck_orphan_it_key_rec(const struct lu_env *env,
        return 0;
 }
 
-const struct dt_index_operations lfsck_orphan_index_ops = {
+static const struct dt_index_operations lfsck_orphan_index_ops = {
        .dio_lookup             = lfsck_orphan_index_lookup,
        .dio_declare_insert     = lfsck_orphan_index_declare_insert,
        .dio_insert             = lfsck_orphan_index_insert,