From 4508ed1c2a42d6ca4e4c1efddd5a93c2056333a6 Mon Sep 17 00:00:00 2001 From: Mikhail Pershin Date: Fri, 4 Jul 2014 17:33:35 +0400 Subject: [PATCH] LU-3285 lod: add support for DOM LOD checks for DOM stripping and understand it. Signed-off-by: Mikhail Pershin Change-Id: I33bc975927d03a807cdc884117eeceab56fa0e83 Reviewed-on: https://review.whamcloud.com/28011 Reviewed-by: Jinshan Xiong Reviewed-by: Bobi Jam Reviewed-by: Andreas Dilger Tested-by: Jenkins Tested-by: Maloo --- lustre/lod/lod_lov.c | 22 ++++++++++++++++++---- lustre/lod/lod_object.c | 11 +++++++++-- lustre/lod/lod_qos.c | 14 +++++++++++--- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/lustre/lod/lod_lov.c b/lustre/lod/lod_lov.c index 08d5ce7..a7e6129 100644 --- a/lustre/lod/lod_lov.c +++ b/lustre/lod/lod_lov.c @@ -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; } diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index c008ee7..1254f33 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -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; diff --git a/lustre/lod/lod_qos.c b/lustre/lod/lod_qos.c index d42f7d1..ec6d37c 100644 --- a/lustre/lod/lod_qos.c +++ b/lustre/lod/lod_qos.c @@ -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 -- 1.8.3.1