-/*
- * populate rules which applied to a target device
- */
-static int mgs_get_srpc_conf_log(struct fs_db *fsdb, const char *tgt,
- enum lustre_sec_part from,
- enum lustre_sec_part to,
- struct sptlrpc_conf_log *log)
-{
- struct mgs_tgt_srpc_conf *tgtconf;
- struct sptlrpc_rule_set *tgt_rset;
- int found_tgt = 0, rc;
-
- for (tgtconf = fsdb->fsdb_srpc_tgt; tgtconf;
- tgtconf = tgtconf->mtsc_next) {
- if (!strcmp(tgt, tgtconf->mtsc_tgt)) {
- found_tgt = 1;
- break;
- }
- }
-
- if (found_tgt)
- tgt_rset = &tgtconf->mtsc_rset;
- else
- tgt_rset = NULL;
-
- rc = sptlrpc_conf_log_populate(&fsdb->fsdb_srpc_gen, tgt_rset,
- from, to, fsdb->fsdb_srpc_fl_udesc, log);
- if (rc)
- CERROR("failed to populate srpc log for %s: %d\n", tgt, rc);
-
- return rc;
-}
-
-struct mgs_msl_data {
- struct obd_device *mmd_obd;
- struct fs_db *mmd_fsdb;
- struct mgs_target_info *mmd_mti;
- int mmd_skip;
- int mmd_attached;
- int mmd_server;
- enum lustre_sec_part mmd_tgtpart;
- char mmd_tgtname[MTI_NAME_MAXLEN];
-};
-
-static void mgs_msl_data_cleanup(struct mgs_msl_data *mmd)
-{
- mmd->mmd_attached = 0;
- mmd->mmd_tgtname[0] = '\0';
-}
-
-static int mgs_msl_tgt_uuid2name(char *tgtname, char *tgtuuid)
-{
- char *ptr;
-
- if (tgtuuid == NULL) {
- CERROR("missing target UUID???\n");
- return -EINVAL;
- }
-
- ptr = strstr(tgtuuid, "_UUID");
- if (ptr == NULL) {
- CERROR("unrecognized UUID: %s\n", tgtuuid);
- return -EINVAL;
- }
-
- *ptr = '\0';;
- strncpy(tgtname, tgtuuid, MTI_NAME_MAXLEN);
- tgtname[MTI_NAME_MAXLEN - 1] = '\0';
-
- return 0;
-}
-
-static int mgs_modify_srpc_log_handler(struct llog_handle *llh,
- struct llog_rec_hdr *rec,
- void *data)
-{
- struct mgs_msl_data *mmd = (struct mgs_msl_data *)data;
- struct cfg_marker *marker;
- struct lustre_cfg *lcfg = (struct lustre_cfg *)(rec + 1);
- int cfg_len, rc;
- ENTRY;
-
- if (rec->lrh_type != OBD_CFG_REC) {
- CERROR("unhandled lrh_type: %#x\n", rec->lrh_type);
- RETURN(-EINVAL);
- }
-
- cfg_len = rec->lrh_len - sizeof(struct llog_rec_hdr) -
- sizeof(struct llog_rec_tail);
-
- rc = lustre_cfg_sanity_check(lcfg, cfg_len);
- if (rc) {
- CERROR("Insane cfg\n");
- RETURN(rc);
- }
-
- if (lcfg->lcfg_command == LCFG_MARKER) {
- marker = lustre_cfg_buf(lcfg, 1);
-
- if (marker->cm_flags & CM_START &&
- marker->cm_flags & CM_SKIP)
- mmd->mmd_skip = 1;
- if (marker->cm_flags & CM_END)
- mmd->mmd_skip = 0;
-
- RETURN(0);
- }
-
- if (mmd->mmd_skip)
- RETURN(0);
-
- switch (lcfg->lcfg_command) {
- case LCFG_ATTACH:
- mmd->mmd_attached = 1;
-
- if (!strcmp(lustre_cfg_string(lcfg, 1), LUSTRE_OST_NAME)) {
- mmd->mmd_server = 1;
- mmd->mmd_tgtpart = LUSTRE_SP_OST;
- } else if (!strcmp(lustre_cfg_string(lcfg, 1),
- LUSTRE_MDT_NAME)) {
- mmd->mmd_server = 1;
- mmd->mmd_tgtpart = LUSTRE_SP_MDT;
- } else if (!strcmp(lustre_cfg_string(lcfg, 1),
- LUSTRE_OSC_NAME)) {
- mmd->mmd_server = 0;
- mmd->mmd_tgtpart = LUSTRE_SP_OST;
- } else if (!strcmp(lustre_cfg_string(lcfg, 1),
- LUSTRE_MDC_NAME)) {
- mmd->mmd_server = 0;
- mmd->mmd_tgtpart = LUSTRE_SP_MDT;
- } else {
- mmd->mmd_attached = 0;
- }
-
- if (mmd->mmd_attached && mmd->mmd_server) {
- rc = mgs_msl_tgt_uuid2name(mmd->mmd_tgtname,
- lustre_cfg_string(lcfg, 2));
- if (rc) {
- mgs_msl_data_cleanup(mmd);
- break;
- }
- }
-
- break;
- case LCFG_SETUP:
- if (!mmd->mmd_attached)
- break;
-
- /* already got tgtname at LCFG_ATTACH */
- if (mmd->mmd_server)
- break;
-
- rc = mgs_msl_tgt_uuid2name(mmd->mmd_tgtname,
- lustre_cfg_string(lcfg, 1));
- if (rc) {
- mgs_msl_data_cleanup(mmd);
- break;
- }
-
- break;
- case LCFG_SPTLRPC_CONF: {
- struct sptlrpc_conf_log *log;
- enum lustre_sec_part from;
-
- if (!mmd->mmd_attached)
- break;
-
- log = sptlrpc_conf_log_extract(lcfg);
- if (log == NULL) {
- CERROR("missing sptlrpc config log???\n");
- mgs_msl_data_cleanup(mmd);
- break;
- }
-
- if (mmd->mmd_server)
- from = LUSTRE_SP_ANY;
- else
- from = log->scl_part;
-
- /* cleanup the old log */
- sptlrpc_conf_log_cleanup(log);
-
- /* populate new log */
- rc = mgs_get_srpc_conf_log(mmd->mmd_fsdb, mmd->mmd_tgtname,
- from, mmd->mmd_tgtpart, log);
- if (rc) {
- mgs_msl_data_cleanup(mmd);
- break;
- }
-
- /* Overwrite the log */
- rec->lrh_len = cfg_len;
- rc = llog_write_rec(llh, rec, NULL, 0, (void *)lcfg,
- rec->lrh_index);
- if (rc)
- CERROR("overwrite sptlrpc conf log failed: %d\n", rc);
-
- /* append new one */
- rc = record_marker(mmd->mmd_obd, llh, mmd->mmd_fsdb, CM_START,
- mmd->mmd_mti->mti_svname, "sptlrpc config");
- rc = record_sptlrpc_conf(mmd->mmd_obd, llh,
- lustre_cfg_string(lcfg, 0), log);
- rc = record_marker(mmd->mmd_obd, llh, mmd->mmd_fsdb, CM_END,
- mmd->mmd_mti->mti_svname, "sptlrpc config");
-
- mgs_msl_data_cleanup(mmd);
- break;
- }
- default:
- /* ignore all others */
- break;
- }
-
- RETURN(rc);
-}
-
-static int mgs_modify_srpc_log(struct obd_device *obd,
- struct fs_db *fsdb,
- struct mgs_target_info *mti,
- char *logname)
-{
- struct llog_handle *llh;
- struct lvfs_run_ctxt saved;
- struct llog_ctxt *ctxt;
- struct mgs_msl_data *mmd;
- int rc, rc2;
- ENTRY;
-
- CDEBUG(D_MGS, "modify sptlrpc log for %s\n", logname);
-
- push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-
- ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
- LASSERT(ctxt != NULL);
- rc = llog_create(ctxt, &llh, NULL, logname);
- if (rc)
- GOTO(out_pop, rc);
-
- rc = llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL);
- if (rc)
- GOTO(out_close, rc);
-
- if (llog_get_size(llh) <= 1)
- GOTO(out_close, rc = 0);
-
- OBD_ALLOC_PTR(mmd);
- if (!mmd)
- GOTO(out_close, rc = -ENOMEM);
-
- mmd->mmd_obd = obd;
- mmd->mmd_fsdb = fsdb;
- mmd->mmd_mti = mti;
-
- rc = llog_process(llh, mgs_modify_srpc_log_handler, (void *) mmd, NULL);
-
- OBD_FREE_PTR(mmd);
-
-out_close:
- rc2 = llog_close(llh);
- if (!rc)
- rc = rc2;
-
-out_pop:
- pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- llog_ctxt_put(ctxt);
-
- if (rc)
- CERROR("modify sptlrpc log %s failed %d\n", logname, rc);
- RETURN(rc);
-}
-
-/*
- * for each of log, remove old conf at first
- */
-static int mgs_modify_srpc_log_all(struct obd_device *obd,
- struct fs_db *fsdb,
- struct mgs_target_info *mti)
-{
- char tgt_index[9];
- char *logname;
- int i, rc = 0, rc2;
- ENTRY;
-
- for (i = 0; i < INDEX_MAP_SIZE * 8; i++){
- if (test_bit(i, fsdb->fsdb_mdt_index_map)) {
- sprintf(tgt_index,"-MDT%04x",i);
-
- name_create(&logname, mti->mti_fsname, tgt_index);
- rc2 = mgs_modify(obd, fsdb, mti, logname,
- mti->mti_fsname, "sptlrpc config",
- CM_SKIP);
- rc2 = mgs_modify_srpc_log(obd, fsdb, mti, logname);
- name_destroy(&logname);
-
- if (rc2 && rc == 0)
- rc = rc2;
- }
- }
-
- for (i = 0; i < INDEX_MAP_SIZE * 8; i++){
- if (test_bit(i, fsdb->fsdb_ost_index_map)) {
- sprintf(tgt_index,"-OST%04x",i);
-
- name_create(&logname, mti->mti_fsname, tgt_index);
- rc2 = mgs_modify(obd, fsdb, mti, logname,
- mti->mti_fsname, "sptlrpc config",
- CM_SKIP);
- rc2 = mgs_modify_srpc_log(obd, fsdb, mti, logname);
- name_destroy(&logname);
-
- if (rc2 && rc == 0)
- rc = rc2;
- }
- }
-
- name_create(&logname, mti->mti_fsname, "-client");
- rc2 = mgs_modify(obd, fsdb, mti, logname,
- mti->mti_fsname, "sptlrpc config", CM_SKIP);
- rc2 = mgs_modify_srpc_log(obd, fsdb, mti, logname);
- name_destroy(&logname);
-
- if (rc2 && rc == 0)
- rc = rc2;
-
- RETURN(rc);
-}
-