return func;
}
+int getfd(char *func)
+{
+ if (fd == -1)
+ fd = open("/dev/obd", O_RDWR);
+ if (fd == -1) {
+ fprintf(stderr, "error: %s: opening /dev/obd: %s\n",
+ cmdname(func), strerror(errno));
+ return -1;
+ }
+ return 0;
+}
+
#define difftime(a, b) \
((double)(a)->tv_sec - (b)->tv_sec + \
((double)((a)->tv_usec - (b)->tv_usec) / 1000000))
extern command_t cmdlist[];
-static int jt_device(int argc, char **argv)
+static int do_device(char *func, int dev)
{
struct obd_ioctl_data data;
- int rc;
-
- do_disconnect(argv[0], 1);
memset(&data, 0, sizeof(data));
- if ( argc != 2 ) {
- fprintf(stderr, "usage: %s devno\n", cmdname(argv[0]));
- return -1;
- }
- data.ioc_dev = strtoul(argv[1], NULL, 0);
+ data.ioc_dev = dev;
+
+ if (getfd(func))
+ return -1;
if (obd_ioctl_pack(&data, &buf, max)) {
- fprintf(stderr, "error: %s: invalid ioctl\n", cmdname(argv[0]));
+ fprintf(stderr, "error: %s: invalid ioctl\n", cmdname(func));
return -2;
}
- if (fd == -1)
- fd = open("/dev/obd", O_RDWR);
- if (fd == -1) {
- fprintf(stderr, "error: %s: opening /dev/obd: %s\n",
- cmdname(argv[0]), strerror(errno));
- return errno;
+ return ioctl(fd, OBD_IOC_DEVICE , buf);
+}
+
+static int jt_device(int argc, char **argv)
+{
+ int rc;
+
+ do_disconnect(argv[0], 1);
+
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s devno\n", cmdname(argv[0]));
+ return -1;
}
- rc = ioctl(fd, OBD_IOC_DEVICE , buf);
+ rc = do_device(argv[0], strtoul(argv[1], NULL, 0));
+
if (rc < 0)
- fprintf(stderr, "error: %s: %x %s\n", cmdname(argv[0]),
- OBD_IOC_DEVICE, strerror(rc = errno));
+ fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]),
+ strerror(rc = errno));
return rc;
}
return -1;
}
- arg2[0] = "device";
- arg2[1] = argv[1];
- arg2[2] = NULL;
- rc = jt_device(2, arg2);
+ rc = do_device("device", strtoul(argv[1], NULL, 0));
if (!rc) {
arg2[0] = "connect";
return rc;
}
+static int jt_newdev(int argc, char **argv)
+{
+ struct obd_ioctl_data data;
+ int rc;
+
+ if (getfd(argv[0]))
+ return -1;
+
+ IOCINIT(data);
+
+ if (argc != 1) {
+ fprintf(stderr, "usage: %s\n", cmdname(argv[0]));
+ return -1;
+ }
+
+ rc = ioctl(fd, OBD_IOC_NEWDEV , &data);
+ if (rc < 0)
+ fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]),
+ strerror(rc=errno));
+ else {
+ printf("Current device set to %d\n", data.ioc_dev);
+ }
+
+ return rc;
+}
+
static int jt_attach(int argc, char **argv)
{
struct obd_ioctl_data data;
IOCINIT(data);
if (argc != 2 && argc != 3) {
- fprintf(stderr, "usage: %s type [name [uuid]]\n", cmdname(argv[0]));
+ fprintf(stderr, "usage: %s type [name [uuid]]\n",
+ cmdname(argv[0]));
return -1;
}
data.ioc_inlbuf2 = argv[2];
}
- printf("%s: len %d addr %p type %s data %s\n",
- cmdname(argv[0]), data.ioc_len, buf,
- MKSTR(data.ioc_inlbuf1), MKSTR(data.ioc_inlbuf2));
-
if (obd_ioctl_pack(&data, &buf, max)) {
fprintf(stderr, "error: %s: invalid ioctl\n", cmdname(argv[0]));
return -2;
}
- printf("%s: len %d addr %p raw %p type %s data %s and %s\n",
- cmdname(argv[0]), data.ioc_len, buf, rawbuf,
- MKSTR(data.ioc_inlbuf1), MKSTR(data.ioc_inlbuf2), &buf[516]);
rc = ioctl(fd, OBD_IOC_ATTACH , buf);
if (rc < 0)
printf("Name too long to set environment\n");
return -EINVAL;
}
- snprintf(name, 512, "LUSTRE-dev-%s", argv[2]);
+ snprintf(name, 512, "LUSTRE_DEV_%s", argv[2]);
rc = setenv(name, argv[1], 1);
if (rc) {
printf("error setting env variable %s\n", name);
return rc;
}
-static int jt_name2dev(int argc, char **argv)
+#define N2D_OFF 0x100 /* So we can tell between error codes and devices */
+
+static int do_name2dev(char *func, char *name)
{
struct obd_ioctl_data data;
int rc;
- if (fd == -1)
- fd = open("/dev/obd", O_RDWR);
- if (fd == -1) {
- fprintf(stderr, "error: %s: opening /dev/obd: %s\n",
- cmdname(argv[0]), strerror(errno));
- return errno;
- }
-
- IOCINIT(data);
-
- if (argc != 2) {
- fprintf(stderr, "usage: %s name\n", cmdname(argv[0]));
+ if (getfd(func))
return -1;
- }
- data.ioc_inllen1 = strlen(argv[1]) + 1;
- data.ioc_inlbuf1 = argv[1];
+ IOCINIT(data);
+ data.ioc_inllen1 = strlen(name) + 1;
+ data.ioc_inlbuf1 = name;
if (obd_ioctl_pack(&data, &buf, max)) {
- fprintf(stderr, "error: %s: invalid ioctl\n", cmdname(argv[0]));
+ fprintf(stderr, "error: %s: invalid ioctl\n", cmdname(func));
return -2;
}
rc = ioctl(fd, OBD_IOC_NAME2DEV , buf);
- if (rc < 0)
- fprintf(stderr, "error: %s: %x %s\n", cmdname(argv[0]),
- OBD_IOC_NAME2DEV, strerror(rc = errno));
+ if (rc < 0) {
+ fprintf(stderr, "error: %s: %s - %s\n", cmdname(func),
+ name, strerror(rc = errno));
+ return rc;
+ }
+
memcpy((char *)(&data), buf, sizeof(data));
- printf("%d\n", data.ioc_dev);
+
+ return data.ioc_dev + N2D_OFF;
+}
+
+static int jt_name2dev(int argc, char **argv)
+{
+ int rc;
+
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s name\n", cmdname(argv[0]));
+ return -1;
+ }
+
+ 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;
}
return -1;
}
+ data.ioc_dev = -1;
if (argc > 1) {
- data.ioc_inllen1 = strlen(argv[1]) + 1;
+ if (argv[1][0] == '$') {
+ rc = do_name2dev(argv[0], argv[1] + 1);
+ if (rc >= N2D_OFF) {
+ printf("%s is device %d\n", argv[1],
+ rc - N2D_OFF);
+ data.ioc_dev = rc - N2D_OFF;
+ }
+ } else
+ data.ioc_dev = strtoul(argv[1], NULL, 0);
+ data.ioc_inllen1 = strlen(argv[1]) + 1;
data.ioc_inlbuf1 = argv[1];
- data.ioc_dev = strtoul(argv[1], NULL, 0);
- } else {
- data.ioc_dev = -1;
}
if ( argc == 3 ) {
data.ioc_inllen2 = strlen(argv[2]) + 1;
data.ioc_inlbuf2 = argv[2];
}
- printf("%s: len %d addr %p device %s type %s\n",
- cmdname(argv[0]), data.ioc_len, buf,
- MKSTR(data.ioc_inlbuf1), MKSTR(data.ioc_inlbuf2));
-
if (obd_ioctl_pack(&data, &buf, max)) {
fprintf(stderr, "error: %s: invalid ioctl\n", cmdname(argv[0]));
return -2;
}
- printf("%s: len %d addr %p raw %p device %s type %s\n",
- cmdname(argv[0]), data.ioc_len, buf, rawbuf,
- MKSTR(data.ioc_inlbuf1), MKSTR(data.ioc_inlbuf2));
-
rc = ioctl(fd, OBD_IOC_SETUP , buf);
if (rc < 0)
fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]),
return rc;
}
+static int jt_newconn(int argc, char **argv)
+{
+ struct obd_ioctl_data data;
+ int rc;
+
+ IOCINIT(data);
+ if (argc != 1) {
+ fprintf(stderr, "usage: %s\n", cmdname(argv[0]));
+ return -1;
+ }
+
+ rc = ioctl(fd, OBD_RECOVD_NEWCONN , &data);
+ if (rc < 0)
+ fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]),
+ strerror(rc = errno));
+
+ return rc;
+}
+
command_t cmdlist[] = {
/* Metacommands */
{"--device", jt__device, 0, "--device <devno> <command [args ...]>"},
"--threads <threads> <devno> <command [args ...]>"},
/* Device configuration commands */
+ {"newdev", jt_newdev, 0, "set device to a new unused obd (no args)"},
{"device", jt_device, 0, "set current device (args device_no name)"},
{"name2dev", jt_name2dev, 0, "set device by name (args name)"},
{"attach", jt_attach, 0, "name the type of device (args: type data"},
{"destroy", jt_destroy, 0, "destroy <id>"},
{"getattr", jt_getattr, 0, "getattr <id>"},
{"setattr", jt_setattr, 0, "setattr <id> <mode>"},
+ {"newconn", jt_newconn, 0, "newconn [newuuid]"},
{"test_getattr", jt_test_getattr, 0, "test_getattr <count> [verbose]"},
{"test_brw", jt_test_brw, 0, "test_brw <count> [write [verbose]]"},
{"test_ldlm", jt_test_ldlm, 0, "test lock manager (no args)"},