#include <linux/lustre_idl.h>
#include <linux/lustre_dlm.h>
#include <linux/obd.h> /* for struct lov_stripe_md */
-#include <linux/obd_lov.h> /* for IOC_LOV_SET_OSC_ACTIVE */
#include <linux/lustre_build_version.h>
#include <unistd.h>
#include <sys/un.h>
#include <time.h>
#include <sys/time.h>
-#include <netinet/in.h>
#include <errno.h>
#include <string.h>
struct timeval prev_time;
#endif
-uint64_t conn_addr = -1;
-uint64_t conn_cookie;
+uint64_t conn_cookie = -1;
char rawbuf[8192];
char *buf = rawbuf;
int max = sizeof(rawbuf);
#define IOC_INIT(data) \
do { \
memset(&data, 0, sizeof(data)); \
- data.ioc_addr = conn_addr; \
data.ioc_cookie = conn_cookie; \
} while (0)
IOC_PACK(func, data);
rc = l_ioctl(OBD_DEV_ID, OBD_IOC_NAME2DEV, buf);
- if (rc < 0) {
- fprintf(stderr, "error: %s: %s - %s\n", cmdname(func),
- name, strerror(rc = errno));
- return rc;
- }
+ if (rc < 0)
+ return errno;
IOC_UNPACK(func, data);
return data.ioc_dev + N2D_OFF;
/*
* resolve a device name to a device number.
- * supports a number or name.
- * FIXME: support UUID
+ * supports a number, $name or %uuid.
*/
static int parse_devname(char *func, char *name)
{
if (!name)
return ret;
- if (name[0] == '$') {
- rc = do_name2dev(func, name + 1);
+ if (name[0] == '$' || name[0] == '%') {
+ name++;
+ rc = do_name2dev(func, name);
if (rc >= N2D_OFF) {
ret = rc - N2D_OFF;
- printf("%s is device %d\n", name, ret);
+ printf("Name %s is device %d\n", name, ret);
} else {
- fprintf(stderr, "error: %s: %s: %s\n", cmdname(func),
- name, "device not found");
+ printf("No device found for name %s: %s\n",
+ name, strerror(rc));
}
- } else
+ } else {
+ /* Assume it's a number. This means that bogus strings become
+ * 0. I might care about that some day. */
ret = strtoul(name, NULL, 0);
+ printf("Selected device %d\n", ret);
+ }
return ret;
}
int rc;
struct obd_ioctl_data data;
- if (conn_addr == -1)
+ if (conn_cookie == -1)
return 0;
IOC_INIT(data);
} else {
if (verbose)
printf("%s: disconnected conn "LPX64"\n", cmdname(func),
- conn_addr);
- conn_addr = -1;
+ conn_cookie);
+ conn_cookie = -1;
}
return rc;
if (rc < 0)
fprintf(stderr, "error: %s: OBD_IOC_CONNECT %s\n",
cmdname(argv[0]), strerror(rc = errno));
- else {
- conn_addr = data.ioc_addr;
+ else
conn_cookie = data.ioc_cookie;
- }
return rc;
}
if (argc != 1)
return CMD_HELP;
- if (conn_addr == -1)
+ if (conn_cookie == -1)
return 0;
return do_disconnect(argv[0], 0);
return rc;
}
+int jt_opt_net(int argc, char **argv)
+{
+ char *arg2[3];
+ int rc;
+
+ if (argc < 3)
+ return CMD_HELP;
+
+ arg2[0] = argv[0];
+ arg2[1] = argv[1];
+ arg2[2] = NULL;
+ rc = jt_ptl_network (2, arg2);
+
+ if (!rc)
+ rc = Parser_execarg(argc - 2, argv + 2, cmdlist);
+
+ return rc;
+}
+
int jt_obd_detach(int argc, char **argv)
{
struct obd_ioctl_data data;
{
struct obd_ioctl_data data;
char force = 'F';
+ char failover = 'A';
+ char flags[3];
+ int flag_cnt = 0, n;
int rc;
IOC_INIT(data);
- if (argc != 1 && argc != 2)
+ if (argc < 1 || argc > 3)
return CMD_HELP;
- if (argc == 2) {
- if (strcmp(argv[1], "force"))
+ for (n = 1; n < argc; n++)
+ if (strcmp(argv[n], "force") == 0) {
+ flags[flag_cnt++] = force;
+ } else if (strcmp(argv[n], "failover") == 0) {
+ flags[flag_cnt++] = failover;
+ } else {
+ fprintf(stderr, "unknown option: %s", argv[n]);
return CMD_HELP;
- data.ioc_inllen1 = 1;
- data.ioc_inlbuf1 = &force;
- }
+ }
+
+ data.ioc_inllen1 = flag_cnt;
+ if (flag_cnt)
+ data.ioc_inlbuf1 = flags;
IOC_PACK(argv[0], data);
rc = l_ioctl(OBD_DEV_ID, OBD_IOC_CLEANUP, buf);
return rc;
}
+int jt_obd_abort_recovery(int argc, char **argv)
+{
+ struct obd_ioctl_data data;
+ int rc;
+
+ IOC_INIT(data);
+
+ if (argc != 1)
+ return CMD_HELP;
+
+ IOC_PACK(argv[0], data);
+ rc = l_ioctl(OBD_DEV_ID, OBD_IOC_ABORT_RECOVERY, buf);
+ if (rc < 0)
+ fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]),
+ strerror(rc = errno));
+
+ return rc;
+}
+
int jt_obd_newdev(int argc, char **argv)
{
int rc;
return rc;
}
+int jt_obd_mount_option(int argc, char **argv)
+{
+ int rc;
+ struct obd_ioctl_data data;
+
+ IOC_INIT(data);
+
+ if (argc != 2)
+ return CMD_HELP;
+
+ data.ioc_inllen1 = strlen(argv[1]) + 1;
+ data.ioc_inlbuf1 = argv[1];
+
+ IOC_PACK(argv[0], data);
+ rc = l_ioctl(OBD_DEV_ID, OBD_IOC_MOUNTOPT, buf);
+ if (rc < 0) {
+ fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]),
+ strerror(rc = errno));
+ }
+
+ return rc;
+}
+
int jt_get_version(int argc, char **argv)
{
int rc;
memset(buf, 0, sizeof(buf));
data->ioc_version = OBD_IOCTL_VERSION;
- data->ioc_addr = conn_addr;
- data->ioc_cookie = conn_addr;
+ data->ioc_cookie = conn_cookie;
data->ioc_inllen1 = sizeof(buf) - size_round(sizeof(*data));
data->ioc_len = obd_ioctl_packlen(data);
memset(buf, 0, sizeof(buf));
data->ioc_version = OBD_IOCTL_VERSION;
- data->ioc_addr = conn_addr;
- data->ioc_cookie = conn_addr;
+ data->ioc_cookie = conn_cookie;
data->ioc_inllen1 = sizeof(buf) - size_round(sizeof(*data));
data->ioc_len = obd_ioctl_packlen(data);
return rc;
}
-int jt_obd_name2dev(int argc, char **argv)
-{
- int rc;
-
- if (argc != 2)
- return CMD_HELP;
-
- rc = do_name2dev(argv[0], argv[1]);
- if (rc >= N2D_OFF) {
- int dev = rc - N2D_OFF;
- rc = do_device(argv[0], dev);
- if (rc == 0)
- printf("%d\n", dev);
- }
- return rc;
-}
-
int jt_obd_setup(int argc, char **argv)
{
struct obd_ioctl_data data;
IOC_INIT(data);
- if (argc > 4)
+ if (argc > 5)
return CMD_HELP;
data.ioc_dev = -1;
data.ioc_inllen3 = strlen(argv[3]) + 1;
data.ioc_inlbuf3 = argv[3];
}
+ if (argc > 4) {
+ data.ioc_inllen4 = strlen(argv[4]) + 1;
+ data.ioc_inlbuf4 = argv[4];
+ }
IOC_PACK(argv[0], data);
rc = l_ioctl(OBD_DEV_ID, OBD_IOC_SETUP, buf);
if (argc != 2)
return CMD_HELP;
- id = strtoll (argv[1], &end, 0);
- if (*end == 0) {
+ id = strtoull (argv[1], &end, 0);
+ if (*end != 0) {
fprintf (stderr, "error: %s: invalid object id '%s'\n",
cmdname (argv[0]), argv[1]);
return CMD_HELP;
}
IOC_INIT (data);
- data.ioc_obdo1.o_id = lsm_buffer.lsm.lsm_object_id;
+ data.ioc_obdo1.o_id = id;
data.ioc_obdo1.o_mode = S_IFREG | 0644;
data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLMODE;
return (0);
}
-/* Create one or more objects, arg[1] may describe stripe meta-data. If
- * not, defaults assumed. This echo-client instances stashes the stripe
+/* Create one or more objects, arg[4] may describe stripe meta-data. If
+ * not, defaults assumed. This echo-client instance stashes the stripe
* object ids. Use get_stripe on this node to print full lsm and
* set_stripe on another node to cut/paste between nodes.
*/
return rc;
}
-int jt_obd_lov_set_osc_active(int argc, char **argv)
+static int do_activate(int argc, char **argv, int flag)
{
struct obd_ioctl_data data;
int rc;
IOC_INIT(data);
- if (argc != 3)
+ if (argc != 1)
return CMD_HELP;
- data.ioc_inlbuf1 = argv[1];
- data.ioc_inllen1 = strlen(argv[1]) + 1;
-
/* reuse offset for 'active' */
- data.ioc_offset = atoi(argv[2]);
+ data.ioc_offset = flag;
IOC_PACK(argv[0], data);
- rc = l_ioctl(OBD_DEV_ID, IOC_LOV_SET_OSC_ACTIVE, buf);
+ rc = l_ioctl(OBD_DEV_ID, IOC_OSC_SET_ACTIVE, buf);
if (rc)
fprintf(stderr, "error: %s: failed: %s\n",
cmdname(argv[0]), strerror(rc = errno));
return rc;
}
-int jt_obd_newconn(int argc, char **argv)
+int jt_obd_deactivate(int argc, char **argv)
{
- int rc;
- struct obd_ioctl_data data;
-
- IOC_INIT(data);
- if (argc < 2 || argc > 3)
- return CMD_HELP;
-
- data.ioc_inllen1 = strlen(argv[1]) + 1;
- data.ioc_inlbuf1 = argv[1];
-
- if (argc == 3) {
- data.ioc_inllen2 = strlen(argv[2]) + 1;
- data.ioc_inlbuf2 = argv[2];
- }
-
- IOC_PACK(argv[0], data);
- rc = l_ioctl(OBD_DEV_ID, OBD_IOC_RECOVD_NEWCONN, buf);
- if (rc < 0)
- fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]),
- strerror(rc = errno));
+ return do_activate(argc, argv, 0);
+}
- return rc;
+int jt_obd_activate(int argc, char **argv)
+{
+ return do_activate(argc, argv, 1);
}
-int jt_obd_failconn(int argc, char **argv)
+int jt_obd_recover(int argc, char **argv)
{
int rc;
struct obd_ioctl_data data;
IOC_INIT(data);
- if (argc < 2)
+ if (argc > 2)
return CMD_HELP;
- data.ioc_inllen1 = strlen(argv[1]) + 1;
- data.ioc_inlbuf1 = argv[1];
+ if (argc == 2) {
+ data.ioc_inllen1 = strlen(argv[1]) + 1;
+ data.ioc_inlbuf1 = argv[1];
+ }
IOC_PACK(argv[0], data);
- rc = l_ioctl(OBD_DEV_ID, OBD_IOC_RECOVD_FAILCONN, buf);
- if (rc < 0)
+ rc = l_ioctl(OBD_DEV_ID, OBD_IOC_CLIENT_RECOVER, buf);
+ if (rc < 0) {
fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]),
strerror(rc = errno));
+ }
return rc;
}
nal = ptl_name2nal(argv[3]);
- if (nal == 0) {
+ if (nal <= 0) {
fprintf (stderr, "Can't parse NAL %s\n", argv[3]);
return -1;
}
struct obd_ioctl_data data;
if (argc != 3) {
- fprintf(stderr, "usage: %s <uuid>\n", argv[0]);
+ fprintf(stderr, "usage: %s <uuid> <net-type>\n", argv[0]);
return 0;
}
nal = ptl_name2nal(argv[2]);
- if (nal == 0) {
+ if (nal <= 0) {
fprintf (stderr, "Can't parse NAL %s\n", argv[2]);
return -1;
}