+ ENTRY;
+
+ LASSERT(oldlen != 0);
+
+ if (op_data->op_cli_flags & CLI_MIGRATE) {
+ rc = lmv_migrate(exp, op_data, old, oldlen, request);
+ RETURN(rc);
+ }
+
+ op_data->op_fsuid = from_kuid(&init_user_ns, current_fsuid());
+ op_data->op_fsgid = from_kgid(&init_user_ns, current_fsgid());
+ op_data->op_cap = cfs_curproc_cap_pack();
+
+ if (lmv_is_dir_migrating(op_data->op_mea2)) {
+ struct lu_fid fid1 = op_data->op_fid1;
+ struct lmv_stripe_md *lsm1 = op_data->op_mea1;
+
+ /*
+ * we avoid creating new file under old layout of migrating
+ * directory, if there is an existing file with new name under
+ * old layout, we can't unlink file in old layout and rename to
+ * new layout in one transaction, so return -EBUSY here.`
+ */
+ tgt = __lmv_locate_tgt(lmv, op_data->op_mea2, new, newlen,
+ &op_data->op_fid2, &op_data->op_mds,
+ false);
+ if (IS_ERR(tgt))
+ RETURN(PTR_ERR(tgt));
+
+ op_data->op_fid1 = op_data->op_fid2;
+ op_data->op_mea1 = op_data->op_mea2;
+ op_data->op_name = new;
+ op_data->op_namelen = newlen;
+ rc = md_getattr_name(tgt->ltd_exp, op_data, request);
+ op_data->op_fid1 = fid1;
+ op_data->op_mea1 = lsm1;
+ op_data->op_name = NULL;
+ op_data->op_namelen = 0;
+ if (!rc) {
+ ptlrpc_req_finished(*request);
+ *request = NULL;
+ RETURN(-EBUSY);
+ }
+
+ if (rc != -ENOENT)
+ RETURN(rc);
+ }
+
+ /* rename to new layout for migrating directory */
+ tp_tgt = __lmv_locate_tgt(lmv, op_data->op_mea2, new, newlen,
+ &op_data->op_fid2, &op_data->op_mds, true);
+ if (IS_ERR(tp_tgt))
+ RETURN(PTR_ERR(tp_tgt));
+
+ /* Since the target child might be destroyed, and it might become
+ * orphan, and we can only check orphan on the local MDT right now, so
+ * we send rename request to the MDT where target child is located. If
+ * target child does not exist, then it will send the request to the
+ * target parent */
+ if (fid_is_sane(&op_data->op_fid4)) {
+ tgt = lmv_find_target(lmv, &op_data->op_fid4);
+ if (IS_ERR(tgt))
+ RETURN(PTR_ERR(tgt));
+ } else {
+ tgt = tp_tgt;
+ }
+
+ op_data->op_flags |= MF_MDC_CANCEL_FID4;
+
+ /* cancel UPDATE locks of target parent */
+ rc = lmv_early_cancel(exp, tp_tgt, op_data, tgt->ltd_idx, LCK_EX,
+ MDS_INODELOCK_UPDATE, MF_MDC_CANCEL_FID2);
+ if (rc != 0)
+ RETURN(rc);
+
+ if (fid_is_sane(&op_data->op_fid4)) {
+ /* cancel LOOKUP lock of target on target parent */
+ if (tgt != tp_tgt) {
+ rc = lmv_early_cancel(exp, tp_tgt, op_data,
+ tgt->ltd_idx, LCK_EX,
+ MDS_INODELOCK_LOOKUP,
+ MF_MDC_CANCEL_FID4);
+ if (rc != 0)
+ RETURN(rc);
+ }
+ }
+
+ if (fid_is_sane(&op_data->op_fid3)) {
+ src_tgt = lmv_find_target(lmv, &op_data->op_fid3);
+ if (IS_ERR(src_tgt))
+ RETURN(PTR_ERR(src_tgt));
+
+ /* cancel ELC locks of source */
+ rc = lmv_early_cancel(exp, src_tgt, op_data, tgt->ltd_idx,
+ LCK_EX, MDS_INODELOCK_ELC,