Whamcloud - gitweb
LU-10026 csdc: DoM pattern could be a combined value 78/51978/5
authorBobi Jam <bobijam@whamcloud.com>
Thu, 17 Aug 2023 17:00:03 +0000 (01:00 +0800)
committerOleg Drokin <green@whamcloud.com>
Wed, 6 Sep 2023 06:22:23 +0000 (06:22 +0000)
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 <bobijam@whamcloud.com>
Change-Id: Id0779c30c004b6979f88bf96b7b7b74a8b8c26e4
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/51978
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
13 files changed:
lustre/include/uapi/linux/lustre/lustre_user.h
lustre/lfsck/lfsck_layout.c
lustre/llite/file.c
lustre/lod/lod_lov.c
lustre/lod/lod_object.c
lustre/lod/lod_qos.c
lustre/lov/lov_cl_internal.h
lustre/lov/lov_ea.c
lustre/lov/lov_internal.h
lustre/mdd/mdd_object.c
lustre/mdt/mdt_handler.c
lustre/utils/liblustreapi.c
lustre/utils/liblustreapi_layout.c

index 8243370..3e0e3ba 100644 (file)
@@ -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
index de5554f..e31817a 100644 (file)
@@ -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 "
index 626aea8..6b0ebeb 100644 (file)
@@ -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 ?
index 388a562..81324ef 100644 (file)
@@ -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) {
index e6b4227..fff20a9 100644 (file)
@@ -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);
 }
 
index 3d2741d..95886cd 100644 (file)
@@ -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)
index 36100a0..a2f5b45 100644 (file)
@@ -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;
 }
 
index beb0f63..c024d6d 100644 (file)
@@ -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) {
index 9e82077..9f12353 100644 (file)
@@ -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,
index 698b27b..ad40881 100644 (file)
@@ -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;
index 620aea2..5eb14dd 100644 (file)
@@ -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
index b405cd0..b58289b 100644 (file)
@@ -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 = "      - ";
 
index 6e4a844..2dab94e 100644 (file)
@@ -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;
        }