-static int lfsck_layout_add_comp_comp(const struct lu_env *env,
- struct lfsck_instance *lfsck,
- struct thandle *handle,
- struct ost_layout *ol,
- struct dt_object *parent,
- const struct lu_fid *cfid,
- struct lu_buf *buf, __u32 ost_idx,
- __u32 ea_off, int pos)
+static void lfsck_layout_update_lcm(struct lov_comp_md_v1 *lcm,
+ struct lov_comp_md_entry_v1 *lcme,
+ __u32 version, __u32 range)
+{
+ struct lov_comp_md_entry_v1 *tmp;
+ __u64 start = le64_to_cpu(lcme->lcme_extent.e_start);
+ __u64 end = le64_to_cpu(lcme->lcme_extent.e_end);
+ __u32 gen = version + range;
+ __u32 tmp_gen;
+ int i;
+ __u16 count = le16_to_cpu(lcm->lcm_entry_count);
+ __u16 flags = le16_to_cpu(lcm->lcm_flags);
+
+ if (!gen)
+ gen = 1;
+ lcme->lcme_layout_gen = cpu_to_le32(gen);
+ if (le32_to_cpu(lcm->lcm_layout_gen) < gen)
+ lcm->lcm_layout_gen = cpu_to_le32(gen);
+
+ if (range)
+ lcm->lcm_flags = cpu_to_le16(LCM_FL_WRITE_PENDING);
+ else if (flags == LCM_FL_NONE && le16_to_cpu(lcm->lcm_mirror_count) > 0)
+ lcm->lcm_flags = cpu_to_le16(LCM_FL_RDONLY);
+
+ for (i = 0; i < count; i++) {
+ tmp = &lcm->lcm_entries[i];
+ if (le64_to_cpu(tmp->lcme_extent.e_end) <= start)
+ continue;
+
+ if (le64_to_cpu(tmp->lcme_extent.e_start) >= end)
+ continue;
+
+ if (le32_to_cpu(tmp->lcme_flags) & LCME_FL_STALE)
+ continue;
+
+ tmp_gen = le32_to_cpu(tmp->lcme_layout_gen);
+ /* "lcme_layout_gen == 0" but without LCME_FL_STALE flag,
+ * then it should be the latest version of all mirrors. */
+ if (tmp_gen == 0 || tmp_gen > gen) {
+ lcme->lcme_flags = cpu_to_le32(
+ le32_to_cpu(lcme->lcme_flags) | LCME_FL_STALE);
+ break;
+ }
+
+ if (tmp_gen < gen)
+ tmp->lcme_flags = cpu_to_le32(
+ le32_to_cpu(tmp->lcme_flags) | LCME_FL_STALE);
+ }
+}
+
+static int lfsck_layout_add_comp(const struct lu_env *env,
+ struct lfsck_instance *lfsck,
+ struct thandle *handle,
+ struct lu_orphan_rec_v3 *rec,
+ struct dt_object *parent,
+ const struct lu_fid *cfid,
+ struct lu_buf *buf, __u32 ost_idx,
+ __u32 ea_off, int pos, bool new_mirror)