summaryrefslogtreecommitdiffstats
path: root/Manage.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2011-05-23 17:21:35 +1000
committerNeilBrown <neilb@suse.de>2011-05-23 17:21:35 +1000
commit9e6d9291275267d3fd4b6d85d7232081f89cd8e2 (patch)
tree2536ecb26b6fd0ad3d9c311d58f475b3c524c988 /Manage.c
parentf4db7a6f3c3b9a0701f3063b287b7cb59ccecd07 (diff)
downloadmdadm-9e6d9291275267d3fd4b6d85d7232081f89cd8e2.tar.gz
Check all member devices in enough_fd
The loop over all member devices in enough_fd could easily stop before it had found all devices. This would cause --re-add to fail incorrectly. So change the loop to be based on the reported number of devices in the device - with a safe-guard limit of 1024. Change some other loops to be more careful too. Reported-by: "Schmidt, Annemarie" <Annemarie.Schmidt@stratus.com> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Manage.c')
-rw-r--r--Manage.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/Manage.c b/Manage.c
index 0e54bc77..66d69780 100644
--- a/Manage.c
+++ b/Manage.c
@@ -438,19 +438,21 @@ int Manage_subdevs(char *devname, int fd,
if (strcmp(dv->devname, "failed")==0 ||
strcmp(dv->devname, "faulty")==0) {
+ int remaining_disks = array.nr_disks;
if (dv->disposition != 'r') {
fprintf(stderr, Name ": %s only meaningful "
"with -r, not -%c\n",
dv->devname, dv->disposition);
return 1;
}
- for (; j < array.raid_disks + array.nr_disks ; j++) {
+ for (; j < 1024 && remaining_disks > 0; j++) {
unsigned dev;
disc.number = j;
if (ioctl(fd, GET_DISK_INFO, &disc))
continue;
if (disc.major == 0 && disc.minor == 0)
continue;
+ remaining_disks --;
if ((disc.state & 1) == 0) /* faulty */
continue;
dev = makedev(disc.major, disc.minor);
@@ -469,13 +471,14 @@ int Manage_subdevs(char *devname, int fd,
if (next != dv)
continue;
} else if (strcmp(dv->devname, "detached") == 0) {
+ int remaining_disks = array.nr_disks;
if (dv->disposition != 'r' && dv->disposition != 'f') {
fprintf(stderr, Name ": %s only meaningful "
"with -r of -f, not -%c\n",
dv->devname, dv->disposition);
return 1;
}
- for (; j < array.raid_disks + array.nr_disks; j++) {
+ for (; j < 1024 && remaining_disks > 0; j++) {
int sfd;
unsigned dev;
disc.number = j;
@@ -483,6 +486,7 @@ int Manage_subdevs(char *devname, int fd,
continue;
if (disc.major == 0 && disc.minor == 0)
continue;
+ remaining_disks --;
sprintf(dvname,"%d:%d", disc.major, disc.minor);
sfd = dev_open(dvname, O_RDONLY);
if (sfd >= 0) {