summaryrefslogtreecommitdiffstats
path: root/mapfile.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2008-11-04 21:56:42 +1100
committerNeilBrown <neilb@suse.de>2008-11-04 21:56:42 +1100
commit195254b87a0cb24fc2868d3c54014bf8399222a0 (patch)
treebfbb677607441d5eba20b32a557c452177e6cd60 /mapfile.c
parenta7d307da935631f8b9f7bbae16db297d30dc21b9 (diff)
downloadmdadm-195254b87a0cb24fc2868d3c54014bf8399222a0.tar.gz
mdadm-195254b87a0cb24fc2868d3c54014bf8399222a0.tar.xz
mdadm-195254b87a0cb24fc2868d3c54014bf8399222a0.zip
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 <neilb@suse.de>
Diffstat (limited to 'mapfile.c')
-rw-r--r--mapfile.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/mapfile.c b/mapfile.c
index 6169d52..89836cf 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;
}