Avoid skipping devices where removing all faulty/detached devices.
When using 0.90 metadata, devices can be renumbered when earlier devices are removed. So when iterating all devices looking for 'failed' or 'detached' devices, we need to re-check the same slot we checked last time to see if maybe it has a different device now. Reported-by: Jim Paris <jim@jtan.com> Resolves-Debian-Bug: 587550 Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
7efa6bc34f
commit
b3b4e8a7a2
23
Manage.c
23
Manage.c
|
@ -376,6 +376,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stb.st_rdev = 0;
|
||||||
for (dv = devlist, j=0 ; dv; dv = next, j = jnext) {
|
for (dv = devlist, j=0 ; dv; dv = next, j = jnext) {
|
||||||
unsigned long long ldsize;
|
unsigned long long ldsize;
|
||||||
char dvname[20];
|
char dvname[20];
|
||||||
|
@ -394,6 +395,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
for (; j < array.raid_disks + array.nr_disks ; j++) {
|
for (; j < array.raid_disks + array.nr_disks ; j++) {
|
||||||
|
int dev;
|
||||||
disc.number = j;
|
disc.number = j;
|
||||||
if (ioctl(fd, GET_DISK_INFO, &disc))
|
if (ioctl(fd, GET_DISK_INFO, &disc))
|
||||||
continue;
|
continue;
|
||||||
|
@ -401,9 +403,15 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
continue;
|
continue;
|
||||||
if ((disc.state & 1) == 0) /* faulty */
|
if ((disc.state & 1) == 0) /* faulty */
|
||||||
continue;
|
continue;
|
||||||
stb.st_rdev = makedev(disc.major, disc.minor);
|
dev = makedev(disc.major, disc.minor);
|
||||||
|
if (stb.st_rdev == dev)
|
||||||
|
/* already did that one */
|
||||||
|
continue;
|
||||||
|
stb.st_rdev = dev;
|
||||||
next = dv;
|
next = dv;
|
||||||
jnext = j+1;
|
/* same slot again next time - things might
|
||||||
|
* have reshuffled */
|
||||||
|
jnext = j;
|
||||||
sprintf(dvname,"%d:%d", disc.major, disc.minor);
|
sprintf(dvname,"%d:%d", disc.major, disc.minor);
|
||||||
dnprintable = dvname;
|
dnprintable = dvname;
|
||||||
break;
|
break;
|
||||||
|
@ -419,6 +427,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
}
|
}
|
||||||
for (; j < array.raid_disks + array.nr_disks; j++) {
|
for (; j < array.raid_disks + array.nr_disks; j++) {
|
||||||
int sfd;
|
int sfd;
|
||||||
|
int dev;
|
||||||
disc.number = j;
|
disc.number = j;
|
||||||
if (ioctl(fd, GET_DISK_INFO, &disc))
|
if (ioctl(fd, GET_DISK_INFO, &disc))
|
||||||
continue;
|
continue;
|
||||||
|
@ -435,9 +444,15 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
continue;
|
continue;
|
||||||
if (errno != ENXIO)
|
if (errno != ENXIO)
|
||||||
continue;
|
continue;
|
||||||
stb.st_rdev = makedev(disc.major, disc.minor);
|
dev = makedev(disc.major, disc.minor);
|
||||||
|
if (stb.st_rdev == dev)
|
||||||
|
/* already did that one */
|
||||||
|
continue;
|
||||||
|
stb.st_rdev = dev;
|
||||||
next = dv;
|
next = dv;
|
||||||
jnext = j+1;
|
/* same slot again next time - things might
|
||||||
|
* have reshuffled */
|
||||||
|
jnext = j;
|
||||||
dnprintable = dvname;
|
dnprintable = dvname;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue