struct mdt_device *mdt = info->mti_mdt;
struct lu_fid *fid = &info->mti_tmp_fid2;
struct ldlm_enqueue_info *einfo = &info->mti_einfo[0];
+ struct lmv_user_md *lum = spec->u.sp_ea.eadata;
struct lmv_mds_md_v1 *lmv;
struct mdt_object *child;
struct mdt_lock_handle *lhp;
if (!mdt->mdt_enable_dir_restripe)
RETURN(-EPERM);
+ LASSERT(lum);
+ lum->lum_hash_type |= cpu_to_le32(LMV_HASH_FLAG_FIXED);
+
rc = mdt_version_get_check_save(info, parent, 0);
if (rc)
RETURN(rc);
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 (rc)
GOTO(put_child, rc);
- /* Let lower layer know current lock mode. */
- info->mti_spec.sp_cr_mode = mdt_dlm_mode2mdl_mode(lh->mlh_pdo_mode);
-
/*
* Do not perform lookup sanity check. We know that name does
* not exist.
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 */