X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmds%2Fmds_lov.c;h=4dd05a35f1c86100aef4c1733741a63b58ed52a9;hb=090c677210ee2946d99c71412e4ff762bb300f4f;hp=d272b338808ffaa7a307c6b7e69171c88a2f995f;hpb=342797139fe89f9efd184227cfbd7d654533685c;p=fs%2Flustre-release.git diff --git a/lustre/mds/mds_lov.c b/lustre/mds/mds_lov.c index d272b33..4dd05a3 100644 --- a/lustre/mds/mds_lov.c +++ b/lustre/mds/mds_lov.c @@ -131,7 +131,8 @@ static int mds_lov_clearorphans(struct mds_obd *mds, struct obd_uuid *ost_uuid) * missing objects below this ID, they will be created. If it finds * objects above this ID, they will be removed. */ memset(&oa, 0, sizeof(oa)); - oa.o_valid = OBD_MD_FLFLAGS; + oa.o_gr = FILTER_GROUP_FIRST_MDS + mds->mds_num; + oa.o_valid = OBD_MD_FLFLAGS | OBD_MD_FLGROUP; oa.o_flags = OBD_FL_DELORPHAN; if (ost_uuid != NULL) { memcpy(&oa.o_inline, ost_uuid, sizeof(*ost_uuid)); @@ -159,20 +160,8 @@ int mds_lov_set_nextid(struct obd_device *obd) GOTO(out, rc); rc = mds_lov_clearorphans(mds, NULL /* all OSTs */); - if (rc < 0) - GOTO(out, rc); out: - if (rc && mds->mds_lov_objids) { - /* Might as well crash here, until we figure out what to do. - * If we OBD_FREE, we'll just LASSERT the next time through this - * function. */ - LBUG(); - OBD_FREE(mds->mds_lov_objids, - mds->mds_lov_desc.ld_tgt_count * sizeof(obd_id)); - mds->mds_lov_objids = NULL; - } - RETURN(rc); } @@ -192,8 +181,8 @@ int mds_lov_connect(struct obd_device *obd, char * lov_name) { struct mds_obd *mds = &obd->u.mds; struct lustre_handle conn = {0,}; - int valsize; - int rc, i; + int valsize, rc, i; + __u32 group; ENTRY; if (IS_ERR(mds->mds_osc_obd)) @@ -232,7 +221,9 @@ int mds_lov_connect(struct obd_device *obd, char * lov_name) if (rc) GOTO(err_reg, rc); - mds->mds_max_mdsize = lov_mds_md_size(mds->mds_lov_desc.ld_tgt_count); + i = lov_mds_md_size(mds->mds_lov_desc.ld_tgt_count); + if (i > mds->mds_max_mdsize) + mds->mds_max_mdsize = i; mds->mds_max_cookiesize = mds->mds_lov_desc.ld_tgt_count* sizeof(struct llog_cookie); mds->mds_has_lov_desc = 1; @@ -242,15 +233,18 @@ int mds_lov_connect(struct obd_device *obd, char * lov_name) GOTO(err_reg, rc); } - rc = llog_cat_initialize(obd, mds->mds_lov_desc.ld_tgt_count); + rc = llog_cat_initialize(obd, &obd->obd_llogs, + mds->mds_lov_desc.ld_tgt_count); if (rc) { CERROR("failed to initialize catalog %d\n", rc); GOTO(err_reg, rc); } /* FIXME before set info call is made, we must initialize logging */ + group = FILTER_GROUP_FIRST_MDS + mds->mds_num; + valsize = sizeof(group); rc = obd_set_info(mds->mds_osc_exp, strlen("mds_conn"), "mds_conn", - 0, NULL); + valsize, &group); if (rc) GOTO(err_reg, rc); @@ -278,9 +272,10 @@ int mds_lov_connect(struct obd_device *obd, char * lov_name) * it can use the obd_recovering flag to determine when the * the OBD is full available. */ if (!obd->obd_recovering) { - rc = llog_connect(llog_get_context(obd, LLOG_UNLINK_ORIG_CTXT), - obd->u.mds.mds_lov_desc.ld_tgt_count, NULL, - NULL); + struct llog_ctxt *ctxt; + ctxt = llog_get_context(&obd->obd_llogs, LLOG_UNLINK_ORIG_CTXT); + rc = llog_connect(ctxt, obd->u.mds.mds_lov_desc.ld_tgt_count, + NULL, NULL, NULL); if (rc != 0) CERROR("faild at llog_origin_connect: %d\n", rc); @@ -296,7 +291,8 @@ int mds_lov_connect(struct obd_device *obd, char * lov_name) err_llog: /* cleanup all llogging subsystems */ - rc = obd_llog_finish(obd, mds->mds_lov_desc.ld_tgt_count); + rc = obd_llog_finish(obd, &obd->obd_llogs, + mds->mds_lov_desc.ld_tgt_count); if (rc) CERROR("failed to cleanup llogging subsystems\n"); err_reg: @@ -316,7 +312,8 @@ int mds_lov_disconnect(struct obd_device *obd, int flags) if (!IS_ERR(mds->mds_osc_obd) && mds->mds_osc_exp != NULL) { /* cleanup all llogging subsystems */ - rc = obd_llog_finish(obd, mds->mds_lov_desc.ld_tgt_count); + rc = obd_llog_finish(obd, &obd->obd_llogs, + mds->mds_lov_desc.ld_tgt_count); if (rc) CERROR("failed to cleanup llogging subsystems\n"); @@ -343,6 +340,7 @@ int mds_iocontrol(unsigned int cmd, struct obd_export *exp, int len, struct mds_obd *mds = &obd->u.mds; struct obd_ioctl_data *data = karg; struct obd_run_ctxt saved; + struct llog_ctxt *ctxt; int rc = 0; switch (cmd) { @@ -352,8 +350,8 @@ int mds_iocontrol(unsigned int cmd, struct obd_export *exp, int len, RETURN(-EBUSY); push_ctxt(&saved, &obd->obd_ctxt, NULL); - rc = llog_create(llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT), - &mds->mds_cfg_llh, NULL, name); + ctxt = llog_get_context(&obd->obd_llogs, LLOG_CONFIG_ORIG_CTXT); + rc = llog_create(ctxt, &mds->mds_cfg_llh, NULL, name); if (rc == 0) llog_init_handle(mds->mds_cfg_llh, LLOG_F_IS_PLAIN, &cfg_uuid); @@ -376,6 +374,27 @@ int mds_iocontrol(unsigned int cmd, struct obd_export *exp, int len, RETURN(rc); } + case OBD_IOC_CLEAR_LOG: { + char *name = data->ioc_inlbuf1; + if (mds->mds_cfg_llh) + RETURN(-EBUSY); + + push_ctxt(&saved, &obd->obd_ctxt, NULL); + ctxt = llog_get_context(&obd->obd_llogs, LLOG_CONFIG_ORIG_CTXT); + rc = llog_create(ctxt, &mds->mds_cfg_llh, NULL, name); + if (rc == 0) { + llog_init_handle(mds->mds_cfg_llh, LLOG_F_IS_PLAIN, + NULL); + + rc = llog_destroy(mds->mds_cfg_llh); + llog_free_handle(mds->mds_cfg_llh); + } + pop_ctxt(&saved, &obd->obd_ctxt, NULL); + + mds->mds_cfg_llh = NULL; + RETURN(rc); + } + case OBD_IOC_DORECORD: { char *cfg_buf; struct llog_rec_hdr rec; @@ -413,7 +432,7 @@ int mds_iocontrol(unsigned int cmd, struct obd_export *exp, int len, case OBD_IOC_PARSE: { struct llog_ctxt *ctxt = - llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); + llog_get_context(&obd->obd_llogs, LLOG_CONFIG_ORIG_CTXT); push_ctxt(&saved, &obd->obd_ctxt, NULL); rc = class_config_parse_llog(ctxt, data->ioc_inlbuf1, NULL); pop_ctxt(&saved, &obd->obd_ctxt, NULL); @@ -425,7 +444,7 @@ int mds_iocontrol(unsigned int cmd, struct obd_export *exp, int len, case OBD_IOC_DUMP_LOG: { struct llog_ctxt *ctxt = - llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); + llog_get_context(&obd->obd_llogs, LLOG_CONFIG_ORIG_CTXT); push_ctxt(&saved, &obd->obd_ctxt, NULL); rc = class_config_dump_llog(ctxt, data->ioc_inlbuf1, NULL); pop_ctxt(&saved, &obd->obd_ctxt, NULL); @@ -460,20 +479,26 @@ int mds_iocontrol(unsigned int cmd, struct obd_export *exp, int len, case OBD_IOC_LLOG_CANCEL: case OBD_IOC_LLOG_REMOVE: { struct llog_ctxt *ctxt = - llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); + llog_get_context(&obd->obd_llogs, LLOG_CONFIG_ORIG_CTXT); + int rc2; - obd_llog_finish(obd, mds->mds_lov_desc.ld_tgt_count); + obd_llog_finish(obd, &obd->obd_llogs, + mds->mds_lov_desc.ld_tgt_count); push_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_ctxt, NULL); rc = llog_ioctl(ctxt, cmd, data); pop_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_ctxt, NULL); - llog_cat_initialize(obd, mds->mds_lov_desc.ld_tgt_count); - + llog_cat_initialize(obd, &obd->obd_llogs, + mds->mds_lov_desc.ld_tgt_count); + rc2 = obd_set_info(mds->mds_osc_exp, strlen("mds_conn"), "mds_conn", + 0, NULL); + if (!rc) + rc = rc2; RETURN(rc); } case OBD_IOC_LLOG_INFO: case OBD_IOC_LLOG_PRINT: { struct llog_ctxt *ctxt = - llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); + llog_get_context(&obd->obd_llogs, LLOG_CONFIG_ORIG_CTXT); push_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_ctxt, NULL); rc = llog_ioctl(ctxt, cmd, data); @@ -493,25 +518,49 @@ int mds_iocontrol(unsigned int cmd, struct obd_export *exp, int len, RETURN(0); } -int mds_notify(struct obd_device *obd, struct obd_device *watched, - int active) +int mds_notify(struct obd_device *obd, struct obd_device *watched, int active) { - struct obd_uuid *uuid; + struct obd_uuid *uuid; + int rc = 0; + ENTRY; if (!active) RETURN(0); if (strcmp(watched->obd_type->typ_name, "osc")) { CERROR("unexpected notification of %s %s!\n", - watched->obd_type->typ_name, - watched->obd_name); + watched->obd_type->typ_name, watched->obd_name); RETURN(-EINVAL); } uuid = &watched->u.cli.cl_import->imp_target_uuid; - CWARN("MDS %s: %s now active, resetting orphans\n", - obd->obd_name, uuid->uuid); - RETURN(mds_lov_clearorphans(&obd->u.mds, uuid)); + if (obd->obd_recovering) { + CWARN("MDS %s: in recovery, not resetting orphans on %s\n", + obd->obd_name, uuid->uuid); + } else { + struct llog_ctxt *ctxt; + + ctxt = llog_get_context(&obd->obd_llogs, LLOG_UNLINK_ORIG_CTXT); + LASSERT(ctxt != NULL); + + rc = obd_set_info(obd->u.mds.mds_osc_exp, strlen("mds_conn"), "mds_conn", + 0, uuid); + if (rc != 0) + RETURN(rc); + + ctxt = llog_get_context(&obd->obd_llogs, LLOG_UNLINK_ORIG_CTXT); + rc = llog_connect(ctxt, obd->u.mds.mds_lov_desc.ld_tgt_count, + NULL, NULL, uuid); + if (rc != 0) { + CERROR("faild at llog_origin_connect: %d\n", rc); + RETURN(rc); + } + + CWARN("MDS %s: %s now active, resetting orphans\n", + obd->obd_name, uuid->uuid); + rc = mds_lov_clearorphans(&obd->u.mds, uuid); + } + RETURN(rc); } /* Convert the on-disk LOV EA structre.