cpu_to_le32(LMV_HASH_TYPE_MASK);
lmv->lmv_layout_version =
cpu_to_le32(lo->ldo_dir_layout_version + 1);
+ lmv->lmv_migrate_offset = 0;
+ lmv->lmv_migrate_hash = 0;
for (i = 0; i < lo->ldo_dir_stripe_count; i++) {
dto = lo->ldo_stripe[i];
if (ma->ma_valid & MA_LMV) {
/* don't allow restripe if parent dir layout is changing */
lmv = &ma->ma_lmv->lmv_md_v1;
- if (!lmv_is_sane(lmv))
+ if (!lmv_is_sane2(lmv))
GOTO(unlock_parent, rc = -EBADF);
if (lmv_is_layout_changing(lmv))
GOTO(out_child, rc = -EREMOTE);
}
+ if (!S_ISDIR(lu_object_attr(&child->mot_obj)))
+ GOTO(out_child, rc = -ENOTDIR);
+
+ rc = mdt_stripe_get(info, child, ma, XATTR_NAME_LMV);
+ if (rc)
+ GOTO(out_child, rc);
+
+ /* race with migrate? */
+ if ((ma->ma_valid & MA_LMV) &&
+ lmv_is_migrating(&ma->ma_lmv->lmv_md_v1))
+ GOTO(out_child, rc = -EBUSY);
+
/* lock object */
lhc = &info->mti_lh[MDT_LH_CHILD];
mdt_lock_reg_init(lhc, LCK_EX);
if (ma->ma_valid & MA_LOV && mdt_lmm_dom_stripesize(ma->ma_lmm))
info->mti_spec.sp_migrate_nsonly = 1;
+ } else if (S_ISDIR(lu_object_attr(&sobj->mot_obj))) {
+ rc = mdt_stripe_get(info, sobj, ma, XATTR_NAME_LMV);
+ if (rc)
+ GOTO(unlock_links, rc);
+
+ /* race with restripe/auto-split? */
+ if ((ma->ma_valid & MA_LMV) &&
+ lmv_is_restriping(&ma->ma_lmv->lmv_md_v1))
+ GOTO(unlock_links, rc = -EBUSY);
}
/* if migration HSM is allowed */
if (le32_to_cpu(lmv->lmv_magic) != LMV_MAGIC_STRIPE)
GOTO(out, rc = -EINVAL);
+ /* race with migrate? */
+ if (lmv_hash_is_migrating(cpu_to_le32(lmv->lmv_hash_type)))
+ GOTO(out, rc = -EBUSY);
+
lmv_stripe_count = le32_to_cpu(lmv->lmv_stripe_count);
/* save stripe to clear 'restriping' flag in the end to avoid
lmv->lmv_hash_type &= ~LMV_HASH_FLAG_LAYOUT_CHANGE;
lmv->lmv_layout_version = cpu_to_le32(++version);
+ lmv->lmv_migrate_offset = 0;
+ lmv->lmv_migrate_hash = 0;
buf->lb_buf = lmv;
buf->lb_len = sizeof(*lmv);
rc = mo_xattr_set(env, mdt_object_child(obj), buf,