]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Don't remove md devices with standard names.
authorNeilBrown <neilb@suse.de>
Tue, 31 Aug 2010 05:21:40 +0000 (15:21 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 31 Aug 2010 05:21:40 +0000 (15:21 +1000)
If udev is not in use, we create device in /dev when assembling
arrays and remove them when stopping the array.

However it may not always be correct to remove the device.  If
the array was started with kernel auto-detect, them mdadm didn't
create anything and so shouldn't remove anything.

We don't record whether we created things, so just don't remove
anything with a 'standard' name.  Only remove symlinks to the
standard name as we almost certainly created those.

Reported-by: Petre Rodan <petre.rodan@avira.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Manage.c

index 0b3a66ccda3d82273e875d2f97bc2dbfcd996f80..b39e1d9c42983061d628b9af55719d908a909cad 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -118,9 +118,11 @@ int Manage_ro(char *devname, int fd, int readonly)
 
 static void remove_devices(int devnum, char *path)
 {
-       /* Remove all 'standard' devices for 'devnum', including
-        * partitions.  Also remove names at 'path' - possibly with
-        * partition suffixes - which link to those names.
+       /* 
+        * Remove names at 'path' - possibly with
+        * partition suffixes - which link to the 'standard'
+        * name for devnum.  These were probably created
+        * by mdadm when the array was assembled.
         */
        char base[40];
        char *path2;
@@ -130,36 +132,32 @@ static void remove_devices(int devnum, char *path)
        char *be;
        char *pe;
 
+       if (!path)
+               return;
+
        if (devnum >= 0)
                sprintf(base, "/dev/md%d", devnum);
        else
                sprintf(base, "/dev/md_d%d", -1-devnum);
        be = base + strlen(base);
-       if (path) {
-               path2 = malloc(strlen(path)+20);
-               strcpy(path2, path);
-               pe = path2 + strlen(path2);
-       } else
-               path2 = path = NULL;
+
+       path2 = malloc(strlen(path)+20);
+       strcpy(path2, path);
+       pe = path2 + strlen(path2);
        
        for (part = 0; part < 16; part++) {
                if (part) {
                        sprintf(be, "p%d", part);
-                       if (path) {
-                               if (isdigit(pe[-1]))
-                                       sprintf(pe, "p%d", part);
-                               else
-                                       sprintf(pe, "%d", part);
-                       }
-               }
-               /* FIXME test if really is md device ?? */
-               unlink(base);
-               if (path) {
-                       n = readlink(path2, link, sizeof(link));
-                       if (n && (int)strlen(base) == n &&
-                           strncmp(link, base, n) == 0)
-                               unlink(path2);
+
+                       if (isdigit(pe[-1]))
+                               sprintf(pe, "p%d", part);
+                       else
+                               sprintf(pe, "%d", part);
                }
+               n = readlink(path2, link, sizeof(link));
+               if (n && (int)strlen(base) == n &&
+                   strncmp(link, base, n) == 0)
+                       unlink(path2);
        }
        free(path2);
 }