+ OBD_ALLOC_PTR(op_data);
+ if (op_data == NULL)
+ GOTO(out, rc = -ENOMEM);
+
+ op_data->op_fid1 = body->fid1;
+ op_data->op_bias = MDS_CROSS_REF;
+
+ rc = md_intent_lock(tgt_exp, op_data, lmm, lmmsize, it, flags,
+ &req, cb_blocking, extra_lock_flags);
+
+ /*
+ * llite needs LOOKUP lock to track dentry revocation in order to
+ * maintain dcache consistency. Thus drop UPDATE lock here and put
+ * LOOKUP in request.
+ */
+ if (rc == 0) {
+ lmv_drop_intent_lock(it);
+ it->d.lustre.it_lock_handle = plock.cookie;
+ it->d.lustre.it_lock_mode = pmode;
+ }
+
+ OBD_FREE_PTR(op_data);
+ EXIT;
+out:
+ if (rc && pmode)
+ ldlm_lock_decref(&plock, pmode);
+
+ ptlrpc_req_finished(*reqp);
+ *reqp = req;
+ return rc;
+}
+
+int lmv_alloc_slave_fids(struct obd_device *obd, struct lu_fid *pid,
+ struct md_op_data *op, struct lu_fid *fid)
+{
+ struct lmv_obd *lmv = &obd->u.lmv;
+ struct lmv_obj *obj;
+ mdsno_t mds;
+ int mea_idx;
+ int rc;
+ ENTRY;
+
+ obj = lmv_obj_grab(obd, pid);
+ if (!obj) {
+ CERROR("Object "DFID" should be split\n",
+ PFID(pid));
+ RETURN(0);
+ }
+
+ mea_idx = raw_name2idx(obj->lo_hashtype, obj->lo_objcount,
+ (char *)op->op_name, op->op_namelen);
+ mds = obj->lo_inodes[mea_idx].li_mds;
+ lmv_obj_put(obj);
+
+ rc = __lmv_fid_alloc(lmv, fid, mds);
+ if (rc) {
+ CERROR("Can't allocate new fid, rc %d\n",
+ rc);
+ RETURN(rc);