int mds_llog_finish(struct obd_device *obd, int count) { struct llog_ctxt *ctxt; int rc = 0, rc2 = 0; ENTRY; ctxt = llog_get_context(obd, LLOG_MDS_OST_ORIG_CTXT); if (ctxt) rc = llog_cleanup(ctxt); ctxt = llog_get_context(obd, LLOG_SIZE_REPL_CTXT); if (ctxt) rc2 = llog_cleanup(ctxt); if (!rc) rc = rc2; ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT); if (ctxt) rc2 = llog_cleanup(ctxt); if (!rc) rc = rc2; ctxt = llog_get_context(obd, LLOG_CHANGELOG_USER_ORIG_CTXT); if (ctxt) rc2 = llog_cleanup(ctxt); if (!rc) rc = rc2; RETURN(rc); }
static int mds_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage) { struct mds_obd *mds = &obd->u.mds; struct llog_ctxt *ctxt; int rc = 0; ENTRY; switch (stage) { case OBD_CLEANUP_EARLY: break; case OBD_CLEANUP_EXPORTS: mds_lov_early_clean(obd); cfs_down_write(&mds->mds_notify_lock); mds_lov_disconnect(obd); mds_lov_clean(obd); ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); if (ctxt) llog_cleanup(ctxt); ctxt = llog_get_context(obd, LLOG_LOVEA_ORIG_CTXT); if (ctxt) llog_cleanup(ctxt); rc = obd_llog_finish(obd, 0); mds->mds_lov_exp = NULL; cfs_up_write(&mds->mds_notify_lock); break; } RETURN(rc); }
int lov_llog_init(struct obd_device *obd, struct obd_llog_group *olg, struct obd_device *disk_obd, int *index) { struct lov_obd *lov = &obd->u.lov; struct obd_device *child; int i, rc = 0; ENTRY; LASSERT(olg == &obd->obd_olg); rc = llog_setup(NULL, obd, olg, LLOG_MDS_OST_ORIG_CTXT, disk_obd, &lov_mds_ost_orig_logops); if (rc) RETURN(rc); rc = llog_setup(NULL, obd, olg, LLOG_SIZE_REPL_CTXT, disk_obd, &lov_size_repl_logops); if (rc) GOTO(err_cleanup, rc); obd_getref(obd); /* count may not match lov->desc.ld_tgt_count during dynamic ost add */ for (i = 0; i < lov->desc.ld_tgt_count; i++) { if (!lov->lov_tgts[i]) continue; if (index && i != *index) continue; child = lov->lov_tgts[i]->ltd_obd; rc = obd_llog_init(child, &child->obd_olg, disk_obd, &i); if (rc) CERROR("error osc_llog_init idx %d osc '%s' tgt '%s' " "(rc=%d)\n", i, child->obd_name, disk_obd->obd_name, rc); rc = 0; } obd_putref(obd); GOTO(err_cleanup, rc); err_cleanup: if (rc) { struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_SIZE_REPL_CTXT); if (ctxt) llog_cleanup(NULL, ctxt); ctxt = llog_get_context(obd, LLOG_MDS_OST_ORIG_CTXT); if (ctxt) llog_cleanup(NULL, ctxt); } return rc; }
static int mds_postsetup(struct obd_device *obd) { struct mds_obd *mds = &obd->u.mds; struct llog_ctxt *ctxt; int rc = 0; ENTRY; rc = llog_setup(obd, &obd->obd_olg, LLOG_CONFIG_ORIG_CTXT, obd, 0, NULL, &llog_lvfs_ops); if (rc) RETURN(rc); rc = llog_setup(obd, &obd->obd_olg, LLOG_LOVEA_ORIG_CTXT, obd, 0, NULL, &llog_lvfs_ops); if (rc) GOTO(err_llog, rc); mds_changelog_llog_init(obd, obd); if (mds->mds_profile) { struct lustre_profile *lprof; /* The profile defines which osc and mdc to connect to, for a client. We reuse that here to figure out the name of the lov to use (and ignore lprof->lp_md). The profile was set in the config log with LCFG_MOUNTOPT profilenm oscnm mdcnm */ lprof = class_get_profile(mds->mds_profile); if (lprof == NULL) { CERROR("No profile found: %s\n", mds->mds_profile); GOTO(err_cleanup, rc = -ENOENT); } rc = mds_lov_connect(obd, lprof->lp_dt); if (rc) GOTO(err_cleanup, rc); } RETURN(rc); err_cleanup: mds_lov_clean(obd); ctxt = llog_get_context(obd, LLOG_LOVEA_ORIG_CTXT); if (ctxt) llog_cleanup(ctxt); err_llog: ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); if (ctxt) llog_cleanup(ctxt); return rc; }
static int llog_test_llog_finish(struct obd_device *obd, int count) { int rc; ENTRY; rc = llog_cleanup(llog_get_context(obd, LLOG_TEST_ORIG_CTXT)); RETURN(rc); }
static void mdd_changelog_fini(const struct lu_env *env, struct mdd_device *mdd) { struct obd_device *obd = mdd2obd_dev(mdd); struct llog_ctxt *ctxt; mdd->mdd_cl.mc_flags = 0; ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT); if (ctxt) { llog_cat_close(env, ctxt->loc_handle); llog_cleanup(env, ctxt); } ctxt = llog_get_context(obd, LLOG_CHANGELOG_USER_ORIG_CTXT); if (ctxt) { llog_cat_close(env, ctxt->loc_handle); llog_cleanup(env, ctxt); } }
int lov_llog_finish(struct obd_device *obd, int count) { struct llog_ctxt *ctxt; ENTRY; /* cleanup our llogs only if the ctxts have been setup * (client lov doesn't setup, mds lov does). */ ctxt = llog_get_context(obd, LLOG_MDS_OST_ORIG_CTXT); if (ctxt) llog_cleanup(NULL, ctxt); ctxt = llog_get_context(obd, LLOG_SIZE_REPL_CTXT); if (ctxt) llog_cleanup(NULL, ctxt); /* lov->tgt llogs are cleaned during osc_cleanup. */ RETURN(0); }
static int mgc_llog_finish(struct obd_device *obd, int count) { struct llog_ctxt *ctxt; ctxt = llog_get_context(obd, LLOG_CONFIG_REPL_CTXT); if (ctxt) llog_cleanup(NULL, ctxt); return 0; }
static int mgs_llog_finish(struct obd_device *obd, int count) { struct llog_ctxt *ctxt; int rc = 0; ENTRY; ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); if (ctxt) rc = llog_cleanup(ctxt); RETURN(rc); }
int mds_llog_init(struct obd_device *obd, struct obd_llog_group *olg, struct obd_device *disk_obd, int *index) { struct obd_device *lov_obd = obd->u.mds.mds_lov_obd; struct llog_ctxt *ctxt; int rc; ENTRY; LASSERT(olg == &obd->obd_olg); rc = llog_setup(obd, &obd->obd_olg, LLOG_MDS_OST_ORIG_CTXT, disk_obd, 0, NULL, &mds_ost_orig_logops); if (rc) RETURN(rc); rc = llog_setup(obd, &obd->obd_olg, LLOG_SIZE_REPL_CTXT, disk_obd, 0, NULL, &mds_size_repl_logops); if (rc) GOTO(err_llog, rc); rc = obd_llog_init(lov_obd, &lov_obd->obd_olg, disk_obd, index); if (rc) { CERROR("lov_llog_init err %d\n", rc); GOTO(err_cleanup, rc); } RETURN(rc); err_cleanup: ctxt = llog_get_context(obd, LLOG_SIZE_REPL_CTXT); if (ctxt) llog_cleanup(ctxt); err_llog: ctxt = llog_get_context(obd, LLOG_MDS_OST_ORIG_CTXT); if (ctxt) llog_cleanup(ctxt); return rc; }
/** * cleanup the context created by llog_setup_named() */ static int mdd_hsm_actions_llog_fini(const struct lu_env *env, struct mdd_device *m) { struct obd_device *obd = mdd2obd_dev(m); struct llog_ctxt *lctxt; ENTRY; lctxt = llog_get_context(obd, LLOG_AGENT_ORIG_CTXT); if (lctxt) { llog_cat_close(env, lctxt->loc_handle); lctxt->loc_handle = NULL; llog_cleanup(env, lctxt); } RETURN(0); }
static int llog_test_cleanup(struct obd_device *obd) { struct obd_device *tgt; struct lu_env env; int rc; rc = lu_env_init(&env, LCT_LOCAL | LCT_MG_THREAD); if (rc) return rc; tgt = obd->obd_lvfs_ctxt.dt->dd_lu_dev.ld_obd; rc = llog_cleanup(&env, llog_get_context(tgt, LLOG_TEST_ORIG_CTXT)); if (rc) CERROR("failed to llog_test_llog_finish: %d\n", rc); lu_env_fini(&env); return rc; }
/** * set llog methods and create LLOG_AGENT_ORIG_CTXT llog * object in obd_device */ static int mdd_hsm_actions_llog_init(const struct lu_env *env, struct mdd_device *m) { struct obd_device *obd = mdd2obd_dev(m); struct llog_ctxt *ctxt = NULL; int rc; ENTRY; OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt); obd->obd_lvfs_ctxt.dt = m->mdd_bottom; rc = llog_setup(env, obd, &obd->obd_olg, LLOG_AGENT_ORIG_CTXT, obd, &hsm_actions_logops); if (rc) { CERROR("%s: hsm actions llog setup failed: rc = %d\n", obd->obd_name, rc); RETURN(rc); } ctxt = llog_get_context(obd, LLOG_AGENT_ORIG_CTXT); LASSERT(ctxt); rc = llog_open_create(env, ctxt, &ctxt->loc_handle, NULL, HSM_ACTIONS); if (rc) { CERROR("%s: hsm actions llog open_create failed: rc = %d\n", obd->obd_name, rc); GOTO(out_cleanup, rc); } rc = llog_cat_init_and_process(env, ctxt->loc_handle); if (rc) GOTO(out_close, rc); llog_ctxt_put(ctxt); RETURN(0); out_close: llog_cat_close(env, ctxt->loc_handle); ctxt->loc_handle = NULL; out_cleanup: llog_cleanup(env, ctxt); return rc; }
static int mdd_changelog_llog_init(const struct lu_env *env, struct mdd_device *mdd) { struct obd_device *obd = mdd2obd_dev(mdd); struct llog_ctxt *ctxt = NULL, *uctxt = NULL; int rc; ENTRY; /* LU-2844 mdd setup failure should not cause umount oops */ if (OBD_FAIL_CHECK(OBD_FAIL_MDS_CHANGELOG_INIT)) RETURN(-EIO); OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt); obd->obd_lvfs_ctxt.dt = mdd->mdd_bottom; rc = llog_setup(env, obd, &obd->obd_olg, LLOG_CHANGELOG_ORIG_CTXT, obd, &changelog_orig_logops); if (rc) { CERROR("%s: changelog llog setup failed: rc = %d\n", obd->obd_name, rc); RETURN(rc); } ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT); LASSERT(ctxt); rc = llog_open_create(env, ctxt, &ctxt->loc_handle, NULL, CHANGELOG_CATALOG); if (rc) GOTO(out_cleanup, rc); rc = llog_cat_init_and_process(env, ctxt->loc_handle); if (rc) GOTO(out_close, rc); rc = llog_cat_reverse_process(env, ctxt->loc_handle, changelog_init_cb, mdd); if (rc < 0) { CERROR("%s: changelog init failed: rc = %d\n", obd->obd_name, rc); GOTO(out_close, rc); } CDEBUG(D_IOCTL, "changelog starting index="LPU64"\n", mdd->mdd_cl.mc_index); /* setup user changelog */ rc = llog_setup(env, obd, &obd->obd_olg, LLOG_CHANGELOG_USER_ORIG_CTXT, obd, &changelog_orig_logops); if (rc) { CERROR("%s: changelog users llog setup failed: rc = %d\n", obd->obd_name, rc); GOTO(out_close, rc); } uctxt = llog_get_context(obd, LLOG_CHANGELOG_USER_ORIG_CTXT); LASSERT(ctxt); rc = llog_open_create(env, uctxt, &uctxt->loc_handle, NULL, CHANGELOG_USERS); if (rc) GOTO(out_ucleanup, rc); uctxt->loc_handle->lgh_logops->lop_add = llog_cat_add_rec; uctxt->loc_handle->lgh_logops->lop_declare_add = llog_cat_declare_add_rec; rc = llog_cat_init_and_process(env, uctxt->loc_handle); if (rc) GOTO(out_uclose, rc); rc = llog_cat_reverse_process(env, uctxt->loc_handle, changelog_user_init_cb, mdd); if (rc < 0) { CERROR("%s: changelog user init failed: rc = %d\n", obd->obd_name, rc); GOTO(out_uclose, rc); } /* If we have registered users, assume we want changelogs on */ if (mdd->mdd_cl.mc_lastuser > 0) { rc = mdd_changelog_on(env, mdd, 1); if (rc < 0) GOTO(out_uclose, rc); } llog_ctxt_put(ctxt); llog_ctxt_put(uctxt); RETURN(0); out_uclose: llog_cat_close(env, uctxt->loc_handle); out_ucleanup: llog_cleanup(env, uctxt); out_close: llog_cat_close(env, ctxt->loc_handle); out_cleanup: llog_cleanup(env, ctxt); return rc; }