From: Vitaly Fertman Date: Fri, 25 Dec 2020 23:12:50 +0000 (+0300) Subject: LU-14592 lfsck: SEL files support X-Git-Tag: 2.14.52~107 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=958989085a54d1f2bb9e4831e7495eae4c165b8e LU-14592 lfsck: SEL files support 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 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 Tested-by: Elena Gryaznova Reviewed-by: Alexey Lyashkov Reviewed-on: https://review.whamcloud.com/43234 Tested-by: jenkins Reviewed-by: Andreas Dilger Reviewed-by: Elena Gryaznova Tested-by: Maloo Reviewed-by: Lai Siyao Reviewed-by: Oleg Drokin --- diff --git a/lustre/lfsck/lfsck_layout.c b/lustre/lfsck/lfsck_layout.c index f62b365c..a50e259 100644 --- a/lustre/lfsck/lfsck_layout.c +++ b/lustre/lfsck/lfsck_layout.c @@ -96,9 +96,9 @@ struct lfsck_layout_slave_async_args { 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 @@ -329,10 +329,13 @@ out: 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 size; 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; - 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))); @@ -354,10 +357,11 @@ static int lfsck_layout_verify_header_v1v3(struct dt_object *obj, } 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) { +#if 0 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; } - } #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); @@ -376,6 +378,17 @@ static int lfsck_layout_verify_header_v1v3(struct dt_object *obj, 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; } @@ -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) { + bool p_dom = false; 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; + bool p_zero = false; 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); + bool ext, inited, zero; + __u32 flags; 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; } - 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, - 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 { - 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; @@ -2928,7 +2977,7 @@ again: 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); @@ -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; - } 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); @@ -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); - 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); @@ -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); - 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); @@ -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); - 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; @@ -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); - 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; @@ -5668,7 +5717,7 @@ again: 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; @@ -5725,7 +5774,7 @@ fix: 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; @@ -5767,7 +5816,7 @@ out: 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++) { diff --git a/lustre/lod/lod_lov.c b/lustre/lod/lod_lov.c index 9dacc8b..2c990cb 100644 --- a/lustre/lod/lod_lov.c +++ b/lustre/lod/lod_lov.c @@ -2037,7 +2037,7 @@ recheck: 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 */ diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index f24539c..a00dc3b 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -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 && + 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 diff --git a/lustre/tests/sanity-lfsck.sh b/lustre/tests/sanity-lfsck.sh index fc7d989..adcf4951 100644 --- a/lustre/tests/sanity-lfsck.sh +++ b/lustre/tests/sanity-lfsck.sh @@ -5989,6 +5989,35 @@ test_40a() { } 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} diff --git a/lustre/utils/liblustreapi_layout.c b/lustre/utils/liblustreapi_layout.c index fb51e1d..8cc4606 100644 --- a/lustre/utils/liblustreapi_layout.c +++ b/lustre/utils/liblustreapi_layout.c @@ -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 && + 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;