From: NeilBrown Date: Tue, 31 Aug 2010 05:21:40 +0000 (+1000) Subject: Don't remove md devices with standard names. X-Git-Tag: mdadm-3.1.4~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b1702f4826e29419fa368fe63dca38422a01fc7e;p=thirdparty%2Fmdadm.git Don't remove md devices with standard names. 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 Signed-off-by: NeilBrown --- diff --git a/Manage.c b/Manage.c index 0b3a66cc..b39e1d9c 100644 --- 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); }