diff options
author | NeilBrown <neilb@suse.de> | 2010-08-31 15:21:40 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2010-08-31 15:21:40 +1000 |
commit | b1702f4826e29419fa368fe63dca38422a01fc7e (patch) | |
tree | 45a076f9c2d93182f478f3c2a13bd400ad641ca4 /Manage.c | |
parent | 6df6a774bff2fc6e2ab3f4092620ab7657c984aa (diff) |
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 <petre.rodan@avira.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Manage.c')
-rw-r--r-- | Manage.c | 44 |
1 files changed, 21 insertions, 23 deletions
@@ -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); } |