fprintf(stderr, " and %d spare%s", sparecnt, sparecnt==1?"":"s");
fprintf(stderr, ".\n");
}
- if (info.reshape_active &&
- info.array.level >= 4 &&
- info.array.level <= 6) {
++ if (content->reshape_active &&
++ content->array.level >= 4 &&
++ content->array.level <= 6) {
+ /* might need to increase the size
+ * of the stripe cache - default is 256
+ */
- if (256 < 4 * (info.array.chunk_size/4096)) {
++ if (256 < 4 * (content->array.chunk_size/4096)) {
+ struct mdinfo *sra = sysfs_read(mdfd, 0, 0);
+ if (sra)
+ sysfs_set_num(sra, NULL,
+ "stripe_cache_size",
- (4 * info.array.chunk_size / 4096) + 1);
++ (4 * content->array.chunk_size / 4096) + 1);
+ }
+ }
- if (must_close) {
+ close(mdfd);
+ wait_for(mddev);
+ if (auto_assem) {
int usecs = 1;
- close(mdfd);
/* There is a nasty race with 'mdadm --monitor'.
* If it opens this device before we close it,
* it gets an incomplete open on which IO
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;
+}
+struct map_ent *map_by_devnum(struct map_ent **map, int devnum)
+{
+ struct map_ent *mp;
+ if (!*map)
+ map_read(map);
+
+ 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;
+}
+
+struct map_ent *map_by_name(struct map_ent **map, char *name)
+{
+ struct map_ent *mp;
+ if (!*map)
+ map_read(map);
+
+ for (mp = *map ; mp ; mp = mp->next) {
+ if (strncmp(mp->path, "/dev/md/", 8) != 0)
+ continue;
+ if (strcmp(mp->path+8, name) != 0)
+ continue;
+ if (!mddev_busy(mp->devnum)) {
+ mp->bad = 1;
+ continue;
+ }
+ return mp;
+ }
+ return NULL;
}
- map_add(&map, md->devnum, st->ss->major,
- st->minor_version,
+
+ void RebuildMap(void)
+ {
+ struct mdstat_ent *mdstat = mdstat_read(0, 0);
+ struct mdstat_ent *md;
+ struct map_ent *map = NULL;
+ int mdp = get_mdp_major();
+
+ for (md = mdstat ; md ; md = md->next) {
+ struct mdinfo *sra = sysfs_read(-1, md->devnum, GET_DEVS);
+ struct mdinfo *sd;
+
+ for (sd = sra->devs ; sd ; sd = sd->next) {
+ char dn[30];
+ int dfd;
+ int ok;
+ struct supertype *st;
+ char *path;
+ struct mdinfo info;
+
+ sprintf(dn, "%d:%d", sd->disk.major, sd->disk.minor);
+ dfd = dev_open(dn, O_RDONLY);
+ if (dfd < 0)
+ continue;
+ st = guess_super(dfd);
+ if ( st == NULL)
+ ok = -1;
+ else
+ ok = st->ss->load_super(st, dfd, NULL);
+ close(dfd);
+ if (ok != 0)
+ continue;
+ st->ss->getinfo_super(st, &info);
+ if (md->devnum > 0)
+ path = map_dev(MD_MAJOR, md->devnum, 0);
+ else
+ path = map_dev(mdp, (-1-md->devnum)<< 6, 0);
++ map_add(&map, md->devnum,
++ info.text_version,
+ info.uuid, path ? : "/unknown");
+ st->ss->free_super(st);
+ break;
+ }
++ sysfs_free(sra);
+ }
+ map_write(map);
+ map_free(map);
++ for (md = mdstat ; md ; md = md->next) {
++ struct mdinfo *sra = sysfs_read(-1, md->devnum, GET_VERSION);
++ sysfs_uevent(sra, "change");
++ sysfs_free(sra);
++ }
+ }