X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosp%2Fosp_dev.c;h=9a66737bc033d838435b22fa0f9863c16df0b315;hp=823af65977bdf118d22a862bea7d9e2eadfab2ad;hb=f4547f0569774eb794fb143362e201f658415f4c;hpb=6c4c51e3079e6c257fbf86536e4739110c166e3b diff --git a/lustre/osp/osp_dev.c b/lustre/osp/osp_dev.c index 823af65..9a66737 100644 --- a/lustre/osp/osp_dev.c +++ b/lustre/osp/osp_dev.c @@ -72,20 +72,28 @@ struct lu_object *osp_object_alloc(const struct lu_env *env, const struct lu_object_header *hdr, struct lu_device *d) { - struct lu_object_header *h; + struct lu_object_header *h = NULL; struct osp_object *o; struct lu_object *l; - LASSERT(hdr == NULL); - OBD_SLAB_ALLOC_PTR_GFP(o, osp_object_kmem, CFS_ALLOC_IO); if (o != NULL) { l = &o->opo_obj.do_lu; - h = &o->opo_header; - lu_object_header_init(h); - dt_object_init(&o->opo_obj, h, d); - lu_object_add_top(h, l); + /* For data object, OSP obj would always be the top + * object, i.e. hdr is always NULL, see lu_object_alloc. + * But for metadata object, we always build the object + * stack from MDT. i.e. mdt_object will be the top object + * i.e. hdr != NULL */ + if (hdr == NULL) { + /* object for OST */ + h = &o->opo_header; + lu_object_header_init(h); + dt_object_init(&o->opo_obj, h, d); + lu_object_add_top(h, l); + } else { + dt_object_init(&o->opo_obj, h, d); + } l->lo_ops = &osp_lu_obj_ops; @@ -303,7 +311,7 @@ static void osp_last_used_fini(const struct lu_env *env, struct osp_device *d) } } -int osp_disconnect(struct osp_device *d) +static int osp_disconnect(struct osp_device *d) { struct obd_import *imp; int rc = 0; @@ -342,11 +350,6 @@ static int osp_shutdown(const struct lu_env *env, struct osp_device *d) int rc = 0; ENTRY; - if (is_osp_for_connection(d->opd_obd->obd_name)) { - rc = osp_disconnect(d); - RETURN(rc); - } - LASSERT(env); /* release last_used file */ if (!d->opd_connect_mdt) @@ -377,9 +380,11 @@ static int osp_process_config(const struct lu_env *env, ENTRY; switch (lcfg->lcfg_command) { + case LCFG_PRE_CLEANUP: + rc = osp_disconnect(d); + break; case LCFG_CLEANUP: - if (!is_osp_for_connection(d->opd_obd->obd_name)) - lu_dev_del_linkage(dev->ld_site, dev); + lu_dev_del_linkage(dev->ld_site, dev); rc = osp_shutdown(env, d); break; case LCFG_PARAM: @@ -486,6 +491,8 @@ static int osp_sync(const struct lu_env *env, struct dt_device *dev) const struct dt_device_operations osp_dt_ops = { .dt_statfs = osp_statfs, .dt_sync = osp_sync, + .dt_trans_start = osp_trans_start, + .dt_trans_stop = osp_trans_stop, }; static int osp_connect_to_osd(const struct lu_env *env, struct osp_device *m, @@ -726,7 +733,7 @@ out_last_used: out_proc: ptlrpc_lprocfs_unregister_obd(obd); lprocfs_obd_cleanup(obd); - class_destroy_import(obd->u.cli.cl_import); + obd_cleanup_client_import(obd); client_obd_cleanup(obd); out_ref: ptlrpcd_decref(); @@ -776,10 +783,7 @@ static struct lu_device *osp_device_alloc(const struct lu_env *env, l = osp2lu_dev(m); dt_device_init(&m->opd_dt_dev, t); - if (is_osp_for_connection(lustre_cfg_string(lcfg, 0))) - rc = osp_init_for_ost(env, m, t, lcfg); - else - rc = osp_init0(env, m, t, lcfg); + rc = osp_init0(env, m, t, lcfg); if (rc != 0) { osp_device_free(env, l); l = ERR_PTR(rc); @@ -800,9 +804,6 @@ static struct lu_device *osp_device_fini(const struct lu_env *env, if (m->opd_storage_exp) obd_disconnect(m->opd_storage_exp); - if (is_osp_for_connection(m->opd_obd->obd_name)) - osp_fini_for_ost(m); - imp = m->opd_obd->u.cli.cl_import; if (imp->imp_rq_pool) { @@ -866,8 +867,6 @@ static int osp_obd_connect(const struct lu_env *env, struct obd_export **exp, RETURN(rc); *exp = class_conn2export(&conn); - osp->opd_exp = *exp; - /* Why should there ever be more than 1 connect? */ osp->opd_connects++; LASSERT(osp->opd_connects == 1); @@ -881,8 +880,6 @@ static int osp_obd_connect(const struct lu_env *env, struct obd_export **exp, LASSERT(data->ocd_connect_flags & OBD_CONNECT_INDEX); ocd = &imp->imp_connect_data; *ocd = *data; - if (is_osp_for_connection(osp->opd_obd->obd_name)) - ocd->ocd_connect_flags |= OBD_CONNECT_LIGHTWEIGHT; imp->imp_connect_flags_orig = ocd->ocd_connect_flags; @@ -898,15 +895,14 @@ static int osp_obd_connect(const struct lu_env *env, struct obd_export **exp, ptlrpc_pinger_add_import(imp); - if (osp->opd_connect_mdt && data->ocd_index == 0 && - !is_osp_for_connection(obd->obd_name)) { + if (osp->opd_connect_mdt && data->ocd_index == 0) { + /* set seq controller export for MDC0 if exists */ struct seq_server_site *ss; ss = lu_site2seq(osp2lu_dev(osp)->ld_site); ss->ss_control_exp = class_export_get(*exp); ss->ss_server_fld->lsf_control_exp = *exp; } - out: RETURN(rc); } @@ -934,8 +930,7 @@ static int osp_obd_disconnect(struct obd_export *exp) } /* destroy the device */ - if (!is_osp_for_connection(obd->obd_name)) - class_manual_cleanup(obd); + class_manual_cleanup(obd); RETURN(rc); } @@ -1200,6 +1195,16 @@ static int __init osp_mod_init(void) return rc; } + lprocfs_lwp_init_vars(&lvars); + + rc = class_register_type(&lwp_obd_device_ops, NULL, lvars.module_vars, + LUSTRE_LWP_NAME, &lwp_device_type); + if (rc != 0) { + class_unregister_type(LUSTRE_OSP_NAME); + lu_kmem_fini(osp_caches); + return rc; + } + /* Note: add_rec/delcare_add_rec will be only used by catalogs */ osp_mds_ost_orig_logops = llog_osd_ops; osp_mds_ost_orig_logops.lop_add = llog_cat_add_rec; @@ -1220,6 +1225,7 @@ static void __exit osp_mod_exit(void) { lprocfs_try_remove_proc_entry("osc", proc_lustre_root); + class_unregister_type(LUSTRE_LWP_NAME); class_unregister_type(LUSTRE_OSP_NAME); lu_kmem_fini(osp_caches); }