struct lov_comp_md_entry_v1 *comp_entry_v1(struct lov_comp_md_v1 *comp, int i)
{
LASSERTF((le32_to_cpu(comp->lcm_magic) & ~LOV_MAGIC_DEFINED) ==
- LOV_USER_MAGIC_COMP_V1, "Wrong magic %x\n",
+ LOV_USER_MAGIC_COMP_V1 ||
+ (le32_to_cpu(comp->lcm_magic) & ~LOV_MAGIC_DEFINED) ==
+ LOV_USER_MAGIC_SEL, "Wrong magic %x\n",
le32_to_cpu(comp->lcm_magic));
LASSERTF(i >= 0 && i < le16_to_cpu(comp->lcm_entry_count),
"bad index %d, max = %d\n",
RETURN(-EINVAL);
}
- if (magic != LOV_USER_MAGIC_V1 &&
- magic != LOV_USER_MAGIC_V3 &&
- magic != LOV_USER_MAGIC_SPECIFIC &&
- magic != LOV_USER_MAGIC_COMP_V1) {
+ switch (magic) {
+ case LOV_USER_MAGIC_FOREIGN:
+ RETURN(0);
+ case LOV_USER_MAGIC_V1:
+ case LOV_USER_MAGIC_V3:
+ case LOV_USER_MAGIC_SPECIFIC:
+ RETURN(lod_verify_v1v3(d, buf, is_from_disk));
+ case LOV_USER_MAGIC_COMP_V1:
+ case LOV_USER_MAGIC_SEL:
+ break;
+ default:
CDEBUG(D_LAYOUT, "bad userland LOV MAGIC: %#x\n",
le32_to_cpu(lum->lmm_magic));
RETURN(-EINVAL);
}
- if (magic != LOV_USER_MAGIC_COMP_V1)
- RETURN(lod_verify_v1v3(d, buf, is_from_disk));
-
/* magic == LOV_USER_MAGIC_COMP_V1 */
comp_v1 = buf->lb_buf;
if (buf->lb_len < le32_to_cpu(comp_v1->lcm_size)) {
else if (rc)
RETURN(rc);
+ if (le16_to_cpu(lum->lmm_stripe_count) == 1)
+ lum->lmm_stripe_count = 0;
/* Any stripe count is forbidden on DoM component */
- if (lum->lmm_stripe_count) {
+ if (lum->lmm_stripe_count > 0) {
CDEBUG(D_LAYOUT,
"invalid DoM layout stripe count %u, must be 0\n",
le16_to_cpu(lum->lmm_stripe_count));
ENTRY;
+ lds->lds_def_striping_set = 0;
+
rc = lod_get_lov_ea(env, lo);
if (rc < 0)
RETURN(rc);
*/
if (likely(lp != NULL)) {
lod_get_default_striping(env, lp, lds);
-
+ if (lds->lds_def_striping_set) {
+ rc = lod_verify_striping(env, d, lp,
+ &info->lti_buf, false);
+ if (rc)
+ lds->lds_def_striping_set = 0;
+ }
/* inherit default striping except ROOT */
if ((lds->lds_def_striping_set ||
lds->lds_dir_def_striping_set) &&
*/
if (likely(lp != NULL)) {
rc = lod_get_default_lov_striping(env, lp, lds, ah);
- if (rc == 0)
- lod_striping_from_default(lc, lds, child_mode);
+ if (rc == 0 && lds->lds_def_striping_set) {
+ rc = lod_verify_striping(env, d, lp, &info->lti_buf,
+ false);
+ if (rc == 0)
+ lod_striping_from_default(lc, lds, child_mode);
+ }
}
/* Initialize lod_device::lod_md_root object reference */
lod_need_inherit_more(lc, true, ah->dah_append_pool)) {
rc = lod_get_default_lov_striping(env, d->lod_md_root, lds,
ah);
+ if (rc || !lds->lds_def_striping_set)
+ goto out;
+
+ rc = lod_verify_striping(env, d, d->lod_md_root, &info->lti_buf,
+ false);
if (rc)
goto out;
+
if (lc->ldo_comp_cnt == 0) {
lod_striping_from_default(lc, lds, child_mode);
} else if (!lds->lds_def_striping_is_composite) {
}
run_test 270h "DoM: DoM stripe removal when disabled on server"
+test_270i() {
+ (( $MDS1_VERSION >= $(version_code 2.14.54) )) ||
+ skip "Need MDS version at least 2.14.54"
+
+ mkdir $DIR/$tdir
+ $LFS setstripe -L mdt -S 128k -c -1 $DIR/$tdir &&
+ error "setstripe should fail" || true
+}
+run_test 270i "DoM: setting invalid DoM striping should fail"
+
test_271a() {
[ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
skip "Need MDS version at least 2.10.55"