From 195254b87a0cb24fc2868d3c54014bf8399222a0 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 4 Nov 2008 21:56:42 +1100 Subject: [PATCH] mapfile: validate entries before they are returned. It is possible for the mapfile to become wrong, and that gets very confusing. So validate entries before returning them. Signed-off-by: NeilBrown --- mapfile.c | 39 +++++++++++++++++++++++++++++---------- mdadm.h | 1 + 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/mapfile.c b/mapfile.c index 6169d523..89836cf1 100644 --- a/mapfile.c +++ b/mapfile.c @@ -57,7 +57,9 @@ int map_write(struct map_ent *mel) } if (!f) return 0; - while (mel) { + for (; mel; mel = mel->next) { + if (mel->bad) + continue; if (mel->devnum < 0) fprintf(f, "mdp%d ", -1-mel->devnum); else @@ -66,7 +68,6 @@ int map_write(struct map_ent *mel) fprintf(f, "%08x:%08x:%08x:%08x ", mel->uuid[0], mel->uuid[1], mel->uuid[2], mel->uuid[3]); fprintf(f, "%s\n", mel->path); - mel = mel->next; } fflush(f); err = ferror(f); @@ -133,6 +134,7 @@ void map_add(struct map_ent **melp, memcpy(me->uuid, uuid, 16); me->path = strdup(path); me->next = *melp; + me->bad = 0; *melp = me; } @@ -228,9 +230,15 @@ struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4]) if (!*map) map_read(map); - for (mp = *map ; mp ; mp = mp->next) - if (memcmp(uuid, mp->uuid, 16) == 0) - return mp; + for (mp = *map ; mp ; mp = mp->next) { + if (memcmp(uuid, mp->uuid, 16) != 0) + continue; + if (!mddev_busy(mp->devnum)) { + mp->bad = 1; + continue; + } + return mp; + } return NULL; } @@ -240,9 +248,15 @@ struct map_ent *map_by_devnum(struct map_ent **map, int devnum) if (!*map) map_read(map); - for (mp = *map ; mp ; mp = mp->next) - if (mp->devnum == devnum) - return mp; + for (mp = *map ; mp ; mp = mp->next) { + if (mp->devnum != devnum) + continue; + if (!mddev_busy(mp->devnum)) { + mp->bad = 1; + continue; + } + return mp; + } return NULL; } @@ -255,8 +269,13 @@ struct map_ent *map_by_name(struct map_ent **map, char *name) for (mp = *map ; mp ; mp = mp->next) { if (strncmp(mp->path, "/dev/md/", 8) != 0) continue; - if (strcmp(mp->path+8, name) == 0) - return mp; + if (strcmp(mp->path+8, name) != 0) + continue; + if (!mddev_busy(mp->devnum)) { + mp->bad = 1; + continue; + } + return mp; } return NULL; } diff --git a/mdadm.h b/mdadm.h index af0f9e8e..35c1e95d 100644 --- a/mdadm.h +++ b/mdadm.h @@ -315,6 +315,7 @@ struct map_ent { int devnum; char metadata[20]; int uuid[4]; + int bad; char *path; }; extern int map_update(struct map_ent **mpp, int devnum, char *metadata, -- 2.39.2