*/
struct mdinfo i;
} *devices;
+ char *devmap;
int *best = NULL; /* indexed by raid_disk */
int bestcnt = 0;
int devcnt = 0;
bitmap_done = 0;
content->update_private = NULL;
devices = malloc(num_devs * sizeof(*devices));
+ devmap = calloc(num_devs * content->array.raid_disks, 1);
for (tmpdev = devlist; tmpdev; tmpdev=tmpdev->next) if (tmpdev->used == 1) {
char *devname = tmpdev->devname;
struct stat stb;
close(dfd);
close(mdfd);
free(devices);
+ free(devmap);
return 1;
}
- tst->ss->getinfo_super(tst, content, NULL);
+ tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
memcpy(content->uuid, ident->uuid, 16);
strcpy(content->name, ident->name);
close(mdfd);
close(dfd);
free(devices);
+ free(devmap);
return 1;
}
if (strcmp(update, "uuid")==0 &&
close(dfd);
close(mdfd);
free(devices);
+ free(devmap);
return 1;
}
- tst->ss->getinfo_super(tst, content, NULL);
+ tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
tst->ss->free_super(tst);
close(dfd);
}
);
close(mdfd);
free(devices);
+ free(devmap);
return 1;
}
if (best[i] == -1
st->ss->free_super(st);
close(mdfd);
free(devices);
+ free(devmap);
return 1;
}
sparecnt++;
continue;
}
+ /* If this devices thinks that 'most_recent' has failed, then
+ * we must reject this device.
+ */
+ if (j != most_recent &&
+ content->array.raid_disks > 0 &&
+ devices[most_recent].i.disk.raid_disk >= 0 &&
+ devmap[j * content->array.raid_disks + devices[most_recent].i.disk.raid_disk] == 0) {
+ if (verbose > -1)
+ fprintf(stderr, Name ": ignoring %s as it reports %s as failed\n",
+ devices[j].devname, devices[most_recent].devname);
+ best[i] = -1;
+ continue;
+ }
if (devices[j].i.events+event_margin >=
devices[most_recent].i.events) {
devices[j].uptodate = 1;
sparecnt++;
}
}
+ free(devmap);
while (force && !enough(content->array.level, content->array.raid_disks,
content->array.layout, 1,
avail, okcnt)) {