if (repbody->valid & OBD_MD_FLMDSCAPA)
RETURN(rc);
- if (rc == 0 && info->mti_mdt->mdt_opts.mo_mds_capa &&
+ if (rc == 0 && info->mti_mdt->mdt_lut.lut_mds_capa &&
exp_connect_flags(info->mti_exp) & OBD_CONNECT_MDS_CAPA) {
struct lustre_capa *capa;
* FID, therefore we need to get object by name and check its version.
*/
int mdt_lookup_version_check(struct mdt_thread_info *info,
- struct mdt_object *p, struct lu_name *lname,
- struct lu_fid *fid, int idx)
+ struct mdt_object *p, const struct lu_name *lname,
+ struct lu_fid *fid, int idx)
{
int rc, vbrc;
struct mdt_body *repbody;
struct md_attr *ma = &info->mti_attr;
struct mdt_reint_record *rr = &info->mti_rr;
- struct lu_name *lname;
int rc;
ENTRY;
- DEBUG_REQ(D_INODE, mdt_info_req(info), "Create (%s->"DFID") in "DFID,
- rr->rr_name, PFID(rr->rr_fid2), PFID(rr->rr_fid1));
+ DEBUG_REQ(D_INODE, mdt_info_req(info), "Create ("DNAME"->"DFID") "
+ "in "DFID,
+ PNAME(&rr->rr_name), PFID(rr->rr_fid2), PFID(rr->rr_fid1));
if (fid_is_obf(rr->rr_fid1) || fid_is_dot_lustre(rr->rr_fid1))
RETURN(-EPERM);
repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
- lh = &info->mti_lh[MDT_LH_PARENT];
- mdt_lock_pdo_init(lh, LCK_PW, rr->rr_name, rr->rr_namelen);
+ lh = &info->mti_lh[MDT_LH_PARENT];
+ mdt_lock_pdo_init(lh, LCK_PW, &rr->rr_name);
parent = mdt_object_find_lock(info, rr->rr_fid1, lh,
MDS_INODELOCK_UPDATE);
* Check child name version during replay.
* During create replay a file may exist with same name.
*/
- lname = mdt_name(info->mti_env, (char *)rr->rr_name, rr->rr_namelen);
- rc = mdt_lookup_version_check(info, parent, lname,
- &info->mti_tmp_fid1, 1);
+ rc = mdt_lookup_version_check(info, parent, &rr->rr_name,
+ &info->mti_tmp_fid1, 1);
if (rc == 0)
GOTO(out_put_parent, rc = -EEXIST);
OBD_FAIL_MDS_REINT_CREATE_WRITE);
/* Version of child will be updated on disk. */
- info->mti_mos = child;
+ tgt_vbr_obj_set(info->mti_env, mdt_obj2dt(child));
rc = mdt_version_get_check_save(info, child, 2);
if (rc)
GOTO(out_put_child, rc);
info->mti_spec.sp_cr_lookup = 0;
info->mti_spec.sp_feat = &dt_directory_features;
- rc = mdo_create(info->mti_env, next, lname,
- mdt_object_child(child),
- &info->mti_spec, ma);
+ rc = mdo_create(info->mti_env, next, &rr->rr_name,
+ mdt_object_child(child), &info->mti_spec, ma);
if (rc == 0)
rc = mdt_attr_get_complex(info, child, ma);
/* VBR: update version if attr changed are important for recovery */
if (do_vbr) {
/* update on-disk version of changed object */
- info->mti_mos = mo;
+ tgt_vbr_obj_set(info->mti_env, mdt_obj2dt(mo));
rc = mdt_version_get_check_save(info, mo, 0);
if (rc)
GOTO(out_unlock, rc);
}
+ /* Ensure constant striping during chown(). See LU-2789. */
+ if (ma->ma_attr.la_valid & (LA_UID|LA_GID))
+ mutex_lock(&mo->mot_lov_mutex);
+
/* all attrs are packed into mti_attr in unpack_setattr */
rc = mo_attr_set(info->mti_env, mdt_object_child(mo), ma);
+
+ if (ma->ma_attr.la_valid & (LA_UID|LA_GID))
+ mutex_unlock(&mo->mot_lov_mutex);
+
if (rc != 0)
GOTO(out_unlock, rc);
rc = mdt_attr_get_complex(info, mo, ma);
if (rc) {
CERROR("file attribute read error for "DFID": %d.\n",
- PFID(lu_object_fid(&mo->mot_obj.mo_lu)), rc);
+ PFID(mdt_object_fid(mo)), rc);
RETURN(rc);
}
/* If an up2date copy exists in the backend, add dirty flag */
if ((ma->ma_valid & MA_HSM) && (ma->ma_hsm.mh_flags & HS_EXISTS)
&& !(ma->ma_hsm.mh_flags & (HS_DIRTY|HS_RELEASED))) {
+ struct mdt_lock_handle *lh = &info->mti_lh[MDT_LH_CHILD];
ma->ma_hsm.mh_flags |= HS_DIRTY;
+
+ mdt_lock_reg_init(lh, LCK_PW);
+ rc = mdt_object_lock(info, mo, lh, MDS_INODELOCK_XATTR,
+ MDT_LOCAL_LOCK);
+ if (rc != 0)
+ RETURN(rc);
+
rc = mdt_hsm_attr_set(info, mo, &ma->ma_hsm);
- if (rc) {
+ if (rc)
CERROR("file attribute change error for "DFID": %d\n",
- PFID(lu_object_fid(&mo->mot_obj.mo_lu)), rc);
- RETURN(rc);
- }
+ PFID(mdt_object_fid(mo)), rc);
+ mdt_object_unlock(info, mo, lh, rc);
}
RETURN(rc);
if (rc)
GOTO(out_put, rc);
- mfd = mdt_mfd_new();
+ mfd = mdt_mfd_new(med);
if (mfd == NULL) {
mdt_write_put(mo);
GOTO(out_put, rc = -ENOMEM);
LASSERT(info->mti_ioepoch);
spin_lock(&med->med_open_lock);
- mfd = mdt_handle2mfd(info, &info->mti_ioepoch->handle);
+ mfd = mdt_handle2mfd(med, &info->mti_ioepoch->handle,
+ req_is_replay(req));
if (mfd == NULL) {
spin_unlock(&med->med_open_lock);
CDEBUG(D_INODE, "no handle for file close: "
ma->ma_need = MA_INODE;
ma->ma_valid = 0;
rc = mdt_attr_get_complex(info, mo, ma);
- if (rc != 0)
- GOTO(out_put, rc);
+ if (rc != 0)
+ GOTO(out_put, rc);
- mdt_pack_attr2body(info, repbody, &ma->ma_attr, mdt_object_fid(mo));
+ mdt_pack_attr2body(info, repbody, &ma->ma_attr, mdt_object_fid(mo));
- if (info->mti_mdt->mdt_opts.mo_oss_capa &&
+ if (info->mti_mdt->mdt_lut.lut_oss_capa &&
exp_connect_flags(info->mti_exp) & OBD_CONNECT_OSS_CAPA &&
- S_ISREG(lu_object_attr(&mo->mot_obj.mo_lu)) &&
+ S_ISREG(lu_object_attr(&mo->mot_obj)) &&
(ma->ma_attr.la_valid & LA_SIZE) && !som_au) {
struct lustre_capa *capa;
if (info->mti_dlm_req)
ldlm_request_cancel(mdt_info_req(info), info->mti_dlm_req, 0);
- LASSERT(info->mti_rr.rr_namelen > 0);
- switch (info->mti_attr.ma_attr.la_mode & S_IFMT) {
+ if (!lu_name_is_valid(&info->mti_rr.rr_name))
+ RETURN(-EPROTO);
+
+ switch (info->mti_attr.ma_attr.la_mode & S_IFMT) {
case S_IFDIR:
mdt_counter_incr(req, LPROC_MDT_MKDIR);
break;
struct mdt_object *mc;
struct mdt_lock_handle *parent_lh;
struct mdt_lock_handle *child_lh;
- struct lu_name *lname;
int rc;
int no_name = 0;
ENTRY;
- DEBUG_REQ(D_INODE, req, "unlink "DFID"/%s", PFID(rr->rr_fid1),
- rr->rr_name);
+ DEBUG_REQ(D_INODE, req, "unlink "DFID"/"DNAME"", PFID(rr->rr_fid1),
+ PNAME(&rr->rr_name));
if (info->mti_dlm_req)
ldlm_request_cancel(req, info->mti_dlm_req, 0);
}
parent_lh = &info->mti_lh[MDT_LH_PARENT];
- lname = mdt_name(info->mti_env, (char *)rr->rr_name, rr->rr_namelen);
+
if (mdt_object_remote(mp)) {
mdt_lock_reg_init(parent_lh, LCK_EX);
rc = mdt_remote_object_lock(info, mp, &parent_lh->mlh_rreg_lh,
GOTO(put_parent, rc);
} else {
- mdt_lock_pdo_init(parent_lh, LCK_PW, rr->rr_name,
- rr->rr_namelen);
+ mdt_lock_pdo_init(parent_lh, LCK_PW, &rr->rr_name);
rc = mdt_object_lock(info, mp, parent_lh, MDS_INODELOCK_UPDATE,
MDT_LOCAL_LOCK);
if (rc)
/* step 2: find & lock the child */
/* lookup child object along with version checking */
fid_zero(child_fid);
- rc = mdt_lookup_version_check(info, mp, lname, child_fid, 1);
+ rc = mdt_lookup_version_check(info, mp, &rr->rr_name, child_fid, 1);
if (rc != 0) {
/* Name might not be able to find during resend of
* remote unlink, considering following case.
struct mdt_body *repbody;
if (!fid_is_zero(rr->rr_fid2)) {
- CDEBUG(D_INFO, "%s: name %s can not find "DFID"\n",
+ CDEBUG(D_INFO, "%s: name "DNAME" cannot find "DFID"\n",
mdt_obd_name(info->mti_mdt),
- (char *)rr->rr_name, PFID(mdt_object_fid(mc)));
+ PNAME(&rr->rr_name), PFID(mdt_object_fid(mc)));
GOTO(put_child, rc = -ENOENT);
}
- CDEBUG(D_INFO, "%s: name %s: "DFID" is another MDT\n",
+ CDEBUG(D_INFO, "%s: name "DNAME": "DFID" is on another MDT\n",
mdt_obd_name(info->mti_mdt),
- (char *)rr->rr_name, PFID(mdt_object_fid(mc)));
+ PNAME(&rr->rr_name), PFID(mdt_object_fid(mc)));
if (!mdt_is_dne_client(req->rq_export))
/* Return -EIO for old client */
ma->ma_valid = 0;
mdt_set_capainfo(info, 1, child_fid, BYPASS_CAPA);
rc = mdo_unlink(info->mti_env, mdt_object_child(mp),
- NULL, lname, ma, no_name);
+ NULL, &rr->rr_name, ma, no_name);
GOTO(put_child, rc);
}
/* Revoke the LOOKUP lock of the remote object granted by
GOTO(unlock_child, rc = -EREMOTE);
} else if (info->mti_spec.sp_rm_entry) {
rc = -EPERM;
- CDEBUG(D_INFO, "%s: no rm_entry on local dir '%s': rc = %d\n",
- mdt_obd_name(info->mti_mdt), (char *)rr->rr_name, rc);
+ CDEBUG(D_INFO, "%s: no rm_entry on local dir '"DNAME"': "
+ "rc = %d\n",
+ mdt_obd_name(info->mti_mdt), PNAME(&rr->rr_name), rc);
GOTO(put_child, rc);
}
- rc = mdt_object_lock(info, mc, child_lh, MDS_INODELOCK_FULL,
- MDT_CROSS_LOCK);
- if (rc != 0) {
+ /* We used to acquire MDS_INODELOCK_FULL here but we can't do
+ * this now because a running HSM restore on the child (unlink
+ * victim) will hold the layout lock. See LU-4002. */
+ rc = mdt_object_lock(info, mc, child_lh,
+ MDS_INODELOCK_LOOKUP | MDS_INODELOCK_UPDATE,
+ MDT_CROSS_LOCK);
+ if (rc != 0)
GOTO(put_child, rc);
- }
mdt_fail_write(info->mti_env, info->mti_mdt->mdt_bottom,
OBD_FAIL_MDS_REINT_UNLINK_WRITE);
/* save version when object is locked */
mdt_version_get_save(info, mc, 1);
- /*
- * Now we can only make sure we need MA_INODE, in mdd layer, will check
- * whether need MA_LOV and MA_COOKIE.
- */
- ma->ma_need = MA_INODE;
- ma->ma_valid = 0;
- mdt_set_capainfo(info, 1, child_fid, BYPASS_CAPA);
+ /*
+ * Now we can only make sure we need MA_INODE, in mdd layer, will check
+ * whether need MA_LOV and MA_COOKIE.
+ */
+ ma->ma_need = MA_INODE;
+ ma->ma_valid = 0;
+ mdt_set_capainfo(info, 1, child_fid, BYPASS_CAPA);
+
+ mutex_lock(&mc->mot_lov_mutex);
rc = mdo_unlink(info->mti_env, mdt_object_child(mp),
- mdt_object_child(mc), lname, ma, no_name);
+ mdt_object_child(mc), &rr->rr_name, ma, no_name);
+
+ mutex_unlock(&mc->mot_lov_mutex);
+
if (rc == 0 && !lu_object_is_dying(&mc->mot_header))
rc = mdt_attr_get_complex(info, mc, ma);
if (rc == 0)
struct mdt_object *mp;
struct mdt_lock_handle *lhs;
struct mdt_lock_handle *lhp;
- struct lu_name *lname;
int rc;
ENTRY;
- DEBUG_REQ(D_INODE, req, "link "DFID" to "DFID"/%s",
- PFID(rr->rr_fid1), PFID(rr->rr_fid2), rr->rr_name);
+ DEBUG_REQ(D_INODE, req, "link "DFID" to "DFID"/"DNAME,
+ PFID(rr->rr_fid1), PFID(rr->rr_fid2), PNAME(&rr->rr_name));
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_LINK))
RETURN(err_serious(-ENOENT));
/* step 1: find & lock the target parent dir */
lhp = &info->mti_lh[MDT_LH_PARENT];
- mdt_lock_pdo_init(lhp, LCK_PW, rr->rr_name,
- rr->rr_namelen);
+ mdt_lock_pdo_init(lhp, LCK_PW, &rr->rr_name);
mp = mdt_object_find_lock(info, rr->rr_fid2, lhp,
MDS_INODELOCK_UPDATE);
if (IS_ERR(mp))
if (IS_ERR(ms))
GOTO(out_unlock_parent, rc = PTR_ERR(ms));
+ if (!mdt_object_exists(ms)) {
+ mdt_object_put(info->mti_env, ms);
+ CDEBUG(D_INFO, "%s: "DFID" does not exist.\n",
+ mdt_obd_name(info->mti_mdt), PFID(rr->rr_fid1));
+ GOTO(out_unlock_parent, rc = -ENOENT);
+ }
+
if (mdt_object_remote(ms)) {
mdt_object_put(info->mti_env, ms);
CERROR("%s: source inode "DFID" on remote MDT from "DFID"\n",
GOTO(out_unlock_parent, rc = -EXDEV);
}
- rc = mdt_object_lock(info, ms, lhs, MDS_INODELOCK_UPDATE,
- MDT_CROSS_LOCK);
+ rc = mdt_object_lock(info, ms, lhs, MDS_INODELOCK_UPDATE |
+ MDS_INODELOCK_XATTR, MDT_CROSS_LOCK);
if (rc != 0) {
mdt_object_put(info->mti_env, ms);
GOTO(out_unlock_parent, rc);
mdt_fail_write(info->mti_env, info->mti_mdt->mdt_bottom,
OBD_FAIL_MDS_REINT_LINK_WRITE);
- info->mti_mos = ms;
+ tgt_vbr_obj_set(info->mti_env, mdt_obj2dt(ms));
rc = mdt_version_get_check_save(info, ms, 1);
if (rc)
GOTO(out_unlock_child, rc);
- lname = mdt_name(info->mti_env, (char *)rr->rr_name, rr->rr_namelen);
/** check target version by name during replay */
- rc = mdt_lookup_version_check(info, mp, lname, &info->mti_tmp_fid1, 2);
+ rc = mdt_lookup_version_check(info, mp, &rr->rr_name,
+ &info->mti_tmp_fid1, 2);
if (rc != 0 && rc != -ENOENT)
GOTO(out_unlock_child, rc);
/* save version of file name for replay, it must be ENOENT here */
if (!req_is_replay(mdt_info_req(info))) {
if (rc != -ENOENT) {
- CDEBUG(D_INFO, "link target %.*s existed!\n",
- rr->rr_namelen, (char *)rr->rr_name);
+ CDEBUG(D_INFO, "link target "DNAME" existed!\n",
+ PNAME(&rr->rr_name));
GOTO(out_unlock_child, rc = -EEXIST);
}
info->mti_ver[2] = ENOENT_VERSION;
mdt_version_save(mdt_info_req(info), info->mti_ver[2], 2);
}
- rc = mdo_link(info->mti_env, mdt_object_child(mp),
- mdt_object_child(ms), lname, ma);
+ rc = mdo_link(info->mti_env, mdt_object_child(mp),
+ mdt_object_child(ms), &rr->rr_name, ma);
if (rc == 0)
mdt_counter_incr(req, LPROC_MDT_LINK);
memset(policy, 0, sizeof *policy);
policy->l_inodebits.bits = MDS_INODELOCK_UPDATE;
-#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 4, 53, 0)
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 5, 53, 0)
/* In phase I, we will not do cross-rename, so local BFL lock would
* be enough
*/
struct lu_fid *old_fid = &info->mti_tmp_fid1;
struct lu_fid *new_fid = &info->mti_tmp_fid2;
struct lustre_handle rename_lh = { 0 };
- struct lu_name slname = { 0 };
- struct lu_name *lname;
int rc;
ENTRY;
if (info->mti_dlm_req)
ldlm_request_cancel(req, info->mti_dlm_req, 0);
- DEBUG_REQ(D_INODE, req, "rename "DFID"/%s to "DFID"/%s",
- PFID(rr->rr_fid1), rr->rr_name,
- PFID(rr->rr_fid2), rr->rr_tgt);
+ DEBUG_REQ(D_INODE, req, "rename "DFID"/"DNAME" to "DFID"/"DNAME,
+ PFID(rr->rr_fid1), PNAME(&rr->rr_name),
+ PFID(rr->rr_fid2), PNAME(&rr->rr_tgt_name));
if (fid_is_obf(rr->rr_fid1) || fid_is_dot_lustre(rr->rr_fid1) ||
fid_is_obf(rr->rr_fid2) || fid_is_dot_lustre(rr->rr_fid2))
/* step 1: lock the source dir. */
lh_srcdirp = &info->mti_lh[MDT_LH_PARENT];
- mdt_lock_pdo_init(lh_srcdirp, LCK_PW, rr->rr_name,
- rr->rr_namelen);
+ mdt_lock_pdo_init(lh_srcdirp, LCK_PW, &rr->rr_name);
msrcdir = mdt_object_find_lock(info, rr->rr_fid1, lh_srcdirp,
MDS_INODELOCK_UPDATE);
if (IS_ERR(msrcdir))
/* step 2: find & lock the target dir. */
lh_tgtdirp = &info->mti_lh[MDT_LH_CHILD];
- mdt_lock_pdo_init(lh_tgtdirp, LCK_PW, rr->rr_tgt,
- rr->rr_tgtlen);
+ mdt_lock_pdo_init(lh_tgtdirp, LCK_PW, &rr->rr_tgt_name);
if (lu_fid_eq(rr->rr_fid1, rr->rr_fid2)) {
mdt_object_get(info->mti_env, msrcdir);
mtgtdir = msrcdir;
}
}
- /* step 3: find & lock the old object. */
- lname = mdt_name(info->mti_env, (char *)rr->rr_name, rr->rr_namelen);
- mdt_name_copy(&slname, lname);
- fid_zero(old_fid);
- rc = mdt_lookup_version_check(info, msrcdir, &slname, old_fid, 2);
- if (rc != 0)
- GOTO(out_unlock_target, rc);
+ /* step 3: find & lock the old object. */
+ fid_zero(old_fid);
+ rc = mdt_lookup_version_check(info, msrcdir, &rr->rr_name, old_fid, 2);
+ if (rc != 0)
+ GOTO(out_unlock_target, rc);
- if (lu_fid_eq(old_fid, rr->rr_fid1) || lu_fid_eq(old_fid, rr->rr_fid2))
- GOTO(out_unlock_target, rc = -EINVAL);
+ if (lu_fid_eq(old_fid, rr->rr_fid1) || lu_fid_eq(old_fid, rr->rr_fid2))
+ GOTO(out_unlock_target, rc = -EINVAL);
if (fid_is_obf(old_fid) || fid_is_dot_lustre(old_fid))
GOTO(out_unlock_target, rc = -EPERM);
lh_oldp = &info->mti_lh[MDT_LH_OLD];
mdt_lock_reg_init(lh_oldp, LCK_EX);
- rc = mdt_object_lock(info, mold, lh_oldp, MDS_INODELOCK_LOOKUP,
- MDT_CROSS_LOCK);
+ rc = mdt_object_lock(info, mold, lh_oldp, MDS_INODELOCK_LOOKUP |
+ MDS_INODELOCK_XATTR, MDT_CROSS_LOCK);
if (rc != 0) {
mdt_object_put(info->mti_env, mold);
GOTO(out_unlock_target, rc);
}
- info->mti_mos = mold;
+ tgt_vbr_obj_set(info->mti_env, mdt_obj2dt(mold));
/* save version after locking */
mdt_version_get_save(info, mold, 2);
mdt_set_capainfo(info, 2, old_fid, BYPASS_CAPA);
/* step 4: find & lock the new object. */
/* new target object may not exist now */
- lname = mdt_name(info->mti_env, (char *)rr->rr_tgt, rr->rr_tgtlen);
/* lookup with version checking */
fid_zero(new_fid);
- rc = mdt_lookup_version_check(info, mtgtdir, lname, new_fid, 3);
+ rc = mdt_lookup_version_check(info, mtgtdir, &rr->rr_tgt_name, new_fid,
+ 3);
if (rc == 0) {
/* the new_fid should have been filled at this moment */
if (lu_fid_eq(old_fid, new_fid))
GOTO(out_unlock_old, rc = -EXDEV);
}
- rc = mdt_object_lock(info, mnew, lh_newp,
- MDS_INODELOCK_FULL, MDT_CROSS_LOCK);
+ /* We used to acquire MDS_INODELOCK_FULL here but we
+ * can't do this now because a running HSM restore on
+ * the rename onto victim will hold the layout
+ * lock. See LU-4002. */
+ rc = mdt_object_lock(info, mnew, lh_newp,
+ MDS_INODELOCK_LOOKUP |
+ MDS_INODELOCK_UPDATE,
+ MDT_CROSS_LOCK);
if (rc != 0) {
mdt_object_put(info->mti_env, mnew);
GOTO(out_unlock_old, rc);
} else if (rc != -EREMOTE && rc != -ENOENT) {
GOTO(out_unlock_old, rc);
} else {
- mdt_enoent_version_save(info, 3);
+ /* If mnew does not exist and mold are remote directory,
+ * it only allows rename if they are under same directory */
+ if (mtgtdir != msrcdir && mdt_object_remote(mold)) {
+ CDEBUG(D_INFO, "Src child "DFID" is on another MDT\n",
+ PFID(old_fid));
+ GOTO(out_unlock_old, rc = -EXDEV);
+ }
+ mdt_enoent_version_save(info, 3);
}
/* step 5: rename it */
mdt_fail_write(info->mti_env, info->mti_mdt->mdt_bottom,
OBD_FAIL_MDS_REINT_RENAME_WRITE);
+ /* Check if @dst is subdir of @src. */
+ rc = mdt_rename_sanity(info, old_fid);
+ if (rc)
+ GOTO(out_unlock_new, rc);
- /* Check if @dst is subdir of @src. */
- rc = mdt_rename_sanity(info, old_fid);
- if (rc)
- GOTO(out_unlock_new, rc);
+ if (mnew != NULL)
+ mutex_lock(&mnew->mot_lov_mutex);
- rc = mdo_rename(info->mti_env, mdt_object_child(msrcdir),
- mdt_object_child(mtgtdir), old_fid, &slname,
- (mnew ? mdt_object_child(mnew) : NULL),
- lname, ma);
+ rc = mdo_rename(info->mti_env, mdt_object_child(msrcdir),
+ mdt_object_child(mtgtdir), old_fid, &rr->rr_name,
+ mnew != NULL ? mdt_object_child(mnew) : NULL,
+ &rr->rr_tgt_name, ma);
- /* handle last link of tgt object */
- if (rc == 0) {
+ if (mnew != NULL)
+ mutex_unlock(&mnew->mot_lov_mutex);
+
+ /* handle last link of tgt object */
+ if (rc == 0) {
mdt_counter_incr(req, LPROC_MDT_RENAME);
- if (mnew)
- mdt_handle_last_unlink(info, mnew, ma);
+ if (mnew)
+ mdt_handle_last_unlink(info, mnew, ma);
mdt_rename_counter_tally(info, info->mti_mdt, req,
msrcdir, mtgtdir);