Whamcloud - gitweb
LU-1406 ofd: init lu_target in OFD
authorMikhail Pershin <tappro@whamcloud.com>
Wed, 16 May 2012 08:56:41 +0000 (12:56 +0400)
committerOleg Drokin <green@whamcloud.com>
Tue, 29 May 2012 16:40:19 +0000 (12:40 -0400)
initialize LUT infrastructure, redo lut_init() to use
dt_find_or_create() instead of dt_store_open, add object methods

Signed-off-by: Mikhail Pershin <tappro@whamcloud.com>
Change-Id: I22602aeed7b2efd1b240f912b7a9fd34ba38dcc8
Reviewed-on: http://review.whamcloud.com/2804
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/ofd/ofd_dev.c
lustre/ofd/ofd_internal.h

index a1bc262..5857d67 100644 (file)
@@ -204,7 +204,56 @@ static int ofd_process_config(const struct lu_env *env, struct lu_device *d,
        RETURN(rc);
 }
 
+static int ofd_object_init(const struct lu_env *env, struct lu_object *o,
+                          const struct lu_object_conf *conf)
+{
+       struct ofd_device       *d = ofd_dev(o->lo_dev);
+       struct lu_device        *under;
+       struct lu_object        *below;
+       int                      rc = 0;
+
+       ENTRY;
+
+       CDEBUG(D_INFO, "object init, fid = "DFID"\n",
+              PFID(lu_object_fid(o)));
+
+       under = &d->ofd_osd->dd_lu_dev;
+       below = under->ld_ops->ldo_object_alloc(env, o->lo_header, under);
+       if (below != NULL)
+               lu_object_add(o, below);
+       else
+               rc = -ENOMEM;
+
+       RETURN(rc);
+}
+
+static void ofd_object_free(const struct lu_env *env, struct lu_object *o)
+{
+       struct ofd_object       *of = ofd_obj(o);
+       struct lu_object_header *h;
+
+       ENTRY;
+
+       h = o->lo_header;
+       CDEBUG(D_INFO, "object free, fid = "DFID"\n",
+              PFID(lu_object_fid(o)));
+
+       lu_object_fini(o);
+       lu_object_header_fini(h);
+       OBD_SLAB_FREE_PTR(of, ofd_object_kmem);
+       EXIT;
+}
+
+static int ofd_object_print(const struct lu_env *env, void *cookie,
+                           lu_printer_t p, const struct lu_object *o)
+{
+       return (*p)(env, cookie, LUSTRE_OST_NAME"-object@%p", o);
+}
+
 struct lu_object_operations ofd_obj_ops = {
+       .loo_object_init        = ofd_object_init,
+       .loo_object_free        = ofd_object_free,
+       .loo_object_print       = ofd_object_print
 };
 
 static struct lu_object *ofd_object_alloc(const struct lu_env *env,
@@ -232,6 +281,8 @@ static struct lu_object *ofd_object_alloc(const struct lu_env *env,
        }
 }
 
+extern int ost_handle(struct ptlrpc_request *req);
+
 static int ofd_start(const struct lu_env *env, struct lu_device *dev)
 {
        struct ofd_device       *ofd = ofd_dev(dev);
@@ -327,12 +378,19 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m,
        if (rc)
                GOTO(err_fini_stack, rc);
 
-       rc = lu_site_init_finish(&m->ofd_site);
+       rc = lut_init(env, &m->ofd_lut, obd, m->ofd_osd);
        if (rc)
                GOTO(err_fini_stack, rc);
 
-       RETURN(0);
+       target_recovery_init(&m->ofd_lut, ost_handle);
+
+       rc = lu_site_init_finish(&m->ofd_site);
+       if (rc)
+               GOTO(err_fini_lut, rc);
 
+       RETURN(0);
+err_fini_lut:
+       lut_fini(env, &m->ofd_lut);
 err_fini_stack:
        ofd_stack_fini(env, m, &m->ofd_osd->dd_lu_dev);
 err_lu_site:
@@ -343,8 +401,15 @@ err_out:
 
 static void ofd_fini(const struct lu_env *env, struct ofd_device *m)
 {
+       struct obd_device *obd = ofd_obd(m);
        struct lu_device  *d = &m->ofd_dt_dev.dd_lu_dev;
 
+       target_recovery_fini(obd);
+       obd_exports_barrier(obd);
+       obd_zombie_barrier();
+
+       lut_fini(env, &m->ofd_lut);
+
        ofd_stack_fini(env, m, m->ofd_site.ls_top_dev);
        lu_site_fini(&m->ofd_site);
        LASSERT(cfs_atomic_read(&d->ld_ref) == 0);
index 3e021cd..72f9795 100644 (file)
@@ -45,6 +45,9 @@ struct ofd_device {
        struct dt_device        *ofd_osd;
        struct dt_device_param   ofd_dt_conf;
 
+       /* last_rcvd file */
+       struct lu_target         ofd_lut;
+
        struct lu_site           ofd_site;
 };
 
@@ -90,6 +93,9 @@ struct ofd_thread_info {
        } fti_u;
 };
 
+extern void target_recovery_fini(struct obd_device *obd);
+extern void target_recovery_init(struct lu_target *lut, svc_handler_t handler);
+
 /* ofd_dev.c */
 extern struct lu_context_key ofd_thread_key;