Whamcloud - gitweb
- documentation update for MDS recovery
[fs/lustre-release.git] / lustre / utils / obdctl.c
index 56c758e..31fbfc3 100644 (file)
@@ -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 <devno> <command [args ...]>"},
@@ -827,7 +939,9 @@ command_t cmdlist[] = {
                 "--threads <threads> <devno> <command [args ...]>"},
 
         /* 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: <blkdev> [data]"},
         {"detach", jt_detach, 0, "detach the current device (arg: )"},
@@ -843,6 +957,7 @@ command_t cmdlist[] = {
         {"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)"},