*/
/*
* This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
*
* lustre/mdt/mdt_reint.c
*
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 (OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_LINK))
RETURN(err_serious(-ENOENT));
- if (OBD_FAIL_PRECHECK(OBD_FAIL_PTLRPC_RESEND_RACE)) {
+ if (OBD_FAIL_PRECHECK(OBD_FAIL_PTLRPC_RESEND_RACE) ||
+ OBD_FAIL_PRECHECK(OBD_FAIL_PTLRPC_ENQ_RESEND)) {
req->rq_no_reply = 1;
RETURN(err_serious(-ENOENT));
}
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 */
mdt_object_remote(msrcdir))
GOTO(out_put_tgtdir, rc = -EXDEV);
- /* This may be further relaxed in the future for different
- * source and target parents. Start with only same-directory
- * renames of non-directory files for simplicity and because
- * this is by far the most common use case.
+ /* This might be further relaxed in the future for regular file
+ * renames in different source and target parents. Start with
+ * only same-directory renames for simplicity and because this
+ * is by far the most the common use case.
*/
- if (msrcdir != mtgtdir || S_ISDIR(ma->ma_attr.la_mode)) {
+ if (msrcdir != mtgtdir) {
rc = mdt_rename_lock(info, &rename_lh);
if (rc != 0) {
CERROR("%s: cannot lock for rename: rc = %d\n",