X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Fobdctl.c;h=31fbfc3cc6d4a9bdac2b47e9b368f05f078e3a50;hb=2ad1df3c62663ce61e82856ebe4f576f751d617d;hp=56c758e765b223f723926f27e913e08287727050;hpb=a558cdbbad1a4e0991ad5c5a2dd5ac1e6fbd0809;p=fs%2Flustre-release.git diff --git a/lustre/utils/obdctl.c b/lustre/utils/obdctl.c index 56c758e..31fbfc3 100644 --- a/lustre/utils/obdctl.c +++ b/lustre/utils/obdctl.c @@ -134,7 +134,19 @@ static char *cmdname(char *func) return func; } -#define difftime(a, b) \ +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)) @@ -212,38 +224,41 @@ static int do_disconnect(char *func, int verbose) 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; } @@ -293,10 +308,7 @@ static int jt__device(int argc, char **argv) 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"; @@ -432,6 +444,32 @@ static int jt_cleanup(int argc, char **argv) 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; @@ -440,7 +478,8 @@ static int jt_attach(int argc, char **argv) IOCINIT(data); if (argc != 2 && argc != 3) { - fprintf(stderr, "usage: %s type [data]\n", cmdname(argv[0])); + fprintf(stderr, "usage: %s type [name [uuid]]\n", + cmdname(argv[0])); return -1; } @@ -451,23 +490,78 @@ static int jt_attach(int argc, char **argv) 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) fprintf(stderr, "error: %s: %x %s\n", cmdname(argv[0]), OBD_IOC_ATTACH, strerror(rc = errno)); + else if (argc == 3) { + char name[1024]; + if (strlen(argv[2]) > 128) { + printf("Name too long to set environment\n"); + return -EINVAL; + } + 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; +} + +#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 (getfd(func)) + return -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(func)); + return -2; + } + rc = ioctl(fd, OBD_IOC_NAME2DEV , buf); + if (rc < 0) { + fprintf(stderr, "error: %s: %s - %s\n", cmdname(func), + name, strerror(rc = errno)); + return rc; + } + + memcpy((char *)(&data), buf, sizeof(data)); + + 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; } @@ -484,30 +578,29 @@ static int jt_setup(int argc, char **argv) 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]), @@ -820,6 +913,25 @@ static int jt_test_ldlm(int argc, char **argv) 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 "}, @@ -827,7 +939,9 @@ command_t cmdlist[] = { "--threads "}, /* Device configuration commands */ - {"device", jt_device, 0, "set current device (args device no)"}, + {"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"}, {"setup", jt_setup, 0, "setup device (args: [data]"}, {"detach", jt_detach, 0, "detach the current device (arg: )"}, @@ -843,6 +957,7 @@ command_t cmdlist[] = { {"destroy", jt_destroy, 0, "destroy "}, {"getattr", jt_getattr, 0, "getattr "}, {"setattr", jt_setattr, 0, "setattr "}, + {"newconn", jt_newconn, 0, "newconn [newuuid]"}, {"test_getattr", jt_test_getattr, 0, "test_getattr [verbose]"}, {"test_brw", jt_test_brw, 0, "test_brw [write [verbose]]"}, {"test_ldlm", jt_test_ldlm, 0, "test lock manager (no args)"},