- if (rc)
- RETURN(rc);
-
- if (oldlen == 0) {
- /*
- * MDS with old dir entry is asking another MDS to create name
- * there.
- */
- CDEBUG(D_OTHER,
- "create %*s(%d/%d) in "DFID" pointing "
- "to "DFID"\n", newlen, new, oldlen, newlen,
- PFID(&op_data->op_fid2), PFID(&op_data->op_fid1));
-
- rc = lmv_fld_lookup(lmv, &op_data->op_fid2, &mds1);
- if (rc)
- RETURN(rc);
-
- /*
- * Target directory can be split, sowe should forward request to
- * the right MDS.
- */
- obj = lmv_obj_grab(obd, &op_data->op_fid2);
- if (obj) {
- mea_idx = raw_name2idx(obj->lo_hashtype,
- obj->lo_objcount,
- (char *)new, newlen);
- op_data->op_fid2 = obj->lo_inodes[mea_idx].li_fid;
- CDEBUG(D_OTHER, "Parent obj "DFID"\n",
- PFID(&op_data->op_fid2));
- lmv_obj_put(obj);
- }
- goto request;
- }
-
-repeat:
- ++loop;
- LASSERT(loop <= 2);
- obj = lmv_obj_grab(obd, &op_data->op_fid1);
- if (obj) {
- /*
- * directory is already split, so we have to forward request to
- * the right MDS.
- */
- mea_idx = raw_name2idx(obj->lo_hashtype, obj->lo_objcount,
- (char *)old, oldlen);
- op_data->op_fid1 = obj->lo_inodes[mea_idx].li_fid;
- mds1 = obj->lo_inodes[mea_idx].li_mds;
- CDEBUG(D_OTHER, "Parent obj "DFID"\n", PFID(&op_data->op_fid1));
- lmv_obj_put(obj);
- } else {
- rc = lmv_fld_lookup(lmv, &op_data->op_fid1, &mds1);
- if (rc)
- RETURN(rc);
- }
-
- obj = lmv_obj_grab(obd, &op_data->op_fid2);
- if (obj) {
- /*
- * Directory is already split, so we have to forward request to
- * the right MDS.
- */
- mea_idx = raw_name2idx(obj->lo_hashtype, obj->lo_objcount,
- (char *)new, newlen);
-
- mds2 = obj->lo_inodes[mea_idx].li_mds;
- op_data->op_fid2 = obj->lo_inodes[mea_idx].li_fid;
- CDEBUG(D_OTHER, "Parent obj "DFID"\n", PFID(&op_data->op_fid2));
- lmv_obj_put(obj);
- } else {
- rc = lmv_fld_lookup(lmv, &op_data->op_fid2, &mds2);
- if (rc)
- RETURN(rc);
- }
-
-request:
- op_data->op_fsuid = current->fsuid;
- op_data->op_fsgid = current->fsgid;
- op_data->op_cap = current->cap_effective;
-
- src_exp = lmv_get_export(lmv, mds1);
- tgt_exp = lmv_get_export(lmv, mds2);
- if (oldlen) {
- /* LOOKUP lock on src child (fid3) should also be cancelled for
- * src_exp in mdc_rename. */
- op_data->op_flags |= MF_MDC_CANCEL_FID1 | MF_MDC_CANCEL_FID3;
-
- /* Cancel UPDATE locks on tgt parent (fid2), tgt_exp is its
- * own export. */
- rc = lmv_early_cancel(lmv, src_exp, tgt_exp, op_data, LCK_EX,
- MDS_INODELOCK_UPDATE, MF_MDC_CANCEL_FID2);
-
- /* Cancel LOOKUP locks on tgt child (fid4) for parent tgt_exp.*/
- if (rc == 0)
- rc = lmv_early_cancel(lmv, src_exp, tgt_exp, op_data,
- LCK_EX, MDS_INODELOCK_LOOKUP,
- MF_MDC_CANCEL_FID4);
-
- /* XXX: the case when child is a striped dir is not supported.
- * Only the master stripe has all locks cancelled early. */
- /* Cancel all the locks on tgt child (fid4). */
- if (rc == 0)
- rc = lmv_early_cancel(lmv, src_exp, NULL, op_data,
- LCK_EX, MDS_INODELOCK_FULL,
- MF_MDC_CANCEL_FID4);
- }
-
- if (rc == 0)
- rc = md_rename(src_exp, op_data, old, oldlen,
- new, newlen, request);
- if (rc == -ERESTART) {
- LASSERT(*request != NULL);
- DEBUG_REQ(D_WARNING|D_RPCTRACE, *request,
- "Got -ERESTART during rename!\n");
- ptlrpc_req_finished(*request);
- *request = NULL;