#define PARAM_AT_EXTRA "at_extra=" /* global */
#define PARAM_AT_EARLY_MARGIN "at_early_margin=" /* global */
#define PARAM_AT_HISTORY "at_history=" /* global */
+#define PARAM_JOBID_VAR "jobid_var=" /* global */
#define PARAM_MGSNODE "mgsnode=" /* only at mounttime */
#define PARAM_FAILNODE "failover.node=" /* add failover nid */
#define PARAM_FAILMODE "failover.mode=" /* initial mount only */
return snprintf(page, count, "%u\n", ealen);
}
-static int ll_rd_jobidvar(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- return snprintf(page, count, "%s\n", obd_jobid_var);
-}
-
-static int ll_wr_jobidvar(struct file *file, const char *buffer,
- unsigned long count, void *data)
-{
- if (!count || count > JOBSTATS_JOBID_VAR_MAX_LEN)
- return -EINVAL;
-
- memset(obd_jobid_var, 0, JOBSTATS_JOBID_VAR_MAX_LEN + 1);
- /* Trim the trailing '\n' if any */
- memcpy(obd_jobid_var, buffer, count - (buffer[count - 1] == '\n'));
- return count;
-}
-
static struct lprocfs_vars lprocfs_llite_obd_vars[] = {
{ "uuid", ll_rd_sb_uuid, 0, 0 },
//{ "mntpt_path", ll_rd_path, 0, 0 },
{ "statahead_stats", ll_rd_statahead_stats, 0, 0 },
{ "lazystatfs", ll_rd_lazystatfs, ll_wr_lazystatfs, 0 },
{ "max_easize", ll_rd_maxea_size, 0, 0 },
- { "jobid_var", ll_rd_jobidvar, ll_wr_jobidvar, 0 },
{ 0 }
};
/* 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;
- char sep;
- 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;
-
- /* separate the value */
- val = simple_strtoul(tmp, NULL, 0);
- if (*tmp == '\0')
- CDEBUG(D_MGS, "global '%s' removed\n", sys);
- else
- CDEBUG(D_MGS, "global '%s' val=%d\n", sys, 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;
- /* truncate the comment to the parameter name */
- ptr = tmp - 1;
- sep = *ptr;
- *ptr = '\0';
- /* modify all servers and clients */
- rc = mgs_write_log_direct_all(obd, fsdb, mti,
- *tmp == '\0' ? NULL : lcfg,
- mti->mti_fsname, sys);
- *ptr = sep;
- lustre_cfg_free(lcfg);
- return rc;
+ struct mgs_target_info *mti, char *sys, char *ptr)
+{
+ struct lustre_cfg_bufs bufs;
+ struct lustre_cfg *lcfg;
+ char *tmp, sep;
+ int rc, cmd, convert = 1;
+
+ 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 if (class_match_param(ptr, PARAM_JOBID_VAR, &tmp) == 0) {
+ convert = 0; /* Don't convert string value to integer */
+ cmd = LCFG_PARAM;
+ } else {
+ return -EINVAL;
+ }
+
+ if (mgs_param_empty(ptr))
+ CDEBUG(D_MGS, "global '%s' removed\n", sys);
+ else
+ CDEBUG(D_MGS, "global '%s' val=%s\n", sys, tmp);
+
+ lustre_cfg_bufs_reset(&bufs, NULL);
+ lustre_cfg_bufs_set_string(&bufs, 1, sys);
+ if (!convert && *tmp != '\0')
+ lustre_cfg_bufs_set_string(&bufs, 2, tmp);
+ lcfg = lustre_cfg_new(cmd, &bufs);
+ lcfg->lcfg_num = convert ? simple_strtoul(tmp, NULL, 0) : 0;
+ /* truncate the comment to the parameter name */
+ ptr = tmp - 1;
+ sep = *ptr;
+ *ptr = '\0';
+ /* modify all servers and clients */
+ rc = mgs_write_log_direct_all(obd, fsdb, mti,
+ *tmp == '\0' ? NULL : lcfg,
+ mti->mti_fsname, sys);
+ *ptr = sep;
+ lustre_cfg_free(lcfg);
+ return rc;
}
static int mgs_srpc_set_param_disk(struct obd_device *obd,
return rc;
}
+static int obd_proc_rd_jobid_var(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ return snprintf(page, count, "%s\n", obd_jobid_var);
+}
+
+static int obd_proc_wr_jobid_var(struct file *file, const char *buffer,
+ unsigned long count, void *data)
+{
+ if (!count || count > JOBSTATS_JOBID_VAR_MAX_LEN)
+ return -EINVAL;
+
+ memset(obd_jobid_var, 0, JOBSTATS_JOBID_VAR_MAX_LEN + 1);
+ /* Trim the trailing '\n' if any */
+ memcpy(obd_jobid_var, buffer, count - (buffer[count - 1] == '\n'));
+ return count;
+}
+
/* Root for /proc/fs/lustre */
struct proc_dir_entry *proc_lustre_root = NULL;
struct lprocfs_vars lprocfs_base[] = {
- { "version", obd_proc_read_version, NULL, NULL },
- { "pinger", obd_proc_read_pinger, NULL, NULL },
- { "health_check", obd_proc_read_health, NULL, NULL },
- { 0 }
+ { "version", obd_proc_read_version, NULL, NULL },
+ { "pinger", obd_proc_read_pinger, NULL, NULL },
+ { "health_check", obd_proc_read_health, NULL, NULL },
+ { "jobid_var", obd_proc_rd_jobid_var,
+ obd_proc_wr_jobid_var, NULL },
+ { 0 }
};
#else
#define lprocfs_base NULL
EXIT;
}
-static int class_set_global(char *ptr, int val) {
- ENTRY;
-
- if (class_match_param(ptr, PARAM_AT_MIN, NULL) == 0)
- at_min = val;
- else if (class_match_param(ptr, PARAM_AT_MAX, NULL) == 0)
- at_max = val;
- else if (class_match_param(ptr, PARAM_AT_EXTRA, NULL) == 0)
- at_extra = val;
- else if (class_match_param(ptr, PARAM_AT_EARLY_MARGIN, NULL) == 0)
- at_early_margin = val;
- else if (class_match_param(ptr, PARAM_AT_HISTORY, NULL) == 0)
- at_history = val;
- else
- RETURN(-EINVAL);
-
- CDEBUG(D_IOCTL, "global %s = %d\n", ptr, val);
-
- RETURN(0);
+static int class_set_global(char *ptr, int val, struct lustre_cfg *lcfg)
+{
+ ENTRY;
+ if (class_match_param(ptr, PARAM_AT_MIN, NULL) == 0)
+ at_min = val;
+ else if (class_match_param(ptr, PARAM_AT_MAX, NULL) == 0)
+ at_max = val;
+ else if (class_match_param(ptr, PARAM_AT_EXTRA, NULL) == 0)
+ at_extra = val;
+ else if (class_match_param(ptr, PARAM_AT_EARLY_MARGIN, NULL) == 0)
+ at_early_margin = val;
+ else if (class_match_param(ptr, PARAM_AT_HISTORY, NULL) == 0)
+ at_history = val;
+ else if (class_match_param(ptr, PARAM_JOBID_VAR, NULL) == 0) {
+ memset(obd_jobid_var, 0, JOBSTATS_JOBID_VAR_MAX_LEN + 1);
+ memcpy(obd_jobid_var, lustre_cfg_string(lcfg, 2),
+ JOBSTATS_JOBID_VAR_MAX_LEN + 1);
+ } else
+ RETURN(-EINVAL);
+
+ CDEBUG(D_IOCTL, "global %s = %d\n", ptr, val);
+ RETURN(0);
}
} else if ((class_match_param(lustre_cfg_string(lcfg, 1),
PARAM_SYS, &tmp) == 0)) {
/* Global param settings */
- err = class_set_global(tmp, lcfg->lcfg_num);
+ err = class_set_global(tmp, lcfg->lcfg_num, lcfg);
/* Note that since LCFG_PARAM is LCFG_REQUIRED, new
unknown globals would cause config to fail */
if (err)
test_205() { # Job stats
local cmd
- OLD_JOBENV=`$LCTL get_param -n llite.*.jobid_var`
+ OLD_JOBENV=`$LCTL get_param -n jobid_var`
if [ $OLD_JOBENV != $JOBENV ]; then
- do_facet mgs $LCTL conf_param $FSNAME.llite.jobid_var=$JOBENV
- wait_update $HOSTNAME "$LCTL get_param -n llite.*.jobid_var" \
+ do_facet mgs $LCTL conf_param $FSNAME.sys.jobid_var=$JOBENV
+ wait_update $HOSTNAME "$LCTL get_param -n jobid_var" \
$JOBENV || return 1
fi
rm -f $DIR/jobstats_test_rename
if [ $OLD_JOBENV != $JOBENV ]; then
- do_facet mgs $LCTL conf_param $FSNAME.llite.jobid_var=$OLD_JOBENV
- wait_update $HOSTNAME "$LCTL get_param -n llite.*.jobid_var" \
+ do_facet mgs $LCTL conf_param $FSNAME.sys.jobid_var=$OLD_JOBENV
+ wait_update $HOSTNAME "$LCTL get_param -n jobid_var" \
$OLD_JOBENV || return 1
fi
}