On Wed, 27 Jul 2011 14:30:35 -0400 Doug Ledford <dledford@xxxxxxxxxx> wrote: > The readd bug fix didn't work due to a faulty test. We need to check > raid_disks to get an upper bound of the found slots to check since > nr_disks only counts good disks and we could have faulty or spares that > aren't counted but amount to an occupied slot. > > Signed-off-by: Doug Ledford <dledford@xxxxxxxxxx> Sorry for late review. I don't agree with this patch. 'nr_disks' is exactly the number of devices in the mddev->disks list in the kernel. get_array_info() counts them. This includes failed and spare devices. When GET_DISK_INFO is used, these devices will return a meaningful major/minor and all others will return '0' for major and minor. So the code should work as is. Do you remember if you had a case where this failed? Can you describe it? Can you reproduce it? Thanks, NeilBrown --- mdadm-3.2.2/util.c.readd 2011-06-17 01:15:50.000000000 -0400 +++ mdadm-3.2.2/util.c 2011-07-18 14:43:40.776150946 -0400 @@ -364,19 +364,21 @@ int enough_fd(int fd) struct mdu_disk_info_s disk; int avail_disks = 0; int i; + int raid_disks; char *avail; if (ioctl(fd, GET_ARRAY_INFO, &array) != 0 || array.raid_disks <= 0) return 0; avail = calloc(array.raid_disks, 1); - for (i=0; i < 1024 && array.nr_disks > 0; i++) { + raid_disks = array.raid_disks; + for (i=0; i < 1024 && raid_disks > 0; i++) { disk.number = i; if (ioctl(fd, GET_DISK_INFO, &disk) != 0) continue; if (disk.major == 0 && disk.minor == 0) continue; - array.nr_disks--; + raid_disks--; if (! (disk.state & (1<<MD_DISK_SYNC))) continue;
Attachment:
signature.asc
Description: PGP signature