]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
mdopen: fix up name parsing.
authorNeilBrown <neilb@suse.de>
Tue, 4 Nov 2008 09:50:39 +0000 (20:50 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 4 Nov 2008 09:50:39 +0000 (20:50 +1100)
I think this is closer to what I want.  Fewer surprises anyway.

mdopen.c

index ae3620a56e36cf8636a0624e916398d783938792..b08c49f74b918d01db0631688b283a403f9dca9b 100644 (file)
--- a/mdopen.c
+++ b/mdopen.c
@@ -180,25 +180,40 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
                                use_mdp = 0;
                        else
                                use_mdp = 1;
+                       /* recreate name: /dev/md/0 or /dev/md/d0 */
+                       sprintf(cname, "%s%d", use_mdp?"d":"", num);
                } else
                        strcpy(cname, dev);
 
-               /* 'cname' must not contain a slash, may not start or end 
-                * with a digit, and may only be empty if num is present.
+               /* 'cname' must not contain a slash, and may not be
+                * empty.
                 */
-               if (strchr(cname, '/') != NULL ||
-                   isdigit(cname[0]) ||
-                   (cname[0] && isdigit(cname[strlen(cname)]))
-                       ) {
+               if (strchr(cname, '/') != NULL) {
                        fprintf(stderr, Name ": %s is an invalid name "
                                "for an md device.\n", dev);
                        return -1;
                }
-               if (cname[0] == 0 && num < 0) {
+               if (cname[0] == 0) {
                        fprintf(stderr, Name ": %s is an invalid name "
                                "for an md device (empty!).", dev);
                        return -1;
                }
+               if (num < 0) {
+                       /* If cname  is 'N' or 'dN', we get dev number
+                        * from there.
+                        */
+                       char *sp = cname;
+                       char *ep;
+                       if (cname[0] == 'd')
+                               sp++;
+                       num = strtoul(sp, &ep, 10);
+                       if (ep == sp || *ep || num < 0)
+                               num = -1;
+                       else if (cname[0] == 'd')
+                               use_mdp = 1;
+                       else
+                               use_mdp = 0;
+               }
        }
 
        /* Now determine device number */
@@ -271,8 +286,8 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
                strcpy(chosen, devname);
 
        /* We have a device number and name.
-        * If we can detect udev, just open the device and we
-        * are done.
+        * If we cannot detect udev, we need to make
+        * devices and links ourselves.
         */
        if (stat("/dev/.udev", &stb) != 0 ||
            check_env("MDADM_NO_UDEV")) {