Whamcloud - gitweb
LU-14592 lfsck: SEL files support 34/43234/5
authorVitaly Fertman <c17818@cray.com>
Fri, 25 Dec 2020 23:12:50 +0000 (02:12 +0300)
committerOleg Drokin <green@whamcloud.com>
Wed, 28 Apr 2021 02:11:16 +0000 (02:11 +0000)
lfsck works directly on the mdt, and therefore it can see SEL magic,
handle it properly in the lfsck code

check the extent range alignment by stripe size, as done in other
places, not by MIN_STRIPE_SIZE

Signed-off-by: Vitaly Fertman <c17818@cray.com>
Change-Id: Iae9b0583f837f107eb0e5eb36eeb70643b92a12b
HPE-bug-id: LUS-9686, LUS-9639
Reviewed-on: https://es-gerrit.dev.cray.com/158202
Reviewed-on: https://es-gerrit.dev.cray.com/158287
Reviewed-on: https://es-gerrit.dev.cray.com/158216
Reviewed-on: https://es-gerrit.dev.cray.com/158463
Reviewed-by: Alexander Boyko <c17825@cray.com>
Tested-by: Elena Gryaznova <c17455@cray.com>
Reviewed-by: Alexey Lyashkov <c17817@cray.com>
Reviewed-on: https://review.whamcloud.com/43234
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Elena Gryaznova <c17455@cray.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Lai Siyao <lai.siyao@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/lfsck/lfsck_layout.c
lustre/lod/lod_lov.c
lustre/lod/lod_object.c
lustre/tests/sanity-lfsck.sh
lustre/utils/liblustreapi_layout.c

index f62b365..a50e259 100644 (file)
@@ -96,9 +96,9 @@ struct lfsck_layout_slave_async_args {
        struct lfsck_layout_slave_target *llsaa_llst;
 };
 
        struct lfsck_layout_slave_target *llsaa_llst;
 };
 
-static inline bool lfsck_comp_extent_aligned(__u64 size)
+static inline bool lfsck_comp_extent_aligned(__u64 border, __u32 size)
 {
 {
-        return (size & (LOV_MIN_STRIPE_SIZE - 1)) == 0;
+       return (border & (size - 1)) == 0;
 }
 
 static inline void
 }
 
 static inline void
@@ -329,10 +329,13 @@ out:
 
 static int lfsck_layout_verify_header_v1v3(struct dt_object *obj,
                                           struct lov_mds_md_v1 *lmm,
 
 static int lfsck_layout_verify_header_v1v3(struct dt_object *obj,
                                           struct lov_mds_md_v1 *lmm,
-                                          __u64 start, __u32 comp_id)
+                                          __u64 start, __u64 end,
+                                          __u32 comp_id,
+                                          bool ext, bool *dom)
 {
        __u32 magic;
        __u32 pattern;
 {
        __u32 magic;
        __u32 pattern;
+       __u32 size;
 
        magic = le32_to_cpu(lmm->lmm_magic);
        /* If magic crashed, keep it there. Sometime later, during OST-object
 
        magic = le32_to_cpu(lmm->lmm_magic);
        /* If magic crashed, keep it there. Sometime later, during OST-object
@@ -346,7 +349,7 @@ static int lfsck_layout_verify_header_v1v3(struct dt_object *obj,
                else
                        rc = -EINVAL;
 
                else
                        rc = -EINVAL;
 
-               CDEBUG(D_LFSCK, "%s LOV EA magic %u for the file "DFID"\n",
+               CDEBUG(D_LFSCK, "%s LOV EA magic 0x%X for the file "DFID"\n",
                       rc == -EINVAL ? "Unknown" : "Unsupported",
                       magic, PFID(lfsck_dto2fid(obj)));
 
                       rc == -EINVAL ? "Unknown" : "Unsupported",
                       magic, PFID(lfsck_dto2fid(obj)));
 
@@ -354,10 +357,11 @@ static int lfsck_layout_verify_header_v1v3(struct dt_object *obj,
        }
 
        pattern = le32_to_cpu(lmm->lmm_pattern);
        }
 
        pattern = le32_to_cpu(lmm->lmm_pattern);
+       *dom = !!(lov_pattern(pattern) == LOV_PATTERN_MDT);
 
 
-#if 0
        /* XXX: DoM file verification will be supportted via LU-11081. */
        if (lov_pattern(pattern) == LOV_PATTERN_MDT) {
        /* XXX: DoM file verification will be supportted via LU-11081. */
        if (lov_pattern(pattern) == LOV_PATTERN_MDT) {
+#if 0
                if (start != 0) {
                        CDEBUG(D_LFSCK, "The DoM entry for "DFID" is not "
                               "the first component in the mirror %x/%llu\n",
                if (start != 0) {
                        CDEBUG(D_LFSCK, "The DoM entry for "DFID" is not "
                               "the first component in the mirror %x/%llu\n",
@@ -365,10 +369,8 @@ static int lfsck_layout_verify_header_v1v3(struct dt_object *obj,
 
                        return -EINVAL;
                }
 
                        return -EINVAL;
                }
-       }
 #endif
 #endif
-
-       if (!lov_pattern_supported_normal_comp(lov_pattern(pattern))) {
+       } else 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);
                CDEBUG(D_LFSCK, "Unsupported LOV EA pattern %u for the file "
                       DFID" in the component %x\n",
                       pattern, PFID(lfsck_dto2fid(obj)), comp_id);
@@ -376,6 +378,17 @@ static int lfsck_layout_verify_header_v1v3(struct dt_object *obj,
                return -EOPNOTSUPP;
        }
 
                return -EOPNOTSUPP;
        }
 
+       size = le32_to_cpu(lmm->lmm_stripe_size);
+       if (!ext && end != LUSTRE_EOF && start != end &&
+           !lfsck_comp_extent_aligned(end, size)){
+               CDEBUG(D_LFSCK, "not aligned border in PFL extent range "
+                      "[%llu - %llu) stripesize %u for the file "DFID
+                      " at idx %d\n", start, end, size,
+                      PFID(lfsck_dto2fid(obj)), comp_id);
+
+               return -EINVAL;
+       }
+
        return 0;
 }
 
        return 0;
 }
 
@@ -403,10 +416,13 @@ static int lfsck_layout_verify_header_foreign(struct dt_object *obj,
 static int lfsck_layout_verify_header(struct dt_object *obj,
                                      struct lov_mds_md_v1 *lmm, size_t len)
 {
 static int lfsck_layout_verify_header(struct dt_object *obj,
                                      struct lov_mds_md_v1 *lmm, size_t len)
 {
+       bool p_dom = false;
        int rc = 0;
 
        int rc = 0;
 
-       if (le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC_COMP_V1) {
+       if (le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC_COMP_V1 ||
+           le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC_SEL) {
                struct lov_comp_md_v1 *lcm = (struct lov_comp_md_v1 *)lmm;
                struct lov_comp_md_v1 *lcm = (struct lov_comp_md_v1 *)lmm;
+               bool p_zero = false;
                int i;
                __u16 count = le16_to_cpu(lcm->lcm_entry_count);
 
                int i;
                __u16 count = le16_to_cpu(lcm->lcm_entry_count);
 
@@ -424,39 +440,72 @@ static int lfsck_layout_verify_header(struct dt_object *obj,
                        __u64 start = le64_to_cpu(lcme->lcme_extent.e_start);
                        __u64 end = le64_to_cpu(lcme->lcme_extent.e_end);
                        __u32 comp_id = le32_to_cpu(lcme->lcme_id);
                        __u64 start = le64_to_cpu(lcme->lcme_extent.e_start);
                        __u64 end = le64_to_cpu(lcme->lcme_extent.e_end);
                        __u32 comp_id = le32_to_cpu(lcme->lcme_id);
+                       bool ext, inited, zero;
+                       __u32 flags;
 
                        if (unlikely(comp_id == LCME_ID_INVAL ||
                                     comp_id > LCME_ID_MAX)) {
 
                        if (unlikely(comp_id == LCME_ID_INVAL ||
                                     comp_id > LCME_ID_MAX)) {
-                               CDEBUG(D_LFSCK, "found invalid FPL ID %u "
+                               CDEBUG(D_LFSCK, "found invalid PFL ID %u "
                                       "for the file "DFID" at idx %d\n",
                                       comp_id, PFID(lfsck_dto2fid(obj)), i);
 
                                return -EINVAL;
                        }
 
                                       "for the file "DFID" at idx %d\n",
                                       comp_id, PFID(lfsck_dto2fid(obj)), i);
 
                                return -EINVAL;
                        }
 
-                       if (unlikely(start >= end ||
-                                    !lfsck_comp_extent_aligned(start) ||
-                                    (!lfsck_comp_extent_aligned(end) &&
-                                     end != LUSTRE_EOF))) {
-                               CDEBUG(D_LFSCK, "found invalid FPL extent "
-                                      "range [%llu - %llu) for the file "
-                                      DFID" at idx %d\n",
-                                      start, end, PFID(lfsck_dto2fid(obj)), i);
+                       flags = le32_to_cpu(lcme->lcme_flags);
+                       ext = flags & LCME_FL_EXTENSION;
+                       inited = flags & LCME_FL_INIT;
+                       zero = !!(start == end);
+
+                       if ((i == 0) && zero) {
+                               CDEBUG(D_LFSCK, "invalid PFL comp %d: [%llu "
+                                      "- %llu) for "DFID"\n", i, start, end,
+                                      PFID(lfsck_dto2fid(obj)));
+                               return -EINVAL;
+                       }
+
+                       if ((zero && (inited || (i + 1 == count))) ||
+                           (start > end)) {
+                               CDEBUG(D_LFSCK, "invalid PFL comp %d/%d: "
+                                      "[%llu, %llu) for "DFID", %sinited\n",
+                                      i, count, start, end,
+                                      PFID(lfsck_dto2fid(obj)),
+                                      inited ? "" : "NOT ");
+                               return -EINVAL;
+                       }
 
 
+                       if (!ext && p_zero) {
+                               CDEBUG(D_LFSCK, "invalid PFL comp %d: [%llu, "
+                                      "%llu) for "DFID": NOT extension "
+                                      "after 0-length component\n", i,
+                                      start, end, PFID(lfsck_dto2fid(obj)));
+                               return -EINVAL;
+                       }
+
+                       if (ext && (inited || p_dom || zero)) {
+                               CDEBUG(D_LFSCK, "invalid PFL comp %d: [%llu, "
+                                      "%llu) for "DFID": %s\n", i,
+                                      start, end, PFID(lfsck_dto2fid(obj)),
+                                      inited ? "inited extension" :
+                                      p_dom ? "extension follows DOM" :
+                                      zero ? "zero length extension" : "");
                                return -EINVAL;
                        }
 
                        rc = lfsck_layout_verify_header_v1v3(obj,
                                        (struct lov_mds_md_v1 *)((char *)lmm +
                                        le32_to_cpu(lcme->lcme_offset)), start,
                                return -EINVAL;
                        }
 
                        rc = lfsck_layout_verify_header_v1v3(obj,
                                        (struct lov_mds_md_v1 *)((char *)lmm +
                                        le32_to_cpu(lcme->lcme_offset)), start,
-                                       comp_id);
+                                       end, comp_id, ext, &p_dom);
+
+                       p_zero = zero;
                }
        } 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 {
                }
        } 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);
+               rc = lfsck_layout_verify_header_v1v3(obj, lmm, 0, LUSTRE_EOF,
+                                                    0, false, &p_dom);
        }
 
        return rc;
        }
 
        return rc;
@@ -2928,7 +2977,7 @@ again:
                GOTO(unlock_parent, rc = rc1);
 
        magic = le32_to_cpu(lmm->lmm_magic);
                GOTO(unlock_parent, rc = rc1);
 
        magic = le32_to_cpu(lmm->lmm_magic);
-       if (magic == LOV_MAGIC_COMP_V1) {
+       if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                __u64 start;
                __u64 end;
                __u16 mirror_id0 = mirror_id_of(ol->ol_comp_id);
                __u64 start;
                __u64 end;
                __u16 mirror_id0 = mirror_id_of(ol->ol_comp_id);
@@ -3357,7 +3406,7 @@ static int lfsck_lov2layout(struct lov_mds_md_v1 *lmm, struct filter_fid *ff,
                ol->ol_comp_id = 0;
                ff->ff_layout_version = 0;
                ff->ff_range = 0;
                ol->ol_comp_id = 0;
                ff->ff_layout_version = 0;
                ff->ff_range = 0;
-       } else if (magic == LOV_MAGIC_COMP_V1) {
+       } else if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                struct lov_comp_md_v1 *lcm = (struct lov_comp_md_v1 *)lmm;
                struct lov_comp_md_entry_v1 *lcme = NULL;
                __u16 count = le16_to_cpu(lcm->lcm_entry_count);
                struct lov_comp_md_v1 *lcm = (struct lov_comp_md_v1 *)lmm;
                struct lov_comp_md_entry_v1 *lcme = NULL;
                __u16 count = le16_to_cpu(lcm->lcm_entry_count);
@@ -3516,7 +3565,7 @@ static int __lfsck_layout_repair_dangling(const struct lu_env *env,
 
                lmm = lovea->lb_buf;
                magic = le32_to_cpu(lmm->lmm_magic);
 
                lmm = lovea->lb_buf;
                magic = le32_to_cpu(lmm->lmm_magic);
-               if (magic == LOV_MAGIC_COMP_V1) {
+               if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                        struct lov_comp_md_v1 *lcm = buf->lb_buf;
                        struct lov_comp_md_entry_v1 *lcme;
                        __u16 count = le16_to_cpu(lcm->lcm_entry_count);
                        struct lov_comp_md_v1 *lcm = buf->lb_buf;
                        struct lov_comp_md_entry_v1 *lcme;
                        __u16 count = le16_to_cpu(lcm->lcm_entry_count);
@@ -3912,7 +3961,7 @@ static int lfsck_layout_repair_multiple_references(const struct lu_env *env,
 
        lmm = buf->lb_buf;
        magic = le32_to_cpu(lmm->lmm_magic);
 
        lmm = buf->lb_buf;
        magic = le32_to_cpu(lmm->lmm_magic);
-       if (magic == LOV_MAGIC_COMP_V1) {
+       if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                struct lov_comp_md_v1 *lcm = buf->lb_buf;
                struct lov_comp_md_entry_v1 *lcme;
                __u16 count = le16_to_cpu(lcm->lcm_entry_count);
                struct lov_comp_md_v1 *lcm = buf->lb_buf;
                struct lov_comp_md_entry_v1 *lcme;
                __u16 count = le16_to_cpu(lcm->lcm_entry_count);
@@ -4160,7 +4209,7 @@ static int lfsck_layout_check_parent(const struct lu_env *env,
 
        lmm = buf->lb_buf;
        magic = le32_to_cpu(lmm->lmm_magic);
 
        lmm = buf->lb_buf;
        magic = le32_to_cpu(lmm->lmm_magic);
-       if (magic == LOV_MAGIC_COMP_V1) {
+       if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                struct lov_comp_md_v1 *lcm = buf->lb_buf;
                struct lov_comp_md_entry_v1 *lcme;
 
                struct lov_comp_md_v1 *lcm = buf->lb_buf;
                struct lov_comp_md_entry_v1 *lcme;
 
@@ -4974,7 +5023,7 @@ static int lfsck_layout_master_check_pairs(const struct lu_env *env,
 
        lmm = buf->lb_buf;
        magic = le32_to_cpu(lmm->lmm_magic);
 
        lmm = buf->lb_buf;
        magic = le32_to_cpu(lmm->lmm_magic);
-       if (magic == LOV_MAGIC_COMP_V1) {
+       if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                struct lov_comp_md_v1 *lcm = buf->lb_buf;
                struct lov_comp_md_entry_v1 *lcme;
 
                struct lov_comp_md_v1 *lcm = buf->lb_buf;
                struct lov_comp_md_entry_v1 *lcme;
 
@@ -5668,7 +5717,7 @@ again:
        size = rc;
        lmm = buf->lb_buf;
        magic = le32_to_cpu(lmm->lmm_magic);
        size = rc;
        lmm = buf->lb_buf;
        magic = le32_to_cpu(lmm->lmm_magic);
-       if (magic == LOV_MAGIC_COMP_V1) {
+       if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                struct lov_mds_md_v1 *v1;
                int i;
 
                struct lov_mds_md_v1 *v1;
                int i;
 
@@ -5725,7 +5774,7 @@ fix:
                goto again;
        }
 
                goto again;
        }
 
-       if (magic == LOV_MAGIC_COMP_V1) {
+       if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                struct lov_mds_md_v1 *v1;
                int i;
 
                struct lov_mds_md_v1 *v1;
                int i;
 
@@ -5767,7 +5816,7 @@ out:
                       PFID(lfsck_dto2fid(obj)), rc);
 
        if (stripe) {
                       PFID(lfsck_dto2fid(obj)), rc);
 
        if (stripe) {
-               if (magic == LOV_MAGIC_COMP_V1) {
+               if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                        int i;
 
                        for (i = 0; i < count; i++) {
                        int i;
 
                        for (i = 0; i < count; i++) {
index 9dacc8b..2c990cb 100644 (file)
@@ -2037,7 +2037,7 @@ recheck:
                if (rc)
                        RETURN(rc);
 
                if (rc)
                        RETURN(rc);
 
-               if (prev_end == LUSTRE_EOF)
+               if (prev_end == LUSTRE_EOF || ext->e_start == prev_end)
                        continue;
 
                /* extent end must be aligned with the stripe_size */
                        continue;
 
                /* extent end must be aligned with the stripe_size */
index f24539c..a00dc3b 100644 (file)
@@ -1143,6 +1143,7 @@ void lod_adjust_stripe_size(struct lod_layout_component *comp,
                }
                /* check stripe size is multiplier of comp_end */
                if (comp_end != LUSTRE_EOF &&
                }
                /* check stripe size is multiplier of comp_end */
                if (comp_end != LUSTRE_EOF &&
+                   comp_end != comp->llc_extent.e_start &&
                    comp_end % comp->llc_stripe_size) {
                        /* fix that even for defined stripe size but warn
                         * about the problem, that must not happen
                    comp_end % comp->llc_stripe_size) {
                        /* fix that even for defined stripe size but warn
                         * about the problem, that must not happen
index fc7d989..adcf495 100644 (file)
@@ -5989,6 +5989,35 @@ test_40a() {
 }
 run_test 40a "LFSCK correctly fixes lmm_oi in composite layout"
 
 }
 run_test 40a "LFSCK correctly fixes lmm_oi in composite layout"
 
+test_41()
+{
+       local old_debug=$(do_facet $SINGLEMDS $LCTL get_param -n debug)
+
+       do_facet $SINGLEMDS $LCTL set_param debug=+lfsck
+       $LFS setstripe -E 1G -z 64M -E -1 -z 128M $DIR/$tfile
+       do_facet $SINGLEMDS $LCTL dk > /dev/null
+
+       echo "trigger LFSCK for SEL layout"
+       do_facet $SINGLEMDS $LCTL lfsck_start -M ${MDT_DEV} -A -t all -r -n on
+       wait_update_facet $SINGLEMDS "$LCTL get_param -n \
+               mdd.${MDT_DEV}.lfsck_layout |
+               awk '/^status/ { print \\\$2 }'" "completed" 32 || {
+               $SHOW_LAYOUT
+               error "(2) unexpected status"
+       }
+
+       local errors=$(do_facet $SINGLEMDS $LCTL dk |
+                      grep "lfsck_layout_verify_header")
+
+       [[ "x$errors" == "x" ]] || {
+               echo "$errors"
+               error "lfsck failed"
+       }
+
+       do_facet $SINGLEMDS "$LCTL set_param debug='$old_debug'"
+}
+run_test 41 "SEL support in LFSCK"
+
 # restore MDS/OST size
 MDSSIZE=${SAVED_MDSSIZE}
 OSTSIZE=${SAVED_OSTSIZE}
 # restore MDS/OST size
 MDSSIZE=${SAVED_MDSSIZE}
 OSTSIZE=${SAVED_OSTSIZE}
index fb51e1d..8cc4606 100644 (file)
@@ -3342,6 +3342,8 @@ static int llapi_layout_sanity_cb(struct llapi_layout *layout,
                } else if (!(comp->llc_flags & LCME_FL_EXTENSION) &&
                           (comp->llc_stripe_size != LLAPI_LAYOUT_DEFAULT)) {
                        if (comp->llc_extent.e_end != LUSTRE_EOF &&
                } else if (!(comp->llc_flags & LCME_FL_EXTENSION) &&
                           (comp->llc_stripe_size != LLAPI_LAYOUT_DEFAULT)) {
                        if (comp->llc_extent.e_end != LUSTRE_EOF &&
+                           comp->llc_extent.e_end !=
+                           comp->llc_extent.e_start &&
                            comp->llc_extent.e_end % comp->llc_stripe_size) {
                                args->lsa_rc = LSE_ALIGN_END;
                                goto out_err;
                            comp->llc_extent.e_end % comp->llc_stripe_size) {
                                args->lsa_rc = LSE_ALIGN_END;
                                goto out_err;