diff options
-rw-r--r-- | ANNOUNCE-2.6.8 | 58 | ||||
-rw-r--r-- | Assemble.c | 16 | ||||
-rw-r--r-- | Incremental.c | 53 | ||||
-rw-r--r-- | Kill.c | 4 | ||||
-rwxr-xr-x | inventory | 1 | ||||
-rw-r--r-- | mapfile.c | 59 | ||||
-rw-r--r-- | mdadm.conf.5 | 2 |
7 files changed, 138 insertions, 55 deletions
diff --git a/ANNOUNCE-2.6.8 b/ANNOUNCE-2.6.8 new file mode 100644 index 00000000..55f484c1 --- /dev/null +++ b/ANNOUNCE-2.6.8 @@ -0,0 +1,58 @@ +Subject: ANNOUNCE: mdadm 2.6.8 - A tool for managing Soft RAID under Linux + +I am pleased to announce the availability of + mdadm version 2.6.8 + +It is available at the usual places: + countrycode=xx. + http://www.${countrycode}kernel.org/pub/linux/utils/raid/mdadm/ +and via git at + git://neil.brown.name/mdadm + http://neil.brown.name/git?p=mdadm + +mdadm is a tool for creating, managing and monitoring +device arrays using the "md" driver in Linux, also +known as Software RAID arrays. + +Release 2.6.8 contains various bug fixes and minor enhancements. +It is possibly that 2.6.8 will be the last release in the 2.x +series and very likely that there will never be a 2.7. +Hopefully 3.0 will be released soon making future development +of 2.6.x unnecessary. However if a need does arise for a 2.6.9 +it will be considered. + +Changelog Entries: + fix add_dev() handling of broken links + Assemble: allow --force to work even when event counts are 0. + mapfile: fix bug in testing for /var/run/mdadm/ + Incremental: change precedence order for autof setting. + Adjust major number testing to allow for extended minor number in 2.6.28 + Incremental: allow assembly of foreign array. + Incremental: fix setting of 'autof' flag. + Fix --incremental assembly of partitions arrays. + Fix NULL pointer oops + Fix bad metadata formatting + Allow WRITEMOSTLY to be cleared on --readd using --readwrite. + Remove .UR .UE macros from man page because the don't do what we want. + Grow: Fix linear-growth when devices are not all the same size. + Improve reporting of layout for raid10. + Manage: allow adding device that is just large enough to v1.x array. + Cosmetic cleanup of some messages. + Clean up usage of open() + Add support for distribution specific build extensions + Fix confusing usage in md.4 man page. + Describe the HOMEHOST entry in the mdadm.conf man page. + Some more cleanup of tests. + Add test for stoping and restarting a raid5 reshape. + Add "bitmap=" to "--detail --brief" output when relevant. + Improve error message when mdadm fails to stop an array. + Couple more man page fixes + Add text to man pages suggesting partition type to use for version 1.x metadata. + Italic/bold fixes in man pages. + Fix bug in forced assemble. + Fix an error when assembling arrays that are in the middle of a reshape. + +Development of mdadm is sponsored by + SUSE Labs, Novell Inc. + +NeilBrown 28th November 2008 @@ -890,6 +890,8 @@ int Assemble(struct supertype *st, char *mddev, continue; devices[j].i.disk.state = desired_state; + if (!(devices[j].i.array.state & 1)) + clean = 0; if (st->ss->update_super(st, &devices[j].i, "assemble", NULL, verbose, 0, NULL)) { @@ -1088,6 +1090,20 @@ int Assemble(struct supertype *st, char *mddev, fprintf(stderr, " and %d spare%s", sparecnt, sparecnt==1?"":"s"); fprintf(stderr, ".\n"); } + 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 * (content->array.chunk_size/4096)) { + struct mdinfo *sra = sysfs_read(mdfd, 0, 0); + if (sra) + sysfs_set_num(sra, NULL, + "stripe_cache_size", + (4 * content->array.chunk_size / 4096) + 1); + } + } close(mdfd); wait_for(mddev); if (auto_assem) { diff --git a/Incremental.c b/Incremental.c index 474f78d6..43b1f776 100644 --- a/Incremental.c +++ b/Incremental.c @@ -596,59 +596,6 @@ static int count_active(struct supertype *st, int mdfd, char **availp, return cnt + cnt1; } -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); - } -} - int IncrementalScan(int verbose) { /* look at every device listed in the 'map' file. @@ -44,7 +44,9 @@ int Kill(char *dev, int force, int quiet, int noexcl) 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", @@ -22,6 +22,7 @@ ANNOUNCE-2.6.4 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 @@ -152,6 +152,12 @@ void map_read(struct map_ent **melp) f = fopen("/var/run/mdadm/map", "r"); if (!f) f = fopen("/var/run/mdadm.map", "r"); + if (!f) { + RebuildMap(); + f = fopen("/var/run/mdadm/map", "r"); + } + if (!f) + f = fopen("/var/run/mdadm.map", "r"); if (!f) return; @@ -279,3 +285,56 @@ struct map_ent *map_by_name(struct map_ent **map, char *name) } 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, + 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); + } +} diff --git a/mdadm.conf.5 b/mdadm.conf.5 index a02fe141..0cea47cf 100644 --- a/mdadm.conf.5 +++ b/mdadm.conf.5 @@ -340,7 +340,7 @@ DEVICE /dev/sd[bcdjkl]1 .br DEVICE /dev/hda1 /dev/hdb1 -# /dev/md0 is known by its UID. +# /dev/md0 is known by its UUID. .br ARRAY /dev/md0 UUID=3aaa0122:29827cfa:5331ad66:ca767371 .br |