Whamcloud - gitweb
- documentation update for MDS recovery
[fs/lustre-release.git] / lustre / utils / obdctl.c
index b9f1289..31fbfc3 100644 (file)
@@ -134,6 +134,18 @@ static char *cmdname(char *func)
         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))
@@ -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 [name [uuid]]\n", cmdname(argv[0]));
+                fprintf(stderr, "usage: %s type [name [uuid]]\n",
+                        cmdname(argv[0]));
                 return -1;
         }
 
@@ -466,7 +505,7 @@ static int jt_attach(int argc, char **argv)
                         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); 
@@ -476,40 +515,53 @@ static int jt_attach(int argc, char **argv)
         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;
 }
 
@@ -526,12 +578,19 @@ 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;
@@ -854,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 ...]>"},
@@ -861,6 +939,7 @@ command_t cmdlist[] = {
                 "--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"},
@@ -878,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)"},