+ rc = md_rename(tgt->ltd_exp, op_data, name, namelen, NULL, 0, request);
+
+ RETURN(rc);
+}
+
+static int lmv_rename(struct obd_export *exp, struct md_op_data *op_data,
+ const char *old, size_t oldlen,
+ const char *new, size_t newlen,
+ struct ptlrpc_request **request)
+{
+ struct obd_device *obd = exp->exp_obd;
+ struct lmv_obd *lmv = &obd->u.lmv;
+ struct lmv_tgt_desc *sp_tgt;
+ struct lmv_tgt_desc *tp_tgt = NULL;
+ struct lmv_tgt_desc *src_tgt = NULL;
+ struct lmv_tgt_desc *tgt;
+ struct mdt_body *body;
+ int rc;
+
+ 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)