*name = NULL;
}
+struct mgs_fsdb_handler_data
+{
+ struct fs_db *fsdb;
+ __u32 ver;
+};
+
/* from the (client) config log, figure out:
1. which ost's/mdt's are configured (by index)
2. what the last config step is
3. COMPAT_146 lov name
4. COMPAT_146 mdt lov name
5. COMPAT_146 mdc name
+ 6. COMPAT_18 osc name
*/
/* It might be better to have a separate db file, instead of parsing the info
out of the client log. This is slow and potentially error-prone. */
static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec,
void *data)
{
- struct fs_db *fsdb = (struct fs_db *)data;
+ struct mgs_fsdb_handler_data *d = (struct mgs_fsdb_handler_data *) data;
+ struct fs_db *fsdb = d->fsdb;
int cfg_len = rec->lrh_len;
char *cfg_buf = (char*) (rec + 1);
struct lustre_cfg *lcfg;
}
/* end COMPAT_146 */
- /* Keep track of the latest marker step */
+ /*
+ * compat to 1.8, check osc name used by MDT0 to OSTs, bz18548.
+ */
+ if (fsdb->fsdb_fl_oscname_18 == 0 &&
+ lcfg->lcfg_command == LCFG_ATTACH &&
+ strcmp(lustre_cfg_string(lcfg, 1), LUSTRE_OSC_NAME) == 0) {
+ if (OBD_OCD_VERSION_MAJOR(d->ver) == 1 &&
+ OBD_OCD_VERSION_MINOR(d->ver) <= 8) {
+ CWARN("MDT using 1.8 OSC name scheme\n");
+ fsdb->fsdb_fl_oscname_18 = 1;
+ }
+ }
+
if (lcfg->lcfg_command == LCFG_MARKER) {
struct cfg_marker *marker;
marker = lustre_cfg_buf(lcfg, 1);
+
+ d->ver = marker->cm_vers;
+
+ /* Keep track of the latest marker step */
fsdb->fsdb_gen = max(fsdb->fsdb_gen, marker->cm_step);
}
struct llog_handle *loghandle;
struct lvfs_run_ctxt saved;
struct llog_ctxt *ctxt;
+ struct mgs_fsdb_handler_data d = { fsdb, 0 };
int rc, rc2;
ENTRY;
if (llog_get_size(loghandle) <= 1)
fsdb->fsdb_flags |= FSDB_LOG_EMPTY;
- rc = llog_process(loghandle, mgs_fsdb_handler, (void *)fsdb, NULL);
+ rc = llog_process(loghandle, mgs_fsdb_handler, (void *) &d, NULL);
CDEBUG(D_INFO, "get_db = %d\n", rc);
out_close:
rc2 = llog_close(loghandle);
return rc;
}
+/* 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 lustre_cfg_bufs bufs;
+ struct lustre_cfg *lcfg;
+ char *tmp;
+ int cmd, val;
+ int rc;
+
+ 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
+ return -EINVAL;
+
+ val = simple_strtoul(tmp, NULL, 0);
+ CDEBUG(D_MGS, "global %s = %d\n", ptr, val);
+
+ 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,
struct fs_db *fsdb,
struct mgs_target_info *mti,
rset = &fsdb->fsdb_srpc_gen;
}
- rc = sptlrpc_rule_set_merge(rset, &rule, 1);
+ rc = sptlrpc_rule_set_merge(rset, &rule);
RETURN(rc);
}
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;
struct mgs_target_info *mti, char *ptr)
{
struct lustre_cfg_bufs bufs;
- struct lustre_cfg *lcfg;
char *logname;
char *tmp;
int rc = 0;
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);
+ if (class_match_param(ptr, PARAM_SYS, &tmp) == 0) {
+ rc = mgs_write_log_sys(obd, fsdb, mti, ptr, tmp);
GOTO(end, rc);
}
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);
+ if (i == 0 && fsdb->fsdb_fl_oscname_18)
+ sprintf(mdt_index, "-osc");
+ else
+ 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,
GOTO(end, rc);
}
- /* All mdt., ost. params in proc */
- if ((class_match_param(ptr, PARAM_MDT, NULL) == 0) ||
- (class_match_param(ptr, PARAM_MDD, NULL) == 0) ||
+ /* All mdt. params in proc */
+ if (class_match_param(ptr, PARAM_MDT, NULL) == 0) {
+ char mdt_index[16];
+ int i;
+ __u32 idx;
+
+ 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);
+ }
+
+ /* 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))
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 */