#include <lustre_sec.h>
#include "mgs_internal.h"
-static int mgs_get_fsdb_srpc_from_llog(struct obd_device *obd,
- struct fs_db *fsdb);
-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);
-
/********************** Class functions ********************/
/* Caller must list_del and OBD_FREE each dentry from the list */
int rc;
ENTRY;
+ if (strlen(fsname) >= sizeof(fsdb->fsdb_name)) {
+ CERROR("fsname %s is too long\n", fsname);
+ RETURN(NULL);
+ }
+
OBD_ALLOC_PTR(fsdb);
if (!fsdb)
RETURN(NULL);
- OBD_ALLOC(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE);
- OBD_ALLOC(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE);
- if (!fsdb->fsdb_ost_index_map || !fsdb->fsdb_mdt_index_map) {
- CERROR("No memory for index maps\n");
- GOTO(err, 0);
- }
+ strcpy(fsdb->fsdb_name, fsname);
+ sema_init(&fsdb->fsdb_sem, 1);
+ fsdb->fsdb_fl_udesc = 1;
- strncpy(fsdb->fsdb_name, fsname, sizeof(fsdb->fsdb_name));
- fsdb->fsdb_name[sizeof(fsdb->fsdb_name) - 1] = 0;
- rc = name_create(&fsdb->fsdb_mdtlov, fsname, "-mdtlov");
- if (rc)
- GOTO(err, rc);
- rc = name_create(&fsdb->fsdb_mdtlmv, fsname, "-mdtlmv");
- if (rc)
- GOTO(err, rc);
- rc = name_create(&fsdb->fsdb_clilov, fsname, "-clilov");
- if (rc)
- GOTO(err, rc);
+ if (strcmp(fsname, MGSSELF_NAME) == 0) {
+ fsdb->fsdb_fl_mgsself = 1;
+ } else {
+ OBD_ALLOC(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE);
+ OBD_ALLOC(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE);
+ if (!fsdb->fsdb_ost_index_map || !fsdb->fsdb_mdt_index_map) {
+ CERROR("No memory for index maps\n");
+ GOTO(err, 0);
+ }
- rc = name_create(&fsdb->fsdb_clilmv, fsname, "-clilmv");
- if (rc)
- GOTO(err, rc);
+ rc = name_create(&fsdb->fsdb_mdtlov, fsname, "-mdtlov");
+ if (rc)
+ GOTO(err, rc);
+ rc = name_create(&fsdb->fsdb_mdtlmv, fsname, "-mdtlmv");
+ if (rc)
+ GOTO(err, rc);
+ rc = name_create(&fsdb->fsdb_clilov, fsname, "-clilov");
+ if (rc)
+ GOTO(err, rc);
+ rc = name_create(&fsdb->fsdb_clilmv, fsname, "-clilmv");
+ if (rc)
+ GOTO(err, rc);
+
+ lproc_mgs_add_live(obd, fsdb);
+ }
- fsdb->fsdb_srpc_fl_udesc = 1;
- sema_init(&fsdb->fsdb_sem, 1);
list_add(&fsdb->fsdb_list, &mgs->mgs_fs_db_list);
- lproc_mgs_add_live(obd, fsdb);
RETURN(fsdb);
err:
down(&fsdb->fsdb_sem);
lproc_mgs_del_live(obd, fsdb);
list_del(&fsdb->fsdb_list);
- OBD_FREE(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE);
- OBD_FREE(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE);
+ if (fsdb->fsdb_ost_index_map)
+ OBD_FREE(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE);
+ if (fsdb->fsdb_mdt_index_map)
+ OBD_FREE(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE);
name_destroy(&fsdb->fsdb_clilov);
name_destroy(&fsdb->fsdb_clilmv);
name_destroy(&fsdb->fsdb_mdtlov);
return 0;
}
-static int mgs_find_or_make_fsdb(struct obd_device *obd, char *name,
- struct fs_db **dbh)
+int mgs_find_or_make_fsdb(struct obd_device *obd, char *name,
+ struct fs_db **dbh)
{
struct mgs_obd *mgs = &obd->u.mgs;
struct fs_db *fsdb;
if (!fsdb)
return -ENOMEM;
- /* populate the db from the client llog */
- rc = mgs_get_fsdb_from_llog(obd, fsdb);
- if (rc) {
- CERROR("Can't get db from client log %d\n", rc);
- mgs_free_fsdb(obd, fsdb);
- return rc;
+ if (!fsdb->fsdb_fl_mgsself) {
+ /* populate the db from the client llog */
+ rc = mgs_get_fsdb_from_llog(obd, fsdb);
+ if (rc) {
+ CERROR("Can't get db from client log %d\n", rc);
+ mgs_free_fsdb(obd, fsdb);
+ return rc;
+ }
}
/* populate srpc rules from params llog */
return record_base(obd,llh,devname,0,LCFG_SETUP,s1,s2,s3,s4);
}
-static inline int record_sptlrpc_conf(struct obd_device *obd,
- struct llog_handle *llh,
- char *devname,
- struct sptlrpc_conf_log *srpc_log)
-{
- struct lustre_cfg_bufs bufs;
- struct lustre_cfg *lcfg;
- int rc;
-
- lustre_cfg_bufs_reset(&bufs, devname);
- lustre_cfg_bufs_set(&bufs, 1, srpc_log, sizeof(*srpc_log));
- lcfg = lustre_cfg_new(LCFG_SPTLRPC_CONF, &bufs);
-
- rc = record_lcfg(obd, llh, lcfg);
-
- lustre_cfg_free(lcfg);
- return rc;
-}
-
static int record_lov_setup(struct obd_device *obd, struct llog_handle *llh,
char *devname, struct lov_desc *desc)
{
char *logname, char *lmvname)
{
struct llog_handle *llh = NULL;
- struct sptlrpc_conf_log *srpc_log;
char *mdcname, *nodeuuid, *mdcuuid, *lmvuuid;
char index[5];
int i, rc;
CDEBUG(D_MGS, "adding mdc for %s to log %s:lmv(%s)\n",
mti->mti_svname, logname, lmvname);
- srpc_log = sptlrpc_conf_log_alloc();
- if (IS_ERR(srpc_log))
- RETURN(PTR_ERR(srpc_log));
- srpc_log->scl_part = LUSTRE_SP_CLI;
-
- rc = mgs_get_srpc_conf_log(fsdb, mti->mti_svname,
- LUSTRE_SP_CLI, LUSTRE_SP_MDT, srpc_log);
- if (rc)
- goto out_srpc;
-
name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
name_create(&mdcname, mti->mti_svname, "-mdc");
name_create(&mdcuuid, mdcname, "_UUID");
rc = record_attach(obd, llh, mdcname, LUSTRE_MDC_NAME, lmvuuid);
rc = record_setup(obd, llh, mdcname, mti->mti_uuid, nodeuuid, 0, 0);
- rc = record_sptlrpc_conf(obd, llh, mdcname, srpc_log);
rc = mgs_write_log_failnids(obd, mti, llh, mdcname);
snprintf(index, sizeof(index), "%d", mti->mti_stripe_index);
rc = record_mdc_add(obd, llh, lmvname, mdcuuid, mti->mti_uuid,
name_destroy(&mdcuuid);
name_destroy(&mdcname);
name_destroy(&nodeuuid);
-out_srpc:
- sptlrpc_conf_log_free(srpc_log);
RETURN(rc);
}
struct mgs_target_info *mti, char *logname)
{
struct llog_handle *llh = NULL;
- struct sptlrpc_conf_log *srpc_log;
char *nodeuuid, *mdcname, *mdcuuid, *mdtuuid;
int idx = mti->mti_stripe_index;
char index[9];
CDEBUG(D_MGS, "adding mdc index %d to %s\n", idx, logname);
- srpc_log = sptlrpc_conf_log_alloc();
- if (IS_ERR(srpc_log))
- RETURN(PTR_ERR(srpc_log));
- srpc_log->scl_part = LUSTRE_SP_MDT;
-
- rc = mgs_get_srpc_conf_log(fsdb, mti->mti_svname,
- LUSTRE_SP_MDT, LUSTRE_SP_MDT, srpc_log);
- if (rc)
- goto out_srpc;
-
name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
snprintf(index, sizeof(index), "-mdc%04x", idx);
name_create(&mdcname, logname, index);
}
rc = record_attach(obd, llh, mdcname, LUSTRE_MDC_NAME, mdcuuid);
rc = record_setup(obd, llh, mdcname, mti->mti_uuid, nodeuuid, 0, 0);
- rc = record_sptlrpc_conf(obd, llh, mdcname, srpc_log);
rc = mgs_write_log_failnids(obd, mti, llh, mdcname);
snprintf(index, sizeof(index), "%d", idx);
name_destroy(&mdcname);
name_destroy(&nodeuuid);
name_destroy(&mdtuuid);
-out_srpc:
- sptlrpc_conf_log_free(srpc_log);
RETURN(rc);
}
struct llog_handle *llh = NULL;
char *uuid, *lovname;
char mdt_index[5];
- struct sptlrpc_conf_log *srpc_log;
char *ptr = mti->mti_params;
int rc = 0, failout = 0;
ENTRY;
- srpc_log = sptlrpc_conf_log_alloc();
- if (IS_ERR(srpc_log))
- RETURN(PTR_ERR(srpc_log));
- srpc_log->scl_part = LUSTRE_SP_MDT;
-
- rc = mgs_get_srpc_conf_log(fsdb, mti->mti_svname,
- LUSTRE_SP_ANY, LUSTRE_SP_MDT, srpc_log);
- if (rc)
- GOTO(out_srpc, rc);
-
OBD_ALLOC(uuid, sizeof(struct obd_uuid));
if (uuid == NULL)
- GOTO(out_srpc, rc = -ENOMEM);
+ RETURN(-ENOMEM);
if (class_find_param(ptr, PARAM_FAILMODE, &ptr) == 0)
failout = (strncmp(ptr, "failout", 7) == 0);
rc = record_mount_opt(obd, llh, log, lovname, NULL);
rc = record_setup(obd, llh, log, uuid, mdt_index, lovname,
failout ? "n" : "f");
- rc = record_sptlrpc_conf(obd, llh, log, srpc_log);
rc = record_marker(obd, llh, fsdb, CM_END, log, "add mdt");
rc = record_end_log(obd, &llh);
out:
name_destroy(&lovname);
OBD_FREE(uuid, sizeof(struct obd_uuid));
-out_srpc:
- sptlrpc_conf_log_free(srpc_log);
RETURN(rc);
}
enum lustre_sec_part sec_part, int flags)
{
struct llog_handle *llh = NULL;
- struct sptlrpc_conf_log *srpc_log;
char *nodeuuid, *oscname, *oscuuid, *lovuuid, *svname;
char index[5];
int i, rc;
CDEBUG(D_INFO, "adding osc for %s to log %s\n",
mti->mti_svname, logname);
- srpc_log = sptlrpc_conf_log_alloc();
- if (IS_ERR(srpc_log))
- RETURN(PTR_ERR(srpc_log));
- srpc_log->scl_part = sec_part;
-
- rc = mgs_get_srpc_conf_log(fsdb, mti->mti_svname,
- sec_part, LUSTRE_SP_OST, srpc_log);
- if (rc)
- goto out_srpc;
-
if (mgs_log_is_empty(obd, logname)) {
/* The first item in the log must be the lov, so we have
somewhere to add our osc. */
}
rc = record_attach(obd, llh, oscname, LUSTRE_OSC_NAME, lovuuid);
rc = record_setup(obd, llh, oscname, mti->mti_uuid, nodeuuid, 0, 0);
- rc = record_sptlrpc_conf(obd, llh, oscname, srpc_log);
rc = mgs_write_log_failnids(obd, mti, llh, oscname);
snprintf(index, sizeof(index), "%d", mti->mti_stripe_index);
rc = record_lov_add(obd, llh, lovname, mti->mti_uuid, index, "1");
name_destroy(&oscname);
name_destroy(&svname);
name_destroy(&nodeuuid);
-out_srpc:
- sptlrpc_conf_log_free(srpc_log);
RETURN(rc);
}
struct mgs_target_info *mti)
{
struct llog_handle *llh = NULL;
- struct sptlrpc_conf_log *srpc_log;
char *logname, *lovname;
char mdt_index[9];
char *ptr = mti->mti_params;
RETURN(-EALREADY);
}
- srpc_log = sptlrpc_conf_log_alloc();
- if (IS_ERR(srpc_log))
- RETURN(PTR_ERR(srpc_log));
- srpc_log->scl_part = LUSTRE_SP_OST;
-
- rc = mgs_get_srpc_conf_log(fsdb, mti->mti_svname,
- LUSTRE_SP_ANY, LUSTRE_SP_OST, srpc_log);
- if (rc)
- goto out_srpc;
-
/*
attach obdfilter ost1 ost1_UUID
setup /dev/loop2 ldiskfs f|n errors=remount-ro,user_xattr
rc = record_setup(obd, llh, mti->mti_svname,
"dev"/*ignored*/, "type"/*ignored*/,
failout ? "n" : "f", 0/*options*/);
- rc = record_sptlrpc_conf(obd, llh, mti->mti_svname, srpc_log);
rc = record_marker(obd, llh, fsdb, CM_END, mti->mti_svname, "add ost");
rc = record_end_log(obd, &llh);
mgs_write_log_osc_to_lov(obd, fsdb, mti, logname, "",
fsdb->fsdb_clilov, LUSTRE_SP_CLI, 0);
name_destroy(&logname);
-out_srpc:
- sptlrpc_conf_log_free(srpc_log);
RETURN(rc);
}
return rc;
}
-/*
- * 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)
+/* write global variable settings into log */
+static int mgs_write_log_sys(struct obd_device *obd, struct fs_db *fsdb,
+ struct mgs_target_info *mti, char *sys, char *ptr)
{
- 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;
- }
- }
+ struct lustre_cfg_bufs bufs;
+ struct lustre_cfg *lcfg;
+ char *tmp;
+ int cmd, val;
+ int rc;
- if (found_tgt)
- tgt_rset = &tgtconf->mtsc_rset;
+ if (class_match_param(ptr, PARAM_TIMEOUT, &tmp) == 0)
+ cmd = LCFG_SET_TIMEOUT;
+ else if (class_match_param(ptr, PARAM_LDLM_TIMEOUT, &tmp) == 0)
+ cmd = LCFG_SET_LDLM_TIMEOUT;
+ /* Check for known params here so we can return error to lctl */
+ else if ((class_match_param(ptr, PARAM_AT_MIN, &tmp) == 0)
+ || (class_match_param(ptr, PARAM_AT_MAX, &tmp) == 0)
+ || (class_match_param(ptr, PARAM_AT_EXTRA, &tmp) == 0)
+ || (class_match_param(ptr, PARAM_AT_EARLY_MARGIN, &tmp) == 0)
+ || (class_match_param(ptr, PARAM_AT_HISTORY, &tmp) == 0))
+ cmd = LCFG_PARAM;
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);
+ val = simple_strtoul(tmp, NULL, 0);
+ CDEBUG(D_MGS, "global %s = %d\n", ptr, val);
- 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);
+ lustre_cfg_bufs_reset(&bufs, NULL);
+ lustre_cfg_bufs_set_string(&bufs, 1, sys);
+ lcfg = lustre_cfg_new(cmd, &bufs);
+ lcfg->lcfg_num = val;
+ /* modify all servers and clients */
+ rc = mgs_write_log_direct_all(obd, fsdb, mti, lcfg, mti->mti_fsname,
+ ptr);
+ lustre_cfg_free(lcfg);
+ return rc;
}
static int mgs_srpc_set_param_disk(struct obd_device *obd,
/* prepare lcfg */
lustre_cfg_bufs_reset(&bufs, mti->mti_svname);
lustre_cfg_bufs_set_string(&bufs, 1, param);
- lcfg = lustre_cfg_new(0, &bufs);
+ lcfg = lustre_cfg_new(LCFG_SPTLRPC_CONF, &bufs);
if (lcfg == NULL)
GOTO(out_comment, rc = -ENOMEM);
goto error_out;
if (strcmp(ptr, "yes") == 0) {
- fsdb->fsdb_srpc_fl_udesc = 1;
+ fsdb->fsdb_fl_udesc = 1;
CWARN("Enable user descriptor shipping from client to MDT\n");
} else if (strcmp(ptr, "no") == 0) {
- fsdb->fsdb_srpc_fl_udesc = 0;
+ fsdb->fsdb_fl_udesc = 0;
CWARN("Disable user descriptor shipping from client to MDT\n");
} else {
*(ptr - 1) = '=';
if (rc)
RETURN(rc);
+ /* mgs rules implies must be mgc->mgs */
+ if (fsdb->fsdb_fl_mgsself) {
+ if ((rule.sr_from != LUSTRE_SP_MGC &&
+ rule.sr_from != LUSTRE_SP_ANY) ||
+ (rule.sr_to != LUSTRE_SP_MGS &&
+ rule.sr_to != LUSTRE_SP_ANY))
+ RETURN(-EINVAL);
+ }
+
/* preapre room for this coming rule. svcname format should be:
* - fsname: general rule
* - fsname-tgtname: target-specific rule
rset = &fsdb->fsdb_srpc_gen;
}
- /* limit the maximum number of rules, but allow deletion in any case */
- if (rset->srs_nrule >= SPTLRPC_CONF_LOG_MAX / 2 &&
- rule.sr_flvr.sf_rpc != SPTLRPC_FLVR_INVALID) {
- CERROR("too many (%d) rules already for %s\n",
- rset->srs_nrule, svname);
- RETURN(-E2BIG);
- }
-
- rc = sptlrpc_rule_set_merge(rset, &rule, 1);
+ rc = sptlrpc_rule_set_merge(rset, &rule);
RETURN(rc);
}
struct mgs_target_info *mti,
char *param)
{
- char *copy;
- int rc, copy_size;
+ char *copy;
+ int rc, copy_size;
ENTRY;
+#ifndef HAVE_GSS
+ RETURN(-EINVAL);
+#endif
/* keep a copy of original param, which could be destroied
* during parsing */
copy_size = strlen(param) + 1;
if (rc)
goto out_free;
- /* now apply the new rules to all existing config logs */
- rc = mgs_modify_srpc_log_all(obd, fsdb, mti);
+ if (fsdb->fsdb_fl_mgsself) {
+ /*
+ * for mgs rules, make them effective immediately.
+ */
+ LASSERT(fsdb->fsdb_srpc_tgt == NULL);
+ sptlrpc_target_update_exp_flavor(obd, &fsdb->fsdb_srpc_gen);
+ }
out_free:
OBD_FREE(copy, copy_size);
if (msrd->msrd_skip)
RETURN(0);
- if (lcfg->lcfg_command != 0) {
+ if (lcfg->lcfg_command != LCFG_SPTLRPC_CONF) {
CERROR("invalid command (%x)\n", lcfg->lcfg_command);
RETURN(0);
}
RETURN(0);
}
-static int mgs_get_fsdb_srpc_from_llog(struct obd_device *obd,
- struct fs_db *fsdb)
+int mgs_get_fsdb_srpc_from_llog(struct obd_device *obd,
+ struct fs_db *fsdb)
{
struct llog_handle *llh = NULL;
struct lvfs_run_ctxt saved;
int rc;
ENTRY;
- ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
- LASSERT(ctxt != NULL);
-
/* construct log name */
rc = name_create(&logname, fsdb->fsdb_name, "-sptlrpc");
if (rc)
RETURN(rc);
+ ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
+ LASSERT(ctxt != NULL);
+
if (mgs_log_is_empty(obd, logname))
GOTO(out, rc = 0);
out_pop:
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
out:
- name_destroy(&logname);
llog_ctxt_put(ctxt);
+ name_destroy(&logname);
if (rc)
CERROR("failed to read sptlrpc config database: %d\n", rc);
RETURN(rc);
}
-static int mgs_write_log_params(struct obd_device *obd, struct fs_db *fsdb,
- struct mgs_target_info *mti)
+static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
+ struct mgs_target_info *mti, char *ptr)
{
struct lustre_cfg_bufs bufs;
- struct lustre_cfg *lcfg;
char *logname;
- char *ptr = mti->mti_params;
- char *endptr, *tmp;
+ char *tmp;
int rc = 0;
ENTRY;
- if (!mti->mti_params)
- RETURN(0);
-
/* For various parameter settings, we have to figure out which logs
care about them (e.g. both mdt and client for lov settings) */
- while (ptr) {
- while (*ptr == ' ')
- ptr++;
- if (*ptr == '\0')
- break;
- endptr = strchr(ptr, ' ');
- if (endptr)
- *endptr = '\0';
- CDEBUG(D_MGS, "next param '%s'\n", ptr);
-
- /* The params are stored in MOUNT_DATA_FILE and modified
- via tunefs.lustre, or set using lctl conf_param */
-
- /* Processed in lustre_start_mgc */
- if (class_match_param(ptr, PARAM_MGSNODE, NULL) == 0)
- GOTO(end_while, rc);
-
- /* Processed in mgs_write_log_ost */
- if (class_match_param(ptr, PARAM_FAILMODE, NULL) == 0) {
- if (mti->mti_flags & LDD_F_PARAM) {
- LCONSOLE_ERROR_MSG(0x169, "%s can only be "
- "changed with tunefs.lustre"
- "and --writeconf\n", ptr);
- rc = -EPERM;
- }
- GOTO(end_while, rc);
+ CDEBUG(D_MGS, "next param '%s'\n", ptr);
+
+ /* The params are stored in MOUNT_DATA_FILE and modified via
+ tunefs.lustre, or set using lctl conf_param */
+
+ /* Processed in lustre_start_mgc */
+ if (class_match_param(ptr, PARAM_MGSNODE, NULL) == 0)
+ GOTO(end, rc);
+
+ /* Processed in mgs_write_log_ost */
+ if (class_match_param(ptr, PARAM_FAILMODE, NULL) == 0) {
+ if (mti->mti_flags & LDD_F_PARAM) {
+ LCONSOLE_ERROR_MSG(0x169, "%s can only be "
+ "changed with tunefs.lustre"
+ "and --writeconf\n", ptr);
+ rc = -EPERM;
}
+ GOTO(end, rc);
+ }
- if (class_match_param(ptr, PARAM_SRPC, NULL) == 0) {
- rc = mgs_srpc_set_param(obd, fsdb, mti, ptr);
- GOTO(end_while, rc);
- }
+ if (class_match_param(ptr, PARAM_SRPC, NULL) == 0) {
+ rc = mgs_srpc_set_param(obd, fsdb, mti, ptr);
+ GOTO(end, rc);
+ }
- if (class_match_param(ptr, PARAM_FAILNODE, NULL) == 0) {
- /* Add a failover nidlist */
- rc = 0;
- /* We already processed failovers params for new
- targets in mgs_write_log_target */
- if (mti->mti_flags & LDD_F_PARAM) {
- CDEBUG(D_MGS, "Adding failnode\n");
- rc = mgs_write_log_add_failnid(obd, fsdb, mti);
- }
- GOTO(end_while, rc);
+ if (class_match_param(ptr, PARAM_FAILNODE, NULL) == 0) {
+ /* Add a failover nidlist */
+ rc = 0;
+ /* We already processed failovers params for new
+ targets in mgs_write_log_target */
+ if (mti->mti_flags & LDD_F_PARAM) {
+ CDEBUG(D_MGS, "Adding failnode\n");
+ rc = mgs_write_log_add_failnid(obd, fsdb, mti);
}
+ GOTO(end, rc);
+ }
- if (class_match_param(ptr, PARAM_SYS_TIMEOUT, &tmp) == 0) {
- /* Change obd timeout */
- int timeout;
- timeout = simple_strtoul(tmp, NULL, 0);
-
- CDEBUG(D_MGS, "obd timeout %d\n", timeout);
- lustre_cfg_bufs_reset(&bufs, NULL);
- lcfg = lustre_cfg_new(LCFG_SET_TIMEOUT, &bufs);
- lcfg->lcfg_num = timeout;
- /* modify all servers and clients */
- rc = mgs_write_log_direct_all(obd, fsdb, mti, lcfg,
- mti->mti_fsname,
- "timeout");
- lustre_cfg_free(lcfg);
- GOTO(end_while, rc);
- }
+ if (class_match_param(ptr, PARAM_SYS, &tmp) == 0) {
+ rc = mgs_write_log_sys(obd, fsdb, mti, ptr, tmp);
+ GOTO(end, rc);
+ }
- if (class_match_param(ptr, PARAM_OSC""PARAM_ACTIVE, &tmp) == 0) {
- /* active=0 means off, anything else means on */
- char mdt_index[16];
- int flag = (*tmp == '0') ? CM_EXCLUDE : 0;
- int i;
+ if (class_match_param(ptr, PARAM_OSC""PARAM_ACTIVE, &tmp) == 0) {
+ /* active=0 means off, anything else means on */
+ char mdt_index[16];
+ int flag = (*tmp == '0') ? CM_EXCLUDE : 0;
+ int i;
- if (!(mti->mti_flags & LDD_F_SV_TYPE_OST)) {
- LCONSOLE_ERROR_MSG(0x144, "%s: Only OSCs can "
- "be (de)activated.\n",
- mti->mti_svname);
- rc = -EINVAL;
- goto end_while;
- }
- LCONSOLE_WARN("Permanently %sactivating %s\n",
- flag ? "de": "re", mti->mti_svname);
- /* Modify clilov */
- name_create(&logname, mti->mti_fsname, "-client");
+ if (!(mti->mti_flags & LDD_F_SV_TYPE_OST)) {
+ LCONSOLE_ERROR_MSG(0x144, "%s: Only OSCs can "
+ "be (de)activated.\n",
+ mti->mti_svname);
+ GOTO(end, rc = -EINVAL);
+ }
+ LCONSOLE_WARN("Permanently %sactivating %s\n",
+ flag ? "de": "re", mti->mti_svname);
+ /* Modify clilov */
+ name_create(&logname, mti->mti_fsname, "-client");
+ rc = mgs_modify(obd, fsdb, mti, logname,
+ mti->mti_svname, "add osc", flag);
+ name_destroy(&logname);
+ if (rc)
+ goto active_err;
+ /* Modify mdtlov */
+ /* FIXME add to all MDT logs for CMD */
+ for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
+ if (!test_bit(i, fsdb->fsdb_mdt_index_map))
+ continue;
+ sprintf(mdt_index,"-MDT%04x", i);
+ name_create(&logname, mti->mti_fsname, mdt_index);
rc = mgs_modify(obd, fsdb, mti, logname,
mti->mti_svname, "add osc", flag);
name_destroy(&logname);
if (rc)
goto active_err;
- /* Modify mdtlov */
- /* FIXME add to all MDT logs for CMD */
- for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
- if (!test_bit(i, fsdb->fsdb_mdt_index_map))
- continue;
- sprintf(mdt_index,"-MDT%04x", i);
- name_create(&logname, mti->mti_fsname, mdt_index);
- rc = mgs_modify(obd, fsdb, mti, logname,
- mti->mti_svname, "add osc", flag);
- name_destroy(&logname);
- if (rc)
- goto active_err;
- }
-active_err:
- if (rc) {
- LCONSOLE_ERROR_MSG(0x145, "Couldn't find %s in"
- "log (%d). No permanent "
- "changes were made to the "
- "config log.\n",
- mti->mti_svname, rc);
- if (fsdb->fsdb_flags & FSDB_OLDLOG14)
- LCONSOLE_ERROR_MSG(0x146, "This may be"
- " because the log "
- "is in the old 1.4"
- "style. Consider "
- " --writeconf to "
- "update the logs.\n");
- goto end_while;
- }
- /* Fall through to osc proc for deactivating
- live OSC on running MDT / clients. */
}
- /* Below here, let obd's XXX_process_config methods handle it */
+ active_err:
+ if (rc) {
+ LCONSOLE_ERROR_MSG(0x145, "Couldn't find %s in"
+ "log (%d). No permanent "
+ "changes were made to the "
+ "config log.\n",
+ mti->mti_svname, rc);
+ if (fsdb->fsdb_flags & FSDB_OLDLOG14)
+ LCONSOLE_ERROR_MSG(0x146, "This may be"
+ " because the log"
+ "is in the old 1.4"
+ "style. Consider "
+ " --writeconf to "
+ "update the logs.\n");
+ GOTO(end, rc);
+ }
+ /* Fall through to osc proc for deactivating live OSC
+ on running MDT / clients. */
+ }
+ /* Below here, let obd's XXX_process_config methods handle it */
- /* All lov. in proc */
- if (class_match_param(ptr, PARAM_LOV, NULL) == 0) {
- char mdt_index[16];
- char *mdtlovname;
+ /* All lov. in proc */
+ if (class_match_param(ptr, PARAM_LOV, NULL) == 0) {
+ char mdt_index[16];
+ char *mdtlovname;
- CDEBUG(D_MGS, "lov param %s\n", ptr);
- if (!(mti->mti_flags & LDD_F_SV_TYPE_MDT)) {
- LCONSOLE_ERROR_MSG(0x147, "LOV params must be "
- "set on the MDT, not %s. "
- "Ignoring.\n",
- mti->mti_svname);
- rc = 0;
- goto end_while;
- }
+ CDEBUG(D_MGS, "lov param %s\n", ptr);
+ if (!(mti->mti_flags & LDD_F_SV_TYPE_MDT)) {
+ LCONSOLE_ERROR_MSG(0x147, "LOV params must be "
+ "set on the MDT, not %s. "
+ "Ignoring.\n",
+ mti->mti_svname);
+ GOTO(end, rc = 0);
+ }
- /* Modify mdtlov */
- if (mgs_log_is_empty(obd, mti->mti_svname))
- GOTO(end_while, rc = -ENODEV);
+ /* Modify mdtlov */
+ if (mgs_log_is_empty(obd, mti->mti_svname))
+ GOTO(end, rc = -ENODEV);
- sprintf(mdt_index,"-MDT%04x", mti->mti_stripe_index);
- name_create(&logname, mti->mti_fsname, mdt_index);
- name_create(&mdtlovname, logname, "-mdtlov");
- rc = mgs_wlp_lcfg(obd, fsdb, mti, mti->mti_svname,
- &bufs, mdtlovname, ptr);
- name_destroy(&logname);
- name_destroy(&mdtlovname);
- if (rc)
- GOTO(end_while, rc);
+ sprintf(mdt_index,"-MDT%04x", mti->mti_stripe_index);
+ name_create(&logname, mti->mti_fsname, mdt_index);
+ name_create(&mdtlovname, logname, "-mdtlov");
+ rc = mgs_wlp_lcfg(obd, fsdb, mti, mti->mti_svname,
+ &bufs, mdtlovname, ptr);
+ name_destroy(&logname);
+ name_destroy(&mdtlovname);
+ if (rc)
+ GOTO(end, rc);
- /* Modify clilov */
- name_create(&logname, mti->mti_fsname, "-client");
- rc = mgs_wlp_lcfg(obd, fsdb, mti, logname, &bufs,
- fsdb->fsdb_clilov, ptr);
- name_destroy(&logname);
- GOTO(end_while, rc);
+ /* Modify clilov */
+ name_create(&logname, mti->mti_fsname, "-client");
+ rc = mgs_wlp_lcfg(obd, fsdb, mti, logname, &bufs,
+ fsdb->fsdb_clilov, ptr);
+ name_destroy(&logname);
+ GOTO(end, rc);
+ }
+
+ /* All osc., mdc., llite. params in proc */
+ if ((class_match_param(ptr, PARAM_OSC, NULL) == 0) ||
+ (class_match_param(ptr, PARAM_MDC, NULL) == 0) ||
+ (class_match_param(ptr, PARAM_LLITE, NULL) == 0)) {
+ char *cname;
+ if (memcmp(ptr, PARAM_LLITE, strlen(PARAM_LLITE)) == 0) {
+ name_create(&cname, mti->mti_fsname, "-client");
+ /* Add the client type to match the obdname in
+ class_config_llog_handler */
+ } else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
+ /* COMPAT_146 */
+ if (fsdb->fsdb_mdc)
+ name_create(&cname, fsdb->fsdb_mdc, "");
+ else
+ name_create(&cname, mti->mti_svname,
+ "-mdc");
+ } else if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
+ /* COMPAT_146 */
+ if (fsdb->fsdb_flags & FSDB_OLDLOG14) {
+ LCONSOLE_ERROR_MSG(0x148, "Upgraded "
+ "client logs for %s"
+ " cannot be "
+ "modified. Consider"
+ " updating the "
+ "configuration with"
+ " --writeconf\n",
+ mti->mti_svname);
+ /* We don't know the names of all the
+ old oscs*/
+ GOTO(end, rc = -EINVAL);
+ }
+ name_create(&cname, mti->mti_svname, "-osc");
+ } else {
+ GOTO(end, rc = -EINVAL);
}
- /* All osc., mdc., llite. params in proc */
- if ((class_match_param(ptr, PARAM_OSC, NULL) == 0) ||
- (class_match_param(ptr, PARAM_MDC, NULL) == 0) ||
- (class_match_param(ptr, PARAM_LLITE, NULL) == 0)) {
- char *cname;
- if (memcmp(ptr, PARAM_LLITE, strlen(PARAM_LLITE)) == 0) {
- name_create(&cname, mti->mti_fsname, "-client");
- /* Add the client type to match the obdname
- in class_config_llog_handler */
- } else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
- /* COMPAT_146 */
- if (fsdb->fsdb_mdc)
- name_create(&cname, fsdb->fsdb_mdc, "");
- else
- name_create(&cname, mti->mti_svname,
- "-mdc");
- } else if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
- /* COMPAT_146 */
- if (fsdb->fsdb_flags & FSDB_OLDLOG14) {
- LCONSOLE_ERROR_MSG(0x148, "Upgraded "
- "client logs for %s"
- " cannot be "
- "modified. Consider"
- " updating the "
- "configuration with"
- " --writeconf\n",
- mti->mti_svname);
- /* We don't know the names of all the
- old oscs*/
- rc = -EINVAL;
- goto end_while;
- }
- name_create(&cname, mti->mti_svname, "-osc");
- } else {
- rc = -EINVAL;
- goto end_while;
- }
+ CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4);
- CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4);
-
- /* Modify client */
- name_create(&logname, mti->mti_fsname, "-client");
- rc = mgs_wlp_lcfg(obd, fsdb, mti, logname, &bufs,
- cname, ptr);
-
- /* osc params affect the MDT as well */
- if (!rc && (mti->mti_flags & LDD_F_SV_TYPE_OST)) {
- char mdt_index[16];
- int i;
-
- for (i = 0; i < INDEX_MAP_SIZE * 8; i++){
- if (!test_bit(i, fsdb->fsdb_mdt_index_map))
- continue;
- name_destroy(&cname);
- sprintf(mdt_index, "-osc-MDT%04x", i);
- name_create(&cname, mti->mti_svname,
- mdt_index);
- name_destroy(&logname);
- sprintf(mdt_index, "-MDT%04x", i);
- name_create(&logname, mti->mti_fsname,
- mdt_index);
- if (!mgs_log_is_empty(obd, logname))
- rc = mgs_wlp_lcfg(obd, fsdb,
- mti, logname,
- &bufs, cname,
- ptr);
- if (rc)
- break;
- }
- }
- name_destroy(&logname);
- name_destroy(&cname);
- GOTO(end_while, rc);
- }
+ /* Modify client */
+ name_create(&logname, mti->mti_fsname, "-client");
+ rc = mgs_wlp_lcfg(obd, fsdb, mti, logname, &bufs,
+ cname, ptr);
- /* All mdt., ost. params in proc */
- if ((class_match_param(ptr, PARAM_MDT, NULL) == 0) ||
- (class_match_param(ptr, PARAM_MDD, NULL) == 0) ||
- (class_match_param(ptr, PARAM_OST, NULL) == 0)) {
- CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4);
- if (mgs_log_is_empty(obd, mti->mti_svname)) {
- rc = -ENODEV;
- goto end_while;
+ /* osc params affect the MDT as well */
+ if (!rc && (mti->mti_flags & LDD_F_SV_TYPE_OST)) {
+ char mdt_index[16];
+ int i;
+
+ for (i = 0; i < INDEX_MAP_SIZE * 8; i++){
+ if (!test_bit(i, fsdb->fsdb_mdt_index_map))
+ continue;
+ name_destroy(&cname);
+ sprintf(mdt_index, "-osc-MDT%04x", i);
+ name_create(&cname, mti->mti_svname,
+ mdt_index);
+ name_destroy(&logname);
+ sprintf(mdt_index, "-MDT%04x", i);
+ name_create(&logname, mti->mti_fsname,
+ mdt_index);
+ if (!mgs_log_is_empty(obd, logname))
+ rc = mgs_wlp_lcfg(obd, fsdb,
+ mti, logname,
+ &bufs, cname,
+ ptr);
+ if (rc)
+ break;
}
- rc = mgs_wlp_lcfg(obd, fsdb, mti, mti->mti_svname,
- &bufs, mti->mti_svname, ptr);
- GOTO(end_while, rc);
}
+ name_destroy(&logname);
+ name_destroy(&cname);
+ GOTO(end, rc);
+ }
- LCONSOLE_WARN("Ignoring unrecognized param '%s'\n", ptr);
+ /* All mdt. params in proc */
+ if (class_match_param(ptr, PARAM_MDT, NULL) == 0) {
+ char mdt_index[16];
+ int i;
+ __u32 idx;
-end_while:
- if (rc) {
- CERROR("err %d on param '%s\n", rc, ptr);
- break;
+ CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4);
+ if (strncmp(mti->mti_svname, mti->mti_fsname,
+ MTI_NAME_MAXLEN) == 0)
+ /* device is unspecified completely? */
+ rc = LDD_F_SV_TYPE_MDT | LDD_F_SV_ALL;
+ else
+ rc = server_name2index(mti->mti_svname, &idx, NULL);
+ if (rc < 0)
+ goto active_err;
+ if ((rc & LDD_F_SV_TYPE_MDT) == 0)
+ goto active_err;
+ if (rc & LDD_F_SV_ALL) {
+ for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
+ if (!test_bit(i,
+ fsdb->fsdb_mdt_index_map))
+ continue;
+ sprintf(mdt_index,"-MDT%04x", i);
+ name_create(&logname, mti->mti_fsname,
+ mdt_index);
+ rc = mgs_wlp_lcfg(obd, fsdb, mti,
+ logname, &bufs,
+ logname, ptr);
+ name_destroy(&logname);
+ if (rc)
+ goto active_err;
+ }
+ } else {
+ rc = mgs_wlp_lcfg(obd, fsdb, mti,
+ mti->mti_svname, &bufs,
+ mti->mti_svname, ptr);
+ if (rc)
+ goto active_err;
}
+ GOTO(end, rc);
+ }
- if (!endptr)
- /* last param */
- break;
+ /* All mdd., ost. params in proc */
+ if ((class_match_param(ptr, PARAM_MDD, NULL) == 0) ||
+ (class_match_param(ptr, PARAM_OST, NULL) == 0)) {
+ CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4);
+ if (mgs_log_is_empty(obd, mti->mti_svname))
+ GOTO(end, rc = -ENODEV);
- *endptr = ' ';
- ptr = endptr + 1;
+ rc = mgs_wlp_lcfg(obd, fsdb, mti, mti->mti_svname,
+ &bufs, mti->mti_svname, ptr);
+ GOTO(end, rc);
}
+ LCONSOLE_WARN("Ignoring unrecognized param '%s'\n", ptr);
+
+end:
+ if (rc)
+ CERROR("err %d on param '%s'\n", rc, ptr);
+
RETURN(rc);
}
{
struct fs_db *fsdb;
int rc = -EINVAL;
+ char *buf, *params;
ENTRY;
/* set/check the new target index */
mti->mti_flags |= LDD_F_PARAM;
}
- rc = mgs_write_log_params(obd, fsdb, mti);
+ /* allocate temporary buffer, where class_get_next_param will
+ make copy of a current parameter */
+ OBD_ALLOC(buf, strlen(mti->mti_params) + 1);
+ if (buf == NULL)
+ GOTO(out_up, rc = -ENOMEM);
+ params = mti->mti_params;
+ while (params != NULL) {
+ rc = class_get_next_param(¶ms, buf);
+ if (rc) {
+ if (rc == 1)
+ /* there is no next parameter, that is
+ not an error */
+ rc = 0;
+ break;
+ }
+ CDEBUG(D_MGS, "remaining string: '%s', param: '%s'\n",
+ params, buf);
+ rc = mgs_write_log_param(obd, fsdb, mti, buf);
+ if (rc)
+ break;
+ }
+
+ OBD_FREE(buf, strlen(mti->mti_params) + 1);
out_up:
up(&fsdb->fsdb_sem);
ptr = strrchr(devname, '-');
memset(fsname, 0, MTI_NAME_MAXLEN);
if (ptr && (server_name2index(ptr, &index, NULL) >= 0)) {
+ /* param related to llite isn't allowed to set by OST or MDT */
+ if (strncmp(param, PARAM_LLITE, sizeof(PARAM_LLITE)) == 0)
+ RETURN(-EINVAL);
+
strncpy(fsname, devname, ptr - devname);
} else {
/* assume devname is the fsname */
rc = mgs_find_or_make_fsdb(obd, fsname, &fsdb);
if (rc)
RETURN(rc);
- if (fsdb->fsdb_flags & FSDB_LOG_EMPTY) {
+ if (!fsdb->fsdb_fl_mgsself && fsdb->fsdb_flags & FSDB_LOG_EMPTY) {
CERROR("No filesystem targets for %s. cfg_device from lctl "
"is '%s'\n", fsname, devname);
mgs_free_fsdb(obd, fsdb);
mti->mti_flags = rc | LDD_F_PARAM;
down(&fsdb->fsdb_sem);
- rc = mgs_write_log_params(obd, fsdb, mti);
+ /* this is lctl conf_param's single param path, there is not
+ need to loop through parameters */
+ rc = mgs_write_log_param(obd, fsdb, mti, mti->mti_params);
up(&fsdb->fsdb_sem);
out: