From bb0cc84fbed51e006bfac230dada426bfac4f500 Mon Sep 17 00:00:00 2001 From: Bobi Jam Date: Fri, 18 Aug 2023 01:00:03 +0800 Subject: [PATCH] LU-10026 csdc: DoM pattern could be a combined value DoM pattern is LOV_PATTERN_MDT for now, and in the future it could be combined with LOV_PATTERN_COMPRESS to represent a compressed DoM component. Fix a minor glitch for lov_getstripe_old code path (in ll_lov_getstripe_ea_info), which intends to return the last component stripe info but the commit abf04e7ea3 omits to correctly set the last component stripe info before using it. Fixes: abf04e7ea3 ("LU-14337 lov: return valid stripe_count/size for PFL files") Signed-off-by: Bobi Jam Change-Id: Id0779c30c004b6979f88bf96b7b7b74a8b8c26e4 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/51978 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin Reviewed-by: Patrick Farrell Reviewed-by: Andreas Dilger --- lustre/include/uapi/linux/lustre/lustre_user.h | 9 +++++---- lustre/lfsck/lfsck_layout.c | 4 ++-- lustre/llite/file.c | 9 +++++++-- lustre/lod/lod_lov.c | 6 +++--- lustre/lod/lod_object.c | 14 +++++++------- lustre/lod/lod_qos.c | 11 ++++------- lustre/lov/lov_cl_internal.h | 4 ++-- lustre/lov/lov_ea.c | 2 +- lustre/lov/lov_internal.h | 2 +- lustre/mdd/mdd_object.c | 2 +- lustre/mdt/mdt_handler.c | 4 ++-- lustre/utils/liblustreapi.c | 8 ++++---- lustre/utils/liblustreapi_layout.c | 9 +++++---- 13 files changed, 44 insertions(+), 40 deletions(-) diff --git a/lustre/include/uapi/linux/lustre/lustre_user.h b/lustre/include/uapi/linux/lustre/lustre_user.h index 8243370..3e0e3ba 100644 --- a/lustre/include/uapi/linux/lustre/lustre_user.h +++ b/lustre/include/uapi/linux/lustre/lustre_user.h @@ -731,10 +731,11 @@ struct fsxattr { static inline bool lov_pattern_supported(__u32 pattern) { - return (pattern & ~LOV_PATTERN_F_RELEASED) == LOV_PATTERN_RAID0 || - (pattern & ~LOV_PATTERN_F_RELEASED) == - (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING) || - (pattern & ~LOV_PATTERN_F_RELEASED) == LOV_PATTERN_MDT; + __u32 pattern_base = pattern & ~LOV_PATTERN_F_RELEASED; + + return pattern_base == LOV_PATTERN_RAID0 || + pattern_base == (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING) || + pattern_base == LOV_PATTERN_MDT; } /* RELEASED and MDT patterns are not valid in many places, so rather than diff --git a/lustre/lfsck/lfsck_layout.c b/lustre/lfsck/lfsck_layout.c index de5554f..e31817a 100644 --- a/lustre/lfsck/lfsck_layout.c +++ b/lustre/lfsck/lfsck_layout.c @@ -357,10 +357,10 @@ 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); + *dom = !!(lov_pattern(pattern) & LOV_PATTERN_MDT); /* XXX: DoM file verification will be supportted via LU-11081. */ - if (lov_pattern(pattern) == LOV_PATTERN_MDT) { + if (lov_pattern(pattern) & LOV_PATTERN_MDT) { #if 0 if (start != 0) { CDEBUG(D_LFSCK, "The DoM entry for "DFID" is not " diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 626aea8..6b0ebeb 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -2587,7 +2587,7 @@ int ll_lov_getstripe_ea_info(struct inode *inode, const char *filename, if (lmm->lmm_magic == LOV_MAGIC_COMP_V1) { struct lov_comp_md_v1 *comp_v1 = NULL; struct lov_comp_md_entry_v1 *ent; - struct lov_user_md_v1 *v1; + struct lov_user_md_v1 *v1 = NULL; __u32 off; int i = 0; @@ -2602,6 +2602,11 @@ int ll_lov_getstripe_ea_info(struct inode *inode, const char *filename, i, v1->lmm_stripe_count, v1->lmm_stripe_size); } + if (v1 == NULL) + GOTO(out, rc = -EINVAL); + + lmm->lmm_stripe_count = v1->lmm_stripe_count; + lmm->lmm_stripe_size = v1->lmm_stripe_size; /** * Return valid stripe_count and stripe_size instead of 0 for * DoM files to avoid divide-by-zero for older userspace that @@ -2615,7 +2620,7 @@ int ll_lov_getstripe_ea_info(struct inode *inode, const char *filename, * second one is always that applications which are * doing large IOs. */ - if (lmm->lmm_pattern == LOV_PATTERN_MDT) + if (lmm->lmm_pattern & LOV_PATTERN_MDT) i = comp_v1->lcm_entry_count > 1 ? 1 : 0; else i = comp_v1->lcm_entry_count > 1 ? diff --git a/lustre/lod/lod_lov.c b/lustre/lod/lod_lov.c index 388a562..81324ef 100644 --- a/lustre/lod/lod_lov.c +++ b/lustre/lod/lod_lov.c @@ -1656,7 +1656,7 @@ static int lod_verify_v1v3(struct lod_device *d, const struct lu_buf *buf, stripe_offset = le16_to_cpu(lum->lmm_stripe_offset); if (!is_from_disk && stripe_offset != LOV_OFFSET_DEFAULT && - lov_pattern(le32_to_cpu(lum->lmm_pattern)) != LOV_PATTERN_MDT) { + !(lov_pattern(le32_to_cpu(lum->lmm_pattern)) & LOV_PATTERN_MDT)) { /* if offset is not within valid range [0, osts_size) */ if (stripe_offset >= d->lod_ost_descs.ltd_tgts_size) { CDEBUG(D_LAYOUT, "stripe offset %u >= bitmap size %u\n", @@ -2012,7 +2012,7 @@ int lod_verify_striping(const struct lu_env *env, struct lod_device *d, case LOV_USER_MAGIC_V1: case LOV_USER_MAGIC_V3: case LOV_USER_MAGIC_SPECIFIC: - if (lov_pattern(le32_to_cpu(lum->lmm_pattern)) == + if (lov_pattern(le32_to_cpu(lum->lmm_pattern)) & LOV_PATTERN_MDT) { /* DoM must use composite layout */ CDEBUG(D_LAYOUT, "DoM without composite layout\n"); @@ -2111,7 +2111,7 @@ recheck: /* Check DoM entry is always the first one */ lum = tmp.lb_buf; - if (lov_pattern(le32_to_cpu(lum->lmm_pattern)) == + if (lov_pattern(le32_to_cpu(lum->lmm_pattern)) & LOV_PATTERN_MDT) { /* DoM component must be the first in a mirror */ if (le64_to_cpu(ext->e_start) > 0) { diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index e6b4227..fff20a9 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -1159,7 +1159,7 @@ static inline void lod_adjust_stripe_info(struct lod_layout_component *comp, struct lov_desc *desc, int append_stripes) { - if (comp->llc_pattern != LOV_PATTERN_MDT) { + if (!(comp->llc_pattern & LOV_PATTERN_MDT)) { if (append_stripes) { comp->llc_stripe_count = append_stripes; } else if (!comp->llc_stripe_count) { @@ -3411,7 +3411,7 @@ static int lod_declare_layout_merge(const struct lu_env *env, /* check if first entry in new layout is DOM */ lmm = (struct lov_mds_md_v1 *)((char *)merge_lcm + merge_lcm->lcm_entries[0].lcme_offset); - merge_has_dom = lov_pattern(le32_to_cpu(lmm->lmm_pattern)) == + merge_has_dom = lov_pattern(le32_to_cpu(lmm->lmm_pattern)) & LOV_PATTERN_MDT; for (i = 0; i < merge_entry_count; i++) { @@ -4013,7 +4013,7 @@ static void embed_pool_to_comp_v1(const struct lov_comp_md_v1 *src, lum = (struct lov_user_md_v1 *)((char *)src + offset); lum3 = (struct lov_user_md_v3 *)((char *)tgt + offset + shift); *(struct lov_user_md_v1 *)lum3 = *lum; - if (lum->lmm_pattern == cpu_to_le32(LOV_PATTERN_MDT)) { + if (lum->lmm_pattern & cpu_to_le32(LOV_PATTERN_MDT)) { lum3->lmm_magic = cpu_to_le32(LOV_USER_MAGIC_V1); } else { lum3->lmm_magic = cpu_to_le32(LOV_USER_MAGIC_V3); @@ -4122,7 +4122,7 @@ static int lod_xattr_set_default_lov_on_dir(const struct lu_env *env, if (le32_to_cpu(lum->lmm_magic) != LOV_USER_MAGIC_V1) /* the i-th component includes pool info */ break; - if (lum->lmm_pattern == cpu_to_le32(LOV_PATTERN_MDT)) + if (lum->lmm_pattern & cpu_to_le32(LOV_PATTERN_MDT)) size += sizeof(struct lov_user_md_v1); else size += sizeof(struct lov_user_md_v3); @@ -6366,7 +6366,7 @@ int lod_striped_create(const struct lu_env *env, struct dt_object *dt, if (lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED) lod_comp_set_init(lod_comp); - if (lov_pattern(lod_comp->llc_pattern) == LOV_PATTERN_MDT) + if (lov_pattern(lod_comp->llc_pattern) & LOV_PATTERN_MDT) lod_comp_set_init(lod_comp); if (lod_comp->llc_stripe == NULL) @@ -6417,7 +6417,7 @@ static inline bool lod_obj_is_dom(struct dt_object *dt) if (!lo->ldo_comp_cnt) return false; - return (lov_pattern(lo->ldo_comp_entries[0].llc_pattern) == + return (lov_pattern(lo->ldo_comp_entries[0].llc_pattern) & LOV_PATTERN_MDT); } @@ -7438,7 +7438,7 @@ out: /* If striping is already instantiated or INIT'ed DOM? */ static bool lod_is_instantiation_needed(struct lod_layout_component *comp) { - return !(((lov_pattern(comp->llc_pattern) == LOV_PATTERN_MDT) && + return !(((lov_pattern(comp->llc_pattern) & LOV_PATTERN_MDT) && lod_comp_inited(comp)) || comp->llc_stripe); } diff --git a/lustre/lod/lod_qos.c b/lustre/lod/lod_qos.c index 3d2741d..95886cd 100644 --- a/lustre/lod/lod_qos.c +++ b/lustre/lod/lod_qos.c @@ -2478,10 +2478,7 @@ int lod_qos_parse_config(const struct lu_env *env, struct lod_object *lo, if (v1->lmm_pattern == 0) v1->lmm_pattern = LOV_PATTERN_RAID0; - if (lov_pattern(v1->lmm_pattern) != LOV_PATTERN_RAID0 && - lov_pattern(v1->lmm_pattern) != LOV_PATTERN_MDT && - lov_pattern(v1->lmm_pattern) != - (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING)) { + if (!lov_pattern_supported(lov_pattern(v1->lmm_pattern))) { CDEBUG(D_LAYOUT, "%s: invalid pattern: %x\n", lod2obd(d)->obd_name, v1->lmm_pattern); GOTO(free_comp, rc = -EINVAL); @@ -2493,10 +2490,10 @@ int lod_qos_parse_config(const struct lu_env *env, struct lod_object *lo, lod_comp->llc_stripe_count = desc->ld_default_stripe_count; if (v1->lmm_stripe_count || - lov_pattern(v1->lmm_pattern) == LOV_PATTERN_MDT) + (lov_pattern(v1->lmm_pattern) & LOV_PATTERN_MDT)) lod_comp->llc_stripe_count = v1->lmm_stripe_count; - if (lov_pattern(lod_comp->llc_pattern) == LOV_PATTERN_MDT && + if ((lov_pattern(lod_comp->llc_pattern) & LOV_PATTERN_MDT) && lod_comp->llc_stripe_count != 0) { CDEBUG(D_LAYOUT, "%s: invalid stripe count: %u\n", lod2obd(d)->obd_name, @@ -2718,7 +2715,7 @@ int lod_qos_prep_create(const struct lu_env *env, struct lod_object *lo, RETURN(0); /* A Data-on-MDT component is being created */ - if (lov_pattern(lod_comp->llc_pattern) == LOV_PATTERN_MDT) + if (lov_pattern(lod_comp->llc_pattern) & LOV_PATTERN_MDT) RETURN(0); if (lod_comp->llc_pool) diff --git a/lustre/lov/lov_cl_internal.h b/lustre/lov/lov_cl_internal.h index 36100a0..a2f5b45 100644 --- a/lustre/lov/lov_cl_internal.h +++ b/lustre/lov/lov_cl_internal.h @@ -145,10 +145,10 @@ static inline char *llt2str(enum lov_layout_type llt) static inline __u32 lov_entry_type(struct lov_stripe_md_entry *lsme) { if ((lov_pattern(lsme->lsme_pattern) & LOV_PATTERN_RAID0) || - (lov_pattern(lsme->lsme_pattern) == LOV_PATTERN_MDT) || + (lov_pattern(lsme->lsme_pattern) & LOV_PATTERN_MDT) || (lov_pattern(lsme->lsme_pattern) == LOV_PATTERN_FOREIGN)) return lov_pattern(lsme->lsme_pattern & - ~LOV_PATTERN_OVERSTRIPING); + ~(LOV_PATTERN_OVERSTRIPING | LOV_PATTERN_COMPRESS)); return 0; } diff --git a/lustre/lov/lov_ea.c b/lustre/lov/lov_ea.c index beb0f63..c024d6d 100644 --- a/lustre/lov/lov_ea.c +++ b/lustre/lov/lov_ea.c @@ -457,7 +457,7 @@ lsme_unpack_comp(struct lov_obd *lov, struct lov_mds_md *lmm, if (magic != LOV_MAGIC_FOREIGN && le16_to_cpu(lmm->lmm_stripe_count) == 0 && - lov_pattern(le32_to_cpu(lmm->lmm_pattern)) != LOV_PATTERN_MDT) + !(lov_pattern(le32_to_cpu(lmm->lmm_pattern)) & LOV_PATTERN_MDT)) RETURN(ERR_PTR(-EINVAL)); if (magic == LOV_MAGIC_V1) { diff --git a/lustre/lov/lov_internal.h b/lustre/lov/lov_internal.h index 9e82077..9f12353 100644 --- a/lustre/lov/lov_internal.h +++ b/lustre/lov/lov_internal.h @@ -56,7 +56,7 @@ struct lov_stripe_md_entry { static inline bool lsme_is_dom(struct lov_stripe_md_entry *lsme) { - return (lov_pattern(lsme->lsme_pattern) == LOV_PATTERN_MDT); + return (lov_pattern(lsme->lsme_pattern) & LOV_PATTERN_MDT); } static inline void copy_lsm_entry(struct lov_stripe_md_entry *dst, diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 698b27b..ad40881 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -1226,7 +1226,7 @@ static inline __u64 mdd_lmm_dom_size(void *buf) v1 = (struct lov_mds_md *)((char *)comp_v1 + off); /* DoM entry is the first entry always */ - if (lov_pattern(le32_to_cpu(v1->lmm_pattern)) == LOV_PATTERN_MDT) + if (lov_pattern(le32_to_cpu(v1->lmm_pattern)) & LOV_PATTERN_MDT) return le64_to_cpu(comp_v1->lcm_entries[0].lcme_extent.e_end); return 0; diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 620aea2..5eb14dd 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -620,7 +620,7 @@ __u32 mdt_lmm_dom_entry_check(struct lov_mds_md *lmm, int *is_dom_only) /* Fast check for DoM entry with no mirroring, should be the first */ if (le16_to_cpu(comp_v1->lcm_mirror_count) == 0 && - lov_pattern(le32_to_cpu(v1->lmm_pattern)) != LOV_PATTERN_MDT) + !(lov_pattern(le32_to_cpu(v1->lmm_pattern)) & LOV_PATTERN_MDT)) RETURN(0); /* check all entries otherwise */ @@ -634,7 +634,7 @@ __u32 mdt_lmm_dom_entry_check(struct lov_mds_md *lmm, int *is_dom_only) off = le32_to_cpu(lcme->lcme_offset); v1 = (struct lov_mds_md *)((char *)comp_v1 + off); - if (lov_pattern(le32_to_cpu(v1->lmm_pattern)) == + if (lov_pattern(le32_to_cpu(v1->lmm_pattern)) & LOV_PATTERN_MDT) dom_stripesize = le32_to_cpu(v1->lmm_stripe_size); else diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index b405cd0..b58289b 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -381,7 +381,7 @@ static int llapi_stripe_param_verify(const struct llapi_stripe_param *param, } count = param->lsp_stripe_count; - if (param->lsp_stripe_pattern == LOV_PATTERN_MDT) { + if (param->lsp_stripe_pattern & LOV_PATTERN_MDT) { rc = -EINVAL; llapi_error(LLAPI_MSG_ERROR, rc, "Invalid pattern: '-L mdt', must be specified " @@ -2702,7 +2702,7 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path, space, prefix); if (is_dir) { if (!is_raw && lum->lmm_stripe_count == 0 && - lov_pattern(lum->lmm_pattern) != LOV_PATTERN_MDT) { + !(lov_pattern(lum->lmm_pattern) & LOV_PATTERN_MDT)){ unsigned int scount; rc = sattr_cache_get_defaults(NULL, path, @@ -2797,7 +2797,7 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path, else llapi_printf(LLAPI_MSG_NORMAL, fmt_idx, lum->lmm_stripe_offset); - else if (lov_pattern(lum->lmm_pattern) == LOV_PATTERN_MDT) + else if (lov_pattern(lum->lmm_pattern) & LOV_PATTERN_MDT) llapi_printf(LLAPI_MSG_NORMAL, "0"); else llapi_printf(LLAPI_MSG_NORMAL, fmt_idx, @@ -2856,7 +2856,7 @@ void lov_dump_user_lmm_v1v3(struct lov_user_md *lum, char *pool_name, if (!skip_objs && (verbose & VERBOSE_OBJID) && ((!is_dir && !(lum->lmm_pattern & LOV_PATTERN_F_RELEASED || - lov_pattern(lum->lmm_pattern) == LOV_PATTERN_MDT)) || + lov_pattern(lum->lmm_pattern) & LOV_PATTERN_MDT)) || (is_dir && (lum->lmm_magic == LOV_USER_MAGIC_SPECIFIC)))) { char *space = " - "; diff --git a/lustre/utils/liblustreapi_layout.c b/lustre/utils/liblustreapi_layout.c index 6e4a844..2dab94e 100644 --- a/lustre/utils/liblustreapi_layout.c +++ b/lustre/utils/liblustreapi_layout.c @@ -556,7 +556,7 @@ struct llapi_layout *llapi_layout_get_by_xattr(void *lov_xattr, else if (v1->lmm_pattern == (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING)) comp->llc_pattern = LLAPI_LAYOUT_OVERSTRIPING; - else if (v1->lmm_pattern == LOV_PATTERN_MDT) + else if (v1->lmm_pattern & LOV_PATTERN_MDT) comp->llc_pattern = LLAPI_LAYOUT_MDT; else /* Lustre only supports RAID0, overstripping @@ -3424,8 +3424,8 @@ static int llapi_layout_sanity_cb(struct llapi_layout *layout, goto out_err; /* DoM sanity checks */ - if (comp->llc_pattern == LLAPI_LAYOUT_MDT || - comp->llc_pattern == LOV_PATTERN_MDT) { + if (!(comp->llc_pattern & LLAPI_LAYOUT_INVALID) && + (comp->llc_pattern & (LLAPI_LAYOUT_MDT | LOV_PATTERN_MDT))) { /* DoM components can't be extension components */ if (comp->llc_flags & LCME_FL_EXTENSION) { args->lsa_rc = LSE_DOM_EXTENSION; @@ -3615,7 +3615,8 @@ int llapi_layout_dom_size(struct llapi_layout *layout, uint64_t *size) if (rc) return -errno; - if (pattern != LOV_PATTERN_MDT && pattern != LLAPI_LAYOUT_MDT) { + if ((pattern & LLAPI_LAYOUT_INVALID) || + !(pattern & (LOV_PATTERN_MDT | LLAPI_LAYOUT_MDT))) { *size = 0; return 0; } -- 1.8.3.1