enum obd_cleanup_stage cleanup_stage)
{
int rc;
+ DECLARE_LU_VARS(ldt, d);
ENTRY;
- OBD_CHECK_DT_OP(obd, precleanup, 0);
- OBD_COUNTER_INCREMENT(obd, precleanup);
+ OBD_CHECK_DEV(obd);
+#ifdef __KERNEL__
+ ldt = obd->obd_type->typ_lu;
+ d = obd->obd_lu_dev;
+ if (ldt != NULL && d != NULL) {
+ struct lu_context ctx;
- rc = OBP(obd, precleanup)(obd, cleanup_stage);
+ rc = lu_context_init(&ctx, ldt->ldt_ctx_tags);
+ if (rc == 0) {
+ lu_context_enter(&ctx);
+ ldt->ldt_ops->ldto_device_fini(&ctx, d);
+ lu_context_exit(&ctx);
+ lu_context_fini(&ctx);
+ obd->obd_lu_dev = NULL;
+ rc = 0;
+ }
+ } else
+#endif
+ {
+ OBD_CHECK_DT_OP(obd, precleanup, 0);
+ rc = OBP(obd, precleanup)(obd, cleanup_stage);
+ }
+
+ OBD_COUNTER_INCREMENT(obd, precleanup);
RETURN(rc);
}
ping_evictor_stop();
mdt_stop_ptlrpc_service(m);
- mdt_fld_fini(ctx, m);
mdt_seq_fini(ctx, m);
mdt_seq_fini_cli(m);
+
+ mdt_fld_fini(ctx, m);
+
/* finish the stack */
mdt_stack_fini(ctx, m, md2lu_dev(m->mdt_child));
- LASSERT(atomic_read(&d->ld_ref) == 0);
- md_device_fini(&m->mdt_md_dev);
-
if (m->mdt_namespace != NULL) {
ldlm_namespace_free(m->mdt_namespace, 0);
m->mdt_namespace = NULL;
lu_site_fini(ls);
OBD_FREE_PTR(ls);
}
+ LASSERT(atomic_read(&d->ld_ref) == 0);
+ md_device_fini(&m->mdt_md_dev);
EXIT;
}
lu_site_fini(s);
err_free_site:
OBD_FREE_PTR(s);
+
md_device_fini(&m->mdt_md_dev);
return (rc);
}
.o_init_export = mdt_init_export, /* By Huang Hua*/
.o_destroy_export = mdt_destroy_export, /* By Huang Hua*/
};
+
+static void mdt_device_fini(const struct lu_context *ctx, struct lu_device *d)
+{
+ struct mdt_device *m = mdt_dev(d);
+
+ mdt_fini(ctx, m);
+}
static void mdt_device_free(const struct lu_context *ctx, struct lu_device *d)
{
struct mdt_device *m = mdt_dev(d);
- mdt_fini(ctx, m);
OBD_FREE_PTR(m);
}
.ldto_fini = mdt_type_fini,
.ldto_device_alloc = mdt_device_alloc,
- .ldto_device_free = mdt_device_free
+ .ldto_device_free = mdt_device_free,
+ .ldto_device_fini = mdt_device_fini
};
static struct lu_device_type mdt_device_type = {