Whamcloud - gitweb
LU-1303 lod: object methods
[fs/lustre-release.git] / lustre / lod / lod_dev.c
index 8411ed9..e0bf92b 100644 (file)
@@ -48,6 +48,9 @@
 
 #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;
 
@@ -65,6 +68,25 @@ static struct lu_kmem_descr lod_caches[] = {
 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)
@@ -90,7 +112,13 @@ static int lod_process_config(const struct lu_env *env,
                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;
        }
 
@@ -191,6 +219,7 @@ static int lod_prepare(const struct lu_env *env, struct lu_device *pdev,
 }
 
 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,
@@ -401,6 +430,11 @@ static int lod_init0(const struct lu_env *env, struct lod_device *lod,
        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) {
@@ -425,6 +459,7 @@ static int lod_init0(const struct lu_env *env, struct lod_device *lod,
 
        RETURN(0);
 
+out_disconnect:
        obd_disconnect(lod->lod_child_exp);
        RETURN(rc);
 }
@@ -476,6 +511,8 @@ static struct lu_device *lod_device_fini(const struct lu_env *env,
        if (lod->lod_symlink)
                lprocfs_remove(&lod->lod_symlink);
 
+       lod_pools_fini(lod);
+
        RETURN(NULL);
 }
 
@@ -612,6 +649,10 @@ static struct obd_ops lod_obd_device_ops = {
        .o_connect      = lod_obd_connect,
        .o_disconnect   = lod_obd_disconnect,
        .o_health_check = lod_obd_health_check,
+       .o_pool_new     = lod_pool_new,
+       .o_pool_rem     = lod_pool_remove,
+       .o_pool_add     = lod_pool_add,
+       .o_pool_del     = lod_pool_del,
 };
 
 static int __init lod_mod_init(void)