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>
}
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;
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);
}
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",
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;
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;
}
}
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);
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) {
&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;
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)
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;
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;
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