* are skipped and recorded with new nids and uuid.
*
* \see mgs_replace_nids
- * \see mgs_replace_nids_log
- * \see mgs_replace_handler
+ * \see mgs_replace_log
+ * \see mgs_replace_nids_handler
*/
int jt_replace_nids(int argc, char **argv)
{
return rc;
}
+/**
+ * Clear config logs for given device or filesystem.
+ * lctl clear_conf <devicename|fsname>
+ * Command has to be run on MGS node having MGS device mounted with -o
+ * nosvc.
+ *
+ * Configuration logs for filesystem or one particular log is
+ * processed. New log is created, original log is read, its records
+ * marked SKIP do not get copied to new log. Others are copied as-is.
+ * Original file is renamed to log.${time}.bak.
+ *
+ * \see mgs_clear_configs
+ * \see mgs_replace_log
+ * \see mgs_clear_config_handler
+ **/
+int jt_lcfg_clear(int argc, char **argv)
+{
+ int rc;
+ char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf;
+ struct obd_ioctl_data data;
+
+ memset(&data, 0, sizeof(data));
+ data.ioc_dev = get_mgs_device();
+ if (argc != 2)
+ return CMD_HELP;
+
+ data.ioc_inllen1 = strlen(argv[1]) + 1;
+ data.ioc_inlbuf1 = argv[1];
+
+ memset(buf, 0, sizeof(rawbuf));
+ rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf));
+ if (rc) {
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return rc;
+ }
+
+ rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_CLEAR_CONFIGS, buf);
+ if (rc < 0) {
+ fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
+ strerror(rc = errno));
+ }
+
+ return rc;
+}
+
int jt_obd_deactivate(int argc, char **argv)
{
return do_activate(argc, argv, 0);
memset(&data, 0, sizeof(data));
data.ioc_dev = cur_device;
- data.ioc_inllen1 = sizeof(rawbuf) - cfs_size_round(sizeof(data));
+ data.ioc_inllen1 = sizeof(rawbuf) - __ALIGN_KERNEL(sizeof(data), 8);
memset(buf, 0, sizeof(rawbuf));
rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf));
if (rc) {
data.ioc_dev = cur_device;
data.ioc_inllen1 = strlen(argv[1]) + 1;
data.ioc_inlbuf1 = argv[1];
- data.ioc_inllen2 = sizeof(rawbuf) - cfs_size_round(sizeof(data)) -
- cfs_size_round(data.ioc_inllen1);
+ data.ioc_inllen2 = sizeof(rawbuf) - __ALIGN_KERNEL(sizeof(data), 8) -
+ __ALIGN_KERNEL(data.ioc_inllen1, 8);
memset(buf, 0, sizeof(rawbuf));
rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf));
if (rc) {
data.ioc_inllen3 = strlen(to) + 1;
data.ioc_inlbuf3 = to;
}
- data.ioc_inllen4 = sizeof(rawbuf) - cfs_size_round(sizeof(data)) -
- cfs_size_round(data.ioc_inllen1) -
- cfs_size_round(data.ioc_inllen2) -
- cfs_size_round(data.ioc_inllen3);
+ data.ioc_inllen4 = sizeof(rawbuf) - __ALIGN_KERNEL(sizeof(data), 8) -
+ __ALIGN_KERNEL(data.ioc_inllen1, 8) -
+ __ALIGN_KERNEL(data.ioc_inllen2, 8) -
+ __ALIGN_KERNEL(data.ioc_inllen3, 8);
memset(buf, 0, sizeof(rawbuf));
rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf));
if (rc) {
data.ioc_inllen3 = strlen(to) + 1;
data.ioc_inlbuf3 = to;
}
- data.ioc_inllen4 = sizeof(rawbuf) - cfs_size_round(sizeof(data)) -
- cfs_size_round(data.ioc_inllen1) -
- cfs_size_round(data.ioc_inllen2) -
- cfs_size_round(data.ioc_inllen3);
+ data.ioc_inllen4 = sizeof(rawbuf) - __ALIGN_KERNEL(sizeof(data), 8) -
+ __ALIGN_KERNEL(data.ioc_inllen1, 8) -
+ __ALIGN_KERNEL(data.ioc_inllen2, 8) -
+ __ALIGN_KERNEL(data.ioc_inllen3, 8);
memset(buf, 0, sizeof(rawbuf));
rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf));
if (rc) {
}
/**
+ * parse nid range
+ *
+ * \param nodemap_range --range string
+ * \param nid_range nid range string, min_nid:max_nid
+ *
+ * \retval 0 on success
+ */
+static int parse_nid_range(char *nodemap_range, char *nid_range, int range_len)
+{
+ char min_nid[LNET_NIDSTR_SIZE + 1];
+ char max_nid[LNET_NIDSTR_SIZE + 1];
+ struct list_head nidlist;
+ int rc = 0;
+
+ INIT_LIST_HEAD(&nidlist);
+
+ if (cfs_parse_nidlist(nodemap_range, strlen(nodemap_range),
+ &nidlist) <= 0) {
+ fprintf(stderr,
+ "error: nodemap_xxx_range: can't parse nid range: %s\n",
+ nodemap_range);
+ return -1;
+ }
+
+ rc = cfs_nidrange_find_min_max(&nidlist, &min_nid[0], &max_nid[0],
+ LNET_NIDSTR_SIZE);
+ if (rc < 0) {
+ if (rc == -EINVAL)
+ fprintf(stderr,
+ "error: nodemap_xxx_range: nid range uses "
+ "currently unsupported features\n");
+ else if (rc == -ERANGE)
+ fprintf(stderr,
+ "error: nodemap_xxx_range: nodemap ranges must "
+ "be contiguous\n");
+
+ return rc;
+ }
+
+ snprintf(nid_range, range_len, "%s:%s", min_nid, max_nid);
+
+ return rc;
+}
+
+/**
* add an nid range to a nodemap
*
* \param argc number of args
{
char *nodemap_name = NULL;
char *nodemap_range = NULL;
- struct list_head nidlist;
- char min_nid[LNET_NIDSTR_SIZE + 1];
- char max_nid[LNET_NIDSTR_SIZE + 1];
char nid_range[2 * LNET_NIDSTR_SIZE + 2];
int rc = 0;
int c;
{ .val = 'r', .name = "range", .has_arg = required_argument },
{ .name = NULL } };
- INIT_LIST_HEAD(&nidlist);
-
while ((c = getopt_long(argc, argv, "n:r:",
long_opts, NULL)) != -1) {
switch (c) {
return -1;
}
- if (cfs_parse_nidlist(nodemap_range, strlen(nodemap_range),
- &nidlist) <= 0) {
- fprintf(stderr, "error: %s: can't parse nid range: %s\n",
- jt_cmdname(argv[0]), nodemap_range);
- return -1;
- }
-
- if (!cfs_nidrange_is_contiguous(&nidlist)) {
- fprintf(stderr, "error: %s: nodemap ranges must be "
- "contiguous\n", jt_cmdname(argv[0]));
- return -1;
+ rc = parse_nid_range(nodemap_range, nid_range, sizeof(nid_range));
+ if (rc) {
+ errno = -rc;
+ return rc;
}
-
- cfs_nidrange_find_min_max(&nidlist, &min_nid[0], &max_nid[0],
- LNET_NIDSTR_SIZE);
- snprintf(nid_range, sizeof(nid_range), "%s:%s", min_nid, max_nid);
-
rc = nodemap_cmd(LCFG_NODEMAP_ADD_RANGE, NULL, 0, argv[0],
nodemap_name, nid_range, NULL);
if (rc != 0) {
{
char *nodemap_name = NULL;
char *nodemap_range = NULL;
- struct list_head nidlist;
- char min_nid[LNET_NIDSTR_SIZE + 1];
- char max_nid[LNET_NIDSTR_SIZE + 1];
char nid_range[2 * LNET_NIDSTR_SIZE + 2];
int rc = 0;
int c;
{ .val = 'r', .name = "range", .has_arg = required_argument },
{ .name = NULL } };
- INIT_LIST_HEAD(&nidlist);
-
while ((c = getopt_long(argc, argv, "n:r:",
long_opts, NULL)) != -1) {
switch (c) {
return -1;
}
- if (cfs_parse_nidlist(nodemap_range, strlen(nodemap_range),
- &nidlist) <= 0) {
- fprintf(stderr, "error: %s: can't parse nid range: %s\n",
- jt_cmdname(argv[0]), nodemap_range);
- return -1;
- }
-
- if (!cfs_nidrange_is_contiguous(&nidlist)) {
- fprintf(stderr, "error: %s: nodemap ranges must be "
- "contiguous\n", jt_cmdname(argv[0]));
- return -1;
+ rc = parse_nid_range(nodemap_range, nid_range, sizeof(nid_range));
+ if (rc) {
+ errno = -rc;
+ return rc;
}
-
- cfs_nidrange_find_min_max(&nidlist, &min_nid[0], &max_nid[0],
- LNET_NIDSTR_SIZE);
- snprintf(nid_range, sizeof(nid_range), "%s:%s", min_nid, max_nid);
-
rc = nodemap_cmd(LCFG_NODEMAP_DEL_RANGE, NULL, 0, argv[0],
nodemap_name, nid_range, NULL);
if (rc != 0) {
}
/**
+ * set SELinux policy info on a nodemap
+ *
+ * \param argc number of args
+ * \param argv[] variable string arguments
+ *
+ * --name nodemap name
+ * --sepol SELinux policy info
+ *
+ * \retval 0 on success
+ */
+int jt_nodemap_set_sepol(int argc, char **argv)
+{
+ char *nodemap_name = NULL;
+ char *sepol = NULL;
+ int rc = 0;
+ int c;
+
+ static struct option long_options[] = {
+ {
+ .name = "name",
+ .has_arg = required_argument,
+ .val = 'n',
+ },
+ {
+ .name = "sepol",
+ .has_arg = required_argument,
+ .val = 's',
+ },
+ {
+ .name = NULL,
+ }
+ };
+
+ while ((c = getopt_long(argc, argv, "n:s:",
+ long_options, NULL)) != -1) {
+ switch (c) {
+ case 'n':
+ nodemap_name = optarg;
+ break;
+ case 's':
+ sepol = optarg;
+ break;
+ }
+ }
+
+ if (nodemap_name == NULL || sepol == NULL) {
+ fprintf(stderr, "usage: nodemap_set_sepol --name <name> "
+ "--sepol <sepol>\n");
+ return -1;
+ }
+
+ rc = nodemap_cmd(LCFG_NODEMAP_SET_SEPOL, NULL, 0, argv[0],
+ nodemap_name, sepol, NULL);
+ if (rc != 0) {
+ errno = -rc;
+ fprintf(stderr, "error: %s: cannot set sepol '%s' on nodemap "
+ "'%s': rc = %d\n",
+ jt_cmdname(argv[0]), sepol, nodemap_name, rc);
+ }
+
+ return rc;
+}
+
+/**
* modify a nodemap's behavior
*
* \param argc number of args
char *ptr;
int rc;
- strlcpy(fsname, arg, PATH_MAX + 1);
+ snprintf(fsname, PATH_MAX + 1, "%s", arg);
ptr = strchr(fsname, '.');
if (ptr == NULL) {
fprintf(stderr, ". is missing in %s\n", fsname);
strncpy(poolname, ptr, LOV_MAXPOOLNAME);
poolname[LOV_MAXPOOLNAME] = '\0';
+
+ if (strncmp(poolname, "none", LOV_MAXPOOLNAME) == 0) {
+ fprintf(stderr, "poolname cannot be 'none'\n");
+ return -EINVAL;
+ }
return 0;
err: