+ struct lod_object *lod_obj;
+ struct lu_object *lu_obj;
+ const struct lu_fid *fid = &hdr->loh_fid;
+ mdsno_t mds;
+ int rc = 0;
+ ENTRY;
+
+ OBD_SLAB_ALLOC_PTR_GFP(lod_obj, lod_object_kmem, __GFP_IO);
+ if (lod_obj == NULL)
+ RETURN(ERR_PTR(-ENOMEM));
+
+ rc = lod_fld_lookup(env, lu2lod_dev(dev), fid, &mds, LU_SEQ_RANGE_MDT);
+ if (rc) {
+ OBD_SLAB_FREE_PTR(lod_obj, lod_object_kmem);
+ RETURN(ERR_PTR(rc));
+ }
+
+ lod_obj->ldo_mds_num = mds;
+ lu_obj = lod2lu_obj(lod_obj);
+ dt_object_init(&lod_obj->ldo_obj, NULL, dev);
+ lod_obj->ldo_obj.do_ops = &lod_obj_ops;
+ if (likely(mds == lu_site2seq(dev->ld_site)->ss_node_id))
+ lu_obj->lo_ops = &lod_lu_obj_ops;
+ else
+ lu_obj->lo_ops = &lod_lu_robj_ops;
+ RETURN(lu_obj);
+}
+
+static int lod_cleanup_desc_tgts(const struct lu_env *env,
+ struct lod_device *lod,
+ struct lod_tgt_descs *ltd,
+ struct lustre_cfg *lcfg)
+{
+ struct lu_device *next;
+ int rc = 0;
+ int i;
+
+ lod_getref(ltd);
+ if (ltd->ltd_tgts_size <= 0) {
+ lod_putref(lod, ltd);
+ return 0;
+ }
+ cfs_foreach_bit(ltd->ltd_tgt_bitmap, i) {
+ struct lod_tgt_desc *tgt;
+ int rc1;
+
+ tgt = LTD_TGT(ltd, i);
+ LASSERT(tgt && tgt->ltd_tgt);
+ next = &tgt->ltd_tgt->dd_lu_dev;
+ rc1 = next->ld_ops->ldo_process_config(env, next, lcfg);
+ if (rc1) {
+ CERROR("%s: error cleaning up LOD index %u: cmd %#x"
+ ": rc = %d\n", lod2obd(lod)->obd_name, i,
+ lcfg->lcfg_command, rc1);
+ rc = rc1;
+ }
+ }
+ lod_putref(lod, ltd);
+ return rc;
+}
+
+static int lodname2mdt_index(char *lodname, long *index)
+{
+ char *ptr, *tmp;