Whamcloud - gitweb
LU-14521 flr: delete mirror without volatile file
[fs/lustre-release.git] / lustre / lod / lod_lov.c
index d3f6390..4376eaa 100644 (file)
@@ -704,7 +704,7 @@ static int lod_gen_component_ea(const struct lu_env *env,
                        RETURN(-E2BIG);
                objs = &v3->lmm_objects[0];
        }
-       stripe_count = lod_comp_entry_stripe_count(lo, lod_comp, is_dir);
+       stripe_count = lod_comp_entry_stripe_count(lo, comp_idx, is_dir);
        if (stripe_count == 0 && !is_dir &&
            !(lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED) &&
            !(lod_comp->llc_pattern & LOV_PATTERN_MDT))
@@ -958,7 +958,7 @@ repeat:
  * \retval                     0 if the index is present
  * \retval                     -EINVAL if not
  */
-static int validate_lod_and_idx(struct lod_device *md, __u32 idx)
+int validate_lod_and_idx(struct lod_device *md, __u32 idx)
 {
        if (unlikely(idx >= md->lod_ost_descs.ltd_tgts_size ||
                     !test_bit(idx, md->lod_ost_bitmap))) {
@@ -1138,9 +1138,12 @@ int lod_parse_striping(const struct lu_env *env, struct lod_object *lo,
                        GOTO(out, rc = -EINVAL);
                lo->ldo_layout_gen = le32_to_cpu(comp_v1->lcm_layout_gen);
                lo->ldo_is_composite = 1;
-               lo->ldo_flr_state = le16_to_cpu(comp_v1->lcm_flags) &
-                                       LCM_FL_FLR_MASK;
                mirror_cnt = le16_to_cpu(comp_v1->lcm_mirror_count) + 1;
+               if (mirror_cnt > 1)
+                       lo->ldo_flr_state = le16_to_cpu(comp_v1->lcm_flags) &
+                                                       LCM_FL_FLR_MASK;
+               else
+                       lo->ldo_flr_state = LCM_FL_NONE;
        } else if (magic == LOV_MAGIC_FOREIGN) {
                size_t length;
 
@@ -1183,7 +1186,26 @@ int lod_parse_striping(const struct lu_env *env, struct lod_object *lo,
                        ext = &comp_v1->lcm_entries[i].lcme_extent;
                        lod_comp->llc_extent.e_start =
                                le64_to_cpu(ext->e_start);
+                       if (lod_comp->llc_extent.e_start &
+                           (LOV_MIN_STRIPE_SIZE - 1)) {
+                               CDEBUG(D_LAYOUT,
+                                      "extent start %llu is not a multiple of min size %u\n",
+                                      lod_comp->llc_extent.e_start,
+                                      LOV_MIN_STRIPE_SIZE);
+                               GOTO(out, rc = -EINVAL);
+                       }
+
                        lod_comp->llc_extent.e_end = le64_to_cpu(ext->e_end);
+                       if (lod_comp->llc_extent.e_end != LUSTRE_EOF &&
+                           lod_comp->llc_extent.e_end &
+                           (LOV_MIN_STRIPE_SIZE - 1)) {
+                               CDEBUG(D_LAYOUT,
+                                      "extent end %llu is not a multiple of min size %u\n",
+                                      lod_comp->llc_extent.e_end,
+                                      LOV_MIN_STRIPE_SIZE);
+                               GOTO(out, rc = -EINVAL);
+                       }
+
                        lod_comp->llc_flags =
                                le32_to_cpu(comp_v1->lcm_entries[i].lcme_flags);
                        if (lod_comp->llc_flags & LCME_FL_NOSYNC)
@@ -1239,7 +1261,7 @@ int lod_parse_striping(const struct lu_env *env, struct lod_object *lo,
                                int j;
 
                                stripe_count = lod_comp_entry_stripe_count(
-                                                       lo, lod_comp, false);
+                                                       lo, i, false);
                                if (stripe_count == 0 &&
                                    !(lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED) &&
                                    !(lod_comp->llc_pattern & LOV_PATTERN_MDT))
@@ -1911,7 +1933,10 @@ recheck:
        for_each_comp_entry_v1(comp_v1, ent) {
                ext = &ent->lcme_extent;
 
-               if (le64_to_cpu(ext->e_start) > le64_to_cpu(ext->e_end)) {
+               if (le64_to_cpu(ext->e_start) > le64_to_cpu(ext->e_end) ||
+                   le64_to_cpu(ext->e_start) & (LOV_MIN_STRIPE_SIZE - 1) ||
+                   (le64_to_cpu(ext->e_end) != LUSTRE_EOF &&
+                   le64_to_cpu(ext->e_end) & (LOV_MIN_STRIPE_SIZE - 1))) {
                        CDEBUG(D_LAYOUT, "invalid extent "DEXT"\n",
                               le64_to_cpu(ext->e_start),
                               le64_to_cpu(ext->e_end));