summaryrefslogtreecommitdiff
path: root/Manage.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-08-31 15:21:40 +1000
committerNeilBrown <neilb@suse.de>2010-08-31 15:21:40 +1000
commitb1702f4826e29419fa368fe63dca38422a01fc7e (patch)
tree45a076f9c2d93182f478f3c2a13bd400ad641ca4 /Manage.c
parent6df6a774bff2fc6e2ab3f4092620ab7657c984aa (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.c44
1 files changed, 21 insertions, 23 deletions
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);
}