#include "lod_internal.h"
+extern struct lu_object_operations lod_lu_obj_ops;
+extern struct dt_object_operations lod_obj_ops;
+
/* Slab for OSD object allocation */
cfs_mem_cache_t *lod_object_kmem;
static struct lu_device *lod_device_fini(const struct lu_env *env,
struct lu_device *d);
+struct lu_object *lod_object_alloc(const struct lu_env *env,
+ const struct lu_object_header *hdr,
+ struct lu_device *dev)
+{
+ struct lu_object *lu_obj;
+ struct lod_object *lo;
+
+ OBD_SLAB_ALLOC_PTR_GFP(lo, lod_object_kmem, CFS_ALLOC_IO);
+ if (lo == NULL)
+ return NULL;
+
+ lu_obj = lod2lu_obj(lo);
+ dt_object_init(&lo->ldo_obj, NULL, dev);
+ lo->ldo_obj.do_ops = &lod_obj_ops;
+ lu_obj->lo_ops = &lod_lu_obj_ops;
+
+ return lu_obj;
+}
+
static int lod_process_config(const struct lu_env *env,
struct lu_device *dev,
struct lustre_cfg *lcfg)
if (sscanf(lustre_cfg_buf(lcfg, 3), "%d", &gen) != 1)
GOTO(out, rc = -EINVAL);
- rc = -EINVAL;
+ if (lcfg->lcfg_command == LCFG_LOV_ADD_OBD)
+ rc = lod_add_device(env, lod, arg1, index, gen, 1);
+ else if (lcfg->lcfg_command == LCFG_LOV_ADD_INA)
+ rc = lod_add_device(env, lod, arg1, index, gen, 0);
+ else
+ rc = lod_del_device(env, lod, arg1, index, gen);
+
break;
}
}
const struct lu_device_operations lod_lu_ops = {
+ .ldo_object_alloc = lod_object_alloc,
.ldo_process_config = lod_process_config,
.ldo_recovery_complete = lod_recovery_complete,
.ldo_prepare = lod_prepare,
dt_conf_get(env, &lod->lod_dt_dev, &ddp);
lod->lod_osd_max_easize = ddp.ddp_max_ea_size;
+ /* setup obd to be used with old lov code */
+ rc = lod_pools_init(lod, cfg);
+ if (rc)
+ GOTO(out_disconnect, rc);
+
/* for compatibility we link old procfs's OSC entries to osp ones */
lov_proc_dir = lprocfs_srch(proc_lustre_root, "lov");
if (lov_proc_dir) {
RETURN(0);
+out_disconnect:
obd_disconnect(lod->lod_child_exp);
RETURN(rc);
}
if (lod->lod_symlink)
lprocfs_remove(&lod->lod_symlink);
+ lod_pools_fini(lod);
+
RETURN(NULL);
}