Whamcloud - gitweb
LU-3285 lod: add support for DOM 11/28011/14
authorMikhail Pershin <mike.pershin@intel.com>
Fri, 4 Jul 2014 13:33:35 +0000 (17:33 +0400)
committerMike Pershin <mike.pershin@intel.com>
Fri, 13 Oct 2017 12:37:29 +0000 (12:37 +0000)
LOD checks for DOM stripping and understand it.

Signed-off-by: Mikhail Pershin <mike.pershin@intel.com>
Change-Id: I33bc975927d03a807cdc884117eeceab56fa0e83
Reviewed-on: https://review.whamcloud.com/28011
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
lustre/lod/lod_lov.c
lustre/lod/lod_object.c
lustre/lod/lod_qos.c

index 08d5ce7..a7e6129 100644 (file)
@@ -1257,7 +1257,8 @@ int lod_parse_striping(const struct lu_env *env, struct lod_object *lo,
                }
 
                pattern = le32_to_cpu(lmm->lmm_pattern);
-               if (lov_pattern(pattern) != LOV_PATTERN_RAID0)
+               if (lov_pattern(pattern) != LOV_PATTERN_RAID0 &&
+                   lov_pattern(pattern) != LOV_PATTERN_MDT)
                        GOTO(out, rc = -EINVAL);
 
                lod_comp->llc_pattern = pattern;
@@ -1318,7 +1319,8 @@ int lod_parse_striping(const struct lu_env *env, struct lod_object *lo,
                if (!lod_comp_inited(lod_comp))
                        continue;
 
-               if (!(lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED)) {
+               if (!(lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED) &&
+                   !(lod_comp->llc_pattern & LOV_PATTERN_MDT)) {
                        rc = lod_initialize_objects(env, lo, objs, i);
                        if (rc)
                                GOTO(out, rc);
@@ -1545,7 +1547,8 @@ 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) {
+       if (!is_from_disk && stripe_offset != LOV_OFFSET_DEFAULT &&
+           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_osts_size) {
                        CDEBUG(D_LAYOUT, "stripe offset %u >= bitmap size %u\n",
@@ -1701,6 +1704,16 @@ int lod_verify_striping(struct lod_device *d, const struct lu_buf *buf,
                        tmp.lb_buf = (char *)comp_v1 +
                                     le32_to_cpu(ent->lcme_offset);
                        tmp.lb_len = le32_to_cpu(ent->lcme_size);
+
+                       /* Check DoM entry is always the first one */
+                       lum = tmp.lb_buf;
+                       if (lov_pattern(le32_to_cpu(lum->lmm_pattern)) ==
+                           LOV_PATTERN_MDT && i > 0) {
+                               CDEBUG(D_LAYOUT, "invalid DoM layout entry "
+                                      "found at %i index\n", i);
+                               RETURN(-EINVAL);
+
+                       }
                        rc = lod_verify_v1v3(d, &tmp, is_from_disk);
                        if (rc)
                                break;
@@ -1779,7 +1792,8 @@ void lod_fix_desc_stripe_count(__u32 *val)
 void lod_fix_desc_pattern(__u32 *val)
 {
        /* from lov_setstripe */
-       if ((*val != 0) && (*val != LOV_PATTERN_RAID0)) {
+       if ((*val != 0) && (*val != LOV_PATTERN_RAID0) &&
+           (*val != LOV_PATTERN_MDT)) {
                LCONSOLE_WARN("Unknown stripe pattern: %#x\n", *val);
                *val = 0;
        }
index c008ee7..1254f33 100644 (file)
@@ -3634,6 +3634,7 @@ static int lod_get_default_lov_striping(const struct lu_env *env,
                }
 
                if (v1->lmm_pattern != LOV_PATTERN_RAID0 &&
+                   v1->lmm_pattern != LOV_PATTERN_MDT &&
                    v1->lmm_pattern != 0) {
                        lod_free_def_comp_entries(lds);
                        RETURN(-EINVAL);
@@ -3648,6 +3649,7 @@ static int lod_get_default_lov_striping(const struct lu_env *env,
                lod_comp->llc_stripe_count = v1->lmm_stripe_count;
                lod_comp->llc_stripe_size = v1->lmm_stripe_size;
                lod_comp->llc_stripe_offset = v1->lmm_stripe_offset;
+               lod_comp->llc_pattern = v1->lmm_pattern;
 
                pool = NULL;
                if (v1->lmm_magic == LOV_USER_MAGIC_V3) {
@@ -3758,10 +3760,11 @@ static void lod_striping_from_default(struct lod_object *lo,
                                                &lds->lds_def_comp_entries[i];
 
                        CDEBUG(D_LAYOUT, "Inherite from default: size:%hu "
-                              "nr:%u offset:%u %s\n",
+                              "nr:%u offset:%u pattern %#x %s\n",
                               def_comp->llc_stripe_size,
                               def_comp->llc_stripe_count,
                               def_comp->llc_stripe_offset,
+                              def_comp->llc_pattern,
                               def_comp->llc_pool ?: "");
 
                        *obj_comp = *def_comp;
@@ -3782,7 +3785,8 @@ static void lod_striping_from_default(struct lod_object *lo,
                        if (!lo->ldo_is_composite)
                                continue;
 
-                       if (obj_comp->llc_stripe_count <= 0)
+                       if (obj_comp->llc_stripe_count <= 0 &&
+                           obj_comp->llc_pattern != LOV_PATTERN_MDT)
                                obj_comp->llc_stripe_count =
                                        desc->ld_default_stripe_count;
                        if (obj_comp->llc_stripe_size <= 0)
@@ -4330,6 +4334,9 @@ 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)
+                       lod_comp_set_init(lod_comp);
+
                if (lod_comp->llc_stripe == NULL)
                        continue;
 
index d42f7d1..ec6d37c 100644 (file)
@@ -1958,25 +1958,29 @@ 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) {
+               if (lov_pattern(v1->lmm_pattern) != LOV_PATTERN_RAID0 &&
+                   lov_pattern(v1->lmm_pattern) != LOV_PATTERN_MDT) {
                        CDEBUG(D_LAYOUT, "%s: invalid pattern: %x\n",
                               lod2obd(d)->obd_name, v1->lmm_pattern);
                        GOTO(free_comp, rc = -EINVAL);
                }
 
                lod_comp->llc_pattern = v1->lmm_pattern;
-
                lod_comp->llc_stripe_size = desc->ld_default_stripe_size;
                if (v1->lmm_stripe_size)
                        lod_comp->llc_stripe_size = v1->lmm_stripe_size;
 
                lod_comp->llc_stripe_count = desc->ld_default_stripe_count;
-               if (v1->lmm_stripe_count)
+               if (v1->lmm_stripe_count ||
+                   lov_pattern(v1->lmm_pattern) == LOV_PATTERN_MDT)
                        lod_comp->llc_stripe_count = v1->lmm_stripe_count;
 
                lod_comp->llc_stripe_offset = v1->lmm_stripe_offset;
                lod_obj_set_pool(lo, i, pool_name);
 
+               LASSERT(ergo(lov_pattern(lod_comp->llc_pattern) ==
+                            LOV_PATTERN_MDT, lod_comp->llc_stripe_count == 0));
+
                if (pool_name == NULL)
                        continue;
 
@@ -2051,6 +2055,10 @@ int lod_qos_prep_create(const struct lu_env *env, struct lod_object *lo,
        if (lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED)
                RETURN(0);
 
+       /* A Data-on-MDT component is being created */
+       if (lov_pattern(lod_comp->llc_pattern) == LOV_PATTERN_MDT)
+               RETURN(0);
+
        if (likely(lod_comp->llc_stripe == NULL)) {
                /*
                 * no striping has been created so far