*/
/*
* This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
*
* lustre/utils/obd.c
*
#include <linux/lnet/lnetctl.h>
#ifdef HAVE_SERVER_SUPPPORT
#include <linux/lustre/lustre_barrier_user.h>
+#include <linux/lustre/lustre_disk.h>
#endif
#include <linux/lustre/lustre_cfg.h>
#include <linux/lustre/lustre_ioctl.h>
#endif
return rc;
}
-#endif /* HAVE_SERVER_SUPPORT */
int jt_obd_set_readonly(int argc, char **argv)
{
return rc;
}
-int jt_obd_abort_recovery(int argc, char **argv)
+static int obd_abort_recovery(char *cmd, enum obd_abort_recovery_flags flags)
{
- struct obd_ioctl_data data;
+ struct obd_ioctl_data data = {
+ .ioc_dev = cur_device,
+ .ioc_type = flags,
+ };
char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf;
int rc;
- memset(&data, 0, sizeof(data));
- data.ioc_dev = cur_device;
-
- if (argc != 1)
- return CMD_HELP;
-
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]));
+ jt_cmdname(cmd));
return rc;
}
rc = l_ioctl(OBD_DEV_ID, OBD_IOC_ABORT_RECOVERY, buf);
if (rc < 0)
- fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
+ fprintf(stderr, "error: %s: %s\n", jt_cmdname(cmd),
strerror(rc = errno));
return rc;
}
+int jt_obd_abort_recovery(int argc, char **argv)
+{
+ if (argc != 1)
+ return CMD_HELP;
+
+ return obd_abort_recovery(argv[0], OBD_FLG_ABORT_RECOV_OST);
+}
+
+int jt_obd_abort_recovery_mdt(int argc, char **argv)
+{
+ if (argc != 1)
+ return CMD_HELP;
+
+ return obd_abort_recovery(argv[0], OBD_FLG_ABORT_RECOV_MDT);
+}
+#else /* ! HAVE_SERVER_SUPPROT */
+int jt_obd_no_transno(int argc, char **argv)
+{
+ if (argc != 1)
+ return CMD_HELP;
+
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_obd_set_readonly(int argc, char **argv)
+{
+ if (argc != 1)
+ return CMD_HELP;
+
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_obd_abort_recovery(int argc, char **argv)
+{
+ if (argc != 1)
+ return CMD_HELP;
+
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_obd_abort_recovery_mdt(int argc, char **argv)
+{
+ if (argc != 1)
+ return CMD_HELP;
+
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+#endif /* HAVE_SERVER_SUPPORT */
+
int jt_get_version(int argc, char **argv)
{
char version[128];
return rc;
}
-int jt_obd_lov_getconfig(int argc, char **argv)
-{
- struct obd_ioctl_data data;
- struct lov_desc desc;
- struct obd_uuid *uuidarray;
- char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf;
- __u32 *obdgens;
- char *path;
- int rc, fd;
-
- memset(&data, 0, sizeof(data));
- data.ioc_dev = cur_device;
-
- if (argc != 2)
- return CMD_HELP;
-
- path = argv[1];
- fd = open(path, O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, "open \"%s\" failed: %s\n", path,
- strerror(errno));
- return -errno;
- }
-
- memset(&desc, 0, sizeof(desc));
- obd_str2uuid(&desc.ld_uuid, argv[1]);
- desc.ld_tgt_count = ((MAX_IOC_BUFLEN - sizeof(data) - sizeof(desc)) /
- (sizeof(*uuidarray) + sizeof(*obdgens)));
-
-repeat:
- uuidarray = calloc(desc.ld_tgt_count, sizeof(*uuidarray));
- if (!uuidarray) {
- fprintf(stderr, "error: %s: no memory for %d uuid's\n",
- jt_cmdname(argv[0]), desc.ld_tgt_count);
- rc = -ENOMEM;
- goto out;
- }
- obdgens = calloc(desc.ld_tgt_count, sizeof(*obdgens));
- if (!obdgens) {
- fprintf(stderr, "error: %s: no memory for %d generation #'s\n",
- jt_cmdname(argv[0]), desc.ld_tgt_count);
- rc = -ENOMEM;
- goto out_uuidarray;
- }
-
- memset(buf, 0, sizeof(rawbuf));
- data.ioc_inllen1 = sizeof(desc);
- data.ioc_inlbuf1 = (char *)&desc;
- data.ioc_inllen2 = desc.ld_tgt_count * sizeof(*uuidarray);
- data.ioc_inlbuf2 = (char *)uuidarray;
- data.ioc_inllen3 = desc.ld_tgt_count * sizeof(*obdgens);
- data.ioc_inlbuf3 = (char *)obdgens;
-
- if (llapi_ioctl_pack(&data, &buf, sizeof(rawbuf))) {
- fprintf(stderr, "error: %s: invalid ioctl\n",
- jt_cmdname(argv[0]));
- rc = -EINVAL;
- goto out_obdgens;
- }
- rc = ioctl(fd, OBD_IOC_LOV_GET_CONFIG, buf);
- if (rc == -ENOSPC) {
- free(uuidarray);
- free(obdgens);
- goto repeat;
- } else if (rc) {
- fprintf(stderr, "error: %s: ioctl error: %s\n",
- jt_cmdname(argv[0]), strerror(rc = errno));
- } else {
- struct obd_uuid *uuidp;
- __u32 *genp;
- int i;
-
- if (llapi_ioctl_unpack(&data, buf, sizeof(rawbuf))) {
- fprintf(stderr, "error: %s: invalid reply\n",
- jt_cmdname(argv[0]));
- rc = -EINVAL;
- goto out;
- }
- if (desc.ld_default_stripe_count == (__u32)-1)
- printf("default_stripe_count: %d\n", -1);
- else
- printf("default_stripe_count: %u\n",
- desc.ld_default_stripe_count);
- printf("default_stripe_size: %ju\n",
- (uintmax_t)desc.ld_default_stripe_size);
- printf("default_stripe_offset: %jd\n",
- (uintmax_t)desc.ld_default_stripe_offset);
- printf("default_stripe_pattern: %u\n", desc.ld_pattern);
- printf("obd_count: %u\n", desc.ld_tgt_count);
- printf("OBDS:\tobdidx\t\tobdgen\t\t obduuid\n");
- uuidp = uuidarray;
- genp = obdgens;
- for (i = 0; i < desc.ld_tgt_count; i++, uuidp++, genp++)
- printf("\t%6u\t%14u\t\t %s\n", i, *genp, (char *)uuidp);
- }
-out_obdgens:
- free(obdgens);
-out_uuidarray:
- free(uuidarray);
-out:
- close(fd);
- return rc;
-}
-
static int do_activate(int argc, char **argv, int flag)
{
struct obd_ioctl_data data;
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 = l_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);
return rc;
}
+#ifdef HAVE_SERVER_SUPPORT
+/**
+ * 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 = l_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_lcfg_fork(int argc, char **argv)
{
struct obd_ioctl_data data;
return rc;
}
+#else /* !HAVE_SERVER_SUPPORT */
+int jt_lcfg_clear(int argc, char **argv)
+{
+ if (argc != 2)
+ return CMD_HELP;
+
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_lcfg_fork(int argc, char **argv)
+{
+ if (argc != 3)
+ return CMD_HELP;
+
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_lcfg_erase(int argc, char **argv)
+{
+ if (argc != 3)
+ return CMD_HELP;
+
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+#endif /* HAVE_SERVER_SUPPORT */
+
+enum llog_default_dev_op {
+ LLOG_DFLT_MGS_SET = 0,
+ LLOG_DFLT_DEV_RESET
+};
+
+static int llog_default_device(enum llog_default_dev_op op)
+{
+ int rc = 0;
+ static int dflt_dev = -1;
+
+ if (op == LLOG_DFLT_MGS_SET && (cur_device == -1)) {
+ char mgs[] = "$MGS";
+
+ rc = do_device("llog_default_device", mgs);
+ dflt_dev = cur_device;
+
+ } else if (op == LLOG_DFLT_DEV_RESET && (dflt_dev != -1)) {
+ do_disconnect(NULL, 1);
+ dflt_dev = -1;
+ }
+
+ return rc;
+}
int jt_llog_catlist(int argc, char **argv)
{
if (argc != 1)
return CMD_HELP;
+ if (llog_default_device(LLOG_DFLT_MGS_SET))
+ return CMD_INCOMPLETE;
+
do {
memset(&data, 0, sizeof(data));
data.ioc_dev = cur_device;
if (rc) {
fprintf(stderr, "error: %s: invalid ioctl\n",
jt_cmdname(argv[0]));
- return rc;
+ goto err;
}
rc = l_ioctl(OBD_DEV_ID, OBD_IOC_CATLOGLIST, buf);
if (rc < 0)
fprintf(stderr, "OBD_IOC_CATLOGLIST failed: %s\n",
strerror(errno));
+err:
+ llog_default_device(LLOG_DFLT_DEV_RESET);
+
return rc;
}
return CMD_HELP;
}
+ /* Manage default device */
+ if (llog_default_device(LLOG_DFLT_MGS_SET))
+ return CMD_INCOMPLETE;
+
data.ioc_dev = cur_device;
data.ioc_inllen1 = strlen(catalog) + 1;
data.ioc_inlbuf1 = catalog;
if (rc) {
fprintf(stderr, "%s: ioctl_pack failed for catalog '%s': %s\n",
jt_cmdname(cmd), catalog, strerror(-rc));
- return rc;
+ goto err;
}
rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_INFO, buf);
fprintf(stderr, "%s: OBD_IOC_LLOG_INFO failed: %s\n",
jt_cmdname(cmd), strerror(errno));
+err:
+ llog_default_device(LLOG_DFLT_DEV_RESET);
+
return rc;
}
if (*argc >= 1) {
if (*catalog) {
fprintf(stderr,
- "%s: catalog is set, unknown argument '%s'\n",
+ "%s: logname is set, unknown argument '%s'\n",
cmd, (*argv)[0]);
return CMD_HELP;
}
(*argv)++;
}
+ if (*catalog == NULL) {
+ fprintf(stderr, "%s: no logname specified\n", cmd);
+ return CMD_HELP;
+ }
+
if (*argc >= 1) {
if (*start != 1) {
fprintf(stderr,
if (rc)
return rc;
+ if (llog_default_device(LLOG_DFLT_MGS_SET))
+ return CMD_INCOMPLETE;
+
rc = jt_llog_print_iter(catalog, start, end, jt_llog_print_cb,
NULL, false);
+ llog_default_device(LLOG_DFLT_DEV_RESET);
+
return rc;
}
char *cmd = argv[0];
int rc;
+ /* Manage default device */
+ if (llog_default_device(LLOG_DFLT_MGS_SET))
+ return CMD_INCOMPLETE;
+
/* Parse catalog file (in inlbuf1) and named parameters */
rc = llog_parse_catalog_log_idx(&argc, &argv, "c:hi:l:", 3, &data);
data.ioc_inlbuf3 = argv[1];
}
- if (!data.ioc_inlbuf1 || !data.ioc_inlbuf3)
+ if (!data.ioc_inlbuf1 || !data.ioc_inlbuf3) {
/* missing mandatory parameters */
- return CMD_HELP;
+ rc = CMD_HELP;
+ goto err;
+ }
rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf));
if (rc) {
fprintf(stderr, "%s: ioctl_pack for catalog '%s' failed: %s\n",
jt_cmdname(cmd), data.ioc_inlbuf1, strerror(-rc));
- return rc;
+ goto err;
}
rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_CANCEL, buf);
jt_cmdname(cmd), data.ioc_inlbuf1, data.ioc_inlbuf3,
strerror(errno));
+err:
+ llog_default_device(LLOG_DFLT_DEV_RESET);
return rc;
}
if (rc)
return rc;
+ if (llog_default_device(LLOG_DFLT_MGS_SET))
+ return CMD_INCOMPLETE;
+
if (end == -1)
end = 0x7fffffff;
if (rc) {
fprintf(stderr, "%s: ioctl_pack failed for catalog '%s': %s\n",
jt_cmdname(cmd), data.ioc_inlbuf1, strerror(-rc));
- return rc;
+ goto err;
}
rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_CHECK, buf);
else
fprintf(stderr, "%s: OBD_IOC_LLOG_CHECK failed: %s\n",
jt_cmdname(cmd), strerror(errno));
+err:
+ llog_default_device(LLOG_DFLT_DEV_RESET);
return rc;
}
char *cmd = argv[0];
int rc;
+ if (llog_default_device(LLOG_DFLT_MGS_SET))
+ return CMD_INCOMPLETE;
+
rc = llog_parse_catalog_log_idx(&argc, &argv, "c:hl:", 2, &data);
if (rc)
- return rc;
+ goto err;
if (argc == 1) {
if (data.ioc_inlbuf2) {
fprintf(stderr,
"%s: --log_id is set, unknown argument '%s'\n",
jt_cmdname(cmd), argv[0]);
- return CMD_HELP;
+ rc = CMD_HELP;
+ goto err;
}
data.ioc_inllen2 = strlen(argv[0]) + 1;
data.ioc_inlbuf2 = argv[0];
}
+
rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf));
if (rc) {
fprintf(stderr, "%s: ioctl_pack for catalog '%s' failed: %s\n",
jt_cmdname(cmd), data.ioc_inlbuf1, strerror(-rc));
- return rc;
+ goto err;
}
rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_REMOVE, buf);
jt_cmdname(cmd), data.ioc_inlbuf1, data.ioc_inlbuf2,
strerror(-rc));
+err:
+ llog_default_device(LLOG_DFLT_DEV_RESET);
return rc;
}
return rc;
}
+#ifdef HAVE_SERVER_SUPPORT
/**
* Format and send the ioctl to the MGS.
*
return rc;
}
+#else /* !HAVE_SERVER_SUPPORT */
+int jt_nodemap_activate(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_add(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_del(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_modify(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_add_range(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_test_nid(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_del_range(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_add_idmap(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_del_idmap(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_test_id(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_set_fileset(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_set_sepol(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_nodemap_info(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+#endif /* HAVE_SERVER_SUPPORT */
/*
* this function tranforms a rule [start-end/step] into an array
for (j = 0; j < array_sz; j++) {
char ostname[MAX_OBD_NAME + 1];
+ int rc2;
snprintf(ostname, MAX_OBD_NAME, format,
array[j]);
ostname[MAX_OBD_NAME] = '\0';
- rc = check_and_complete_ostname(fsname,
+ rc2 = check_and_complete_ostname(fsname,
ostname);
- if (rc) {
+ if (rc2) {
free(array);
free(cmds);
if (ostnames_buf)
free(ostnames_buf);
+ rc = rc ? rc : rc2;
goto out;
}
if (ostnames_buf) {
return 0;
}
+#ifdef HAVE_SERVER_SUPPORT
int jt_changelog_register(int argc, char **argv)
{
struct obd_ioctl_data data = { 0 };
return 0;
}
+#else /* !HAVE_SERVER_SUPPORT */
+int jt_changelog_register(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+
+int jt_changelog_deregister(int argc, char **argv)
+{
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return -EOPNOTSUPP;
+}
+#endif /* HAVE_SERVER_SUPPORT */
int jt_pcc_add(int argc, char **argv)
{