From: NeilBrown Date: Thu, 18 Dec 2008 05:56:13 +0000 (+1100) Subject: Merge branch 'master' into devel-3.0 X-Git-Tag: mdadm-3.0-devel3~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a659c33212f85cc0dcecc759b7b36b0bb2b4fe4;p=thirdparty%2Fmdadm.git Merge branch 'master' into devel-3.0 Conflicts: Assemble.c Incremental.c Kill.c ReadMe.c inventory mapfile.c mdadm.8 mdadm.spec mdassemble.8 --- 8a659c33212f85cc0dcecc759b7b36b0bb2b4fe4 diff --cc Assemble.c index cac273ea,0cdeeda3..4933520d --- a/Assemble.c +++ b/Assemble.c @@@ -1088,10 -934,23 +1090,24 @@@ int Assemble(struct supertype *st, cha 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 diff --cc Kill.c index d5c1e36d,b1e19b56..96b270f2 --- a/Kill.c +++ b/Kill.c @@@ -44,7 -44,7 +44,9 @@@ int Kill(char *dev, int force, int quie int fd, rv = 0; struct supertype *st; - fd = open(dev, O_DIRECT | (noexcl ? O_RDWR : (O_RDWR|O_EXCL))); ++ if (force) ++ noexcl = 1; + fd = open(dev, O_RDWR|(force ? 0 : O_EXCL)); if (fd < 0) { if (!quiet) fprintf(stderr, Name ": Couldn't open %s for write - not zeroing\n", diff --cc inventory index 2d86d3aa,90f494d6..dffe802a --- a/inventory +++ b/inventory @@@ -22,8 -22,7 +22,9 @@@ ANNOUNCE-2.6. ANNOUNCE-2.6.5 ANNOUNCE-2.6.6 ANNOUNCE-2.6.7 + ANNOUNCE-2.6.8 +ANNOUNCE-3.0-devel1 +ANNOUNCE-3.0-devel2 Assemble.c bitmap.c bitmap.h diff --cc mapfile.c index 89836cf1,0d0aa398..75095ec2 --- a/mapfile.c +++ b/mapfile.c @@@ -230,52 -195,56 +236,105 @@@ struct map_ent *map_by_uuid(struct map_ 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; } + + 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, st->ss->major, - st->minor_version, ++ 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); ++ } + }