Add 'quite' option and tidy up some tests.

Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
This commit is contained in:
Neil Brown 2005-08-15 06:14:27 +00:00
parent 7358e19667
commit dab6685f3d
36 changed files with 589 additions and 511 deletions

View File

@ -167,7 +167,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
if (!st && ident->st) st = ident->st; if (!st && ident->st) st = ident->st;
if (verbose) if (verbose>0)
fprintf(stderr, Name ": looking for devices for %s\n", fprintf(stderr, Name ": looking for devices for %s\n",
mddev); mddev);
@ -182,7 +182,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
if (ident->devices && if (ident->devices &&
!match_oneof(ident->devices, devname)) { !match_oneof(ident->devices, devname)) {
if (inargv || verbose) if (inargv || verbose > 0)
fprintf(stderr, Name ": %s is not one of %s\n", devname, ident->devices); fprintf(stderr, Name ": %s is not one of %s\n", devname, ident->devices);
continue; continue;
} }
@ -194,7 +194,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
dfd = open(devname, O_RDONLY|O_EXCL, 0); dfd = open(devname, O_RDONLY|O_EXCL, 0);
if (dfd < 0) { if (dfd < 0) {
if (inargv || verbose) if (inargv || verbose > 0)
fprintf(stderr, Name ": cannot open device %s: %s\n", fprintf(stderr, Name ": cannot open device %s: %s\n",
devname, strerror(errno)); devname, strerror(errno));
} else if (fstat(dfd, &stb)< 0) { } else if (fstat(dfd, &stb)< 0) {
@ -207,10 +207,10 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
devname); devname);
close(dfd); close(dfd);
} else if (!tst && (tst = guess_super(dfd)) == NULL) { } else if (!tst && (tst = guess_super(dfd)) == NULL) {
if (inargv || verbose) if (inargv || verbose > 0)
fprintf(stderr, Name ": no recogniseable superblock\n"); fprintf(stderr, Name ": no recogniseable superblock\n");
} else if (tst->ss->load_super(tst,dfd, &super, NULL)) { } else if (tst->ss->load_super(tst,dfd, &super, NULL)) {
if (inargv || verbose) if (inargv || verbose > 0)
fprintf( stderr, Name ": no RAID superblock on %s\n", fprintf( stderr, Name ": no RAID superblock on %s\n",
devname); devname);
close(dfd); close(dfd);
@ -221,35 +221,35 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
if (ident->uuid_set && if (ident->uuid_set &&
(!super || same_uuid(info.uuid, ident->uuid, tst->ss->swapuuid)==0)) { (!super || same_uuid(info.uuid, ident->uuid, tst->ss->swapuuid)==0)) {
if (inargv || verbose) if (inargv || verbose > 0)
fprintf(stderr, Name ": %s has wrong uuid.\n", fprintf(stderr, Name ": %s has wrong uuid.\n",
devname); devname);
continue; continue;
} }
if (ident->name[0] && if (ident->name[0] &&
(!super || strncmp(ident2.name, ident->name, 32)!=0)) { (!super || strncmp(ident2.name, ident->name, 32)!=0)) {
if (inargv || verbose) if (inargv || verbose > 0)
fprintf(stderr, Name ": %s has wrong name.\n", fprintf(stderr, Name ": %s has wrong name.\n",
devname); devname);
continue; continue;
} }
if (ident->super_minor != UnSet && if (ident->super_minor != UnSet &&
(!super || ident->super_minor != info.array.md_minor)) { (!super || ident->super_minor != info.array.md_minor)) {
if (inargv || verbose) if (inargv || verbose > 0)
fprintf(stderr, Name ": %s has wrong super-minor.\n", fprintf(stderr, Name ": %s has wrong super-minor.\n",
devname); devname);
continue; continue;
} }
if (ident->level != UnSet && if (ident->level != UnSet &&
(!super|| ident->level != info.array.level)) { (!super|| ident->level != info.array.level)) {
if (inargv || verbose) if (inargv || verbose > 0)
fprintf(stderr, Name ": %s has wrong raid level.\n", fprintf(stderr, Name ": %s has wrong raid level.\n",
devname); devname);
continue; continue;
} }
if (ident->raid_disks != UnSet && if (ident->raid_disks != UnSet &&
(!super || ident->raid_disks!= info.array.raid_disks)) { (!super || ident->raid_disks!= info.array.raid_disks)) {
if (inargv || verbose) if (inargv || verbose > 0)
fprintf(stderr, Name ": %s requires wrong number of drives.\n", fprintf(stderr, Name ": %s requires wrong number of drives.\n",
devname); devname);
continue; continue;
@ -295,7 +295,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
close(dfd); close(dfd);
} }
if (verbose) if (verbose > 0)
fprintf(stderr, Name ": %s is identified as a member of %s, slot %d.\n", fprintf(stderr, Name ": %s is identified as a member of %s, slot %d.\n",
devname, mddev, info.disk.raid_disk); devname, mddev, info.disk.raid_disk);
devices[devcnt].devname = devname; devices[devcnt].devname = devname;
@ -399,10 +399,11 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
} }
if (chosen_drive < 0) if (chosen_drive < 0)
break; break;
fprintf(stderr, Name ": forcing event count in %s(%d) from %d upto %d\n", if (verbose >= 0)
devices[chosen_drive].devname, devices[chosen_drive].raid_disk, fprintf(stderr, Name ": forcing event count in %s(%d) from %d upto %d\n",
(int)(devices[chosen_drive].events), devices[chosen_drive].devname, devices[chosen_drive].raid_disk,
(int)(devices[most_recent].events)); (int)(devices[chosen_drive].events),
(int)(devices[most_recent].events));
fd = open(devices[chosen_drive].devname, O_RDWR|O_EXCL); fd = open(devices[chosen_drive].devname, O_RDWR|O_EXCL);
if (fd < 0) { if (fd < 0) {
fprintf(stderr, Name ": Couldn't open %s for write - not updating\n", fprintf(stderr, Name ": Couldn't open %s for write - not updating\n",
@ -488,16 +489,18 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
info.disk.state = desired_state; info.disk.state = desired_state;
if (devices[j].uptodate && if (devices[j].uptodate &&
st->ss->update_super(&info, super, "assemble", NULL, 0)) { st->ss->update_super(&info, super, "assemble", NULL, verbose)) {
if (force) { if (force) {
fprintf(stderr, Name ": " if (verbose >= 0)
"clearing FAULTY flag for device %d in %s for %s\n", fprintf(stderr, Name ": "
j, mddev, devices[j].devname); "clearing FAULTY flag for device %d in %s for %s\n",
j, mddev, devices[j].devname);
change = 1; change = 1;
} else { } else {
fprintf(stderr, Name ": " if (verbose >= -1)
"device %d in %s has wrong state in superblock, but %s seems ok\n", fprintf(stderr, Name ": "
i, mddev, devices[j].devname); "device %d in %s has wrong state in superblock, but %s seems ok\n",
i, mddev, devices[j].devname);
} }
} }
#if 0 #if 0
@ -511,7 +514,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
if (force && okcnt == info.array.raid_disks-1) { if (force && okcnt == info.array.raid_disks-1) {
/* FIXME check event count */ /* FIXME check event count */
change += st->ss->update_super(&info, super, "force", change += st->ss->update_super(&info, super, "force",
devices[chosen_drive].devname, 0); devices[chosen_drive].devname, verbose);
} }
if (change) { if (change) {
@ -584,10 +587,10 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
okcnt--; okcnt--;
else else
sparecnt--; sparecnt--;
} else if (verbose) } else if (verbose > 0)
fprintf(stderr, Name ": added %s to %s as %d\n", fprintf(stderr, Name ": added %s to %s as %d\n",
devices[j].devname, mddev, devices[j].raid_disk); devices[j].devname, mddev, devices[j].raid_disk);
} else if (verbose && i < info.array.raid_disks) } else if (verbose > 0 && i < info.array.raid_disks)
fprintf(stderr, Name ": no uptodate device for slot %d of %s\n", fprintf(stderr, Name ": no uptodate device for slot %d of %s\n",
i, mddev); i, mddev);
} }
@ -598,13 +601,15 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
(okcnt >= req_cnt || start_partial_ok) (okcnt >= req_cnt || start_partial_ok)
))) { ))) {
if (ioctl(mdfd, RUN_ARRAY, NULL)==0) { if (ioctl(mdfd, RUN_ARRAY, NULL)==0) {
fprintf(stderr, Name ": %s has been started with %d drive%s", if (verbose >= 0) {
mddev, okcnt, okcnt==1?"":"s"); fprintf(stderr, Name ": %s has been started with %d drive%s",
if (okcnt < info.array.raid_disks) mddev, okcnt, okcnt==1?"":"s");
fprintf(stderr, " (out of %d)", info.array.raid_disks); if (okcnt < info.array.raid_disks)
if (sparecnt) fprintf(stderr, " (out of %d)", info.array.raid_disks);
fprintf(stderr, " and %d spare%s", sparecnt, sparecnt==1?"":"s"); if (sparecnt)
fprintf(stderr, ".\n"); fprintf(stderr, " and %d spare%s", sparecnt, sparecnt==1?"":"s");
fprintf(stderr, ".\n");
}
return 0; return 0;
} }
fprintf(stderr, Name ": failed to RUN_ARRAY %s: %s\n", fprintf(stderr, Name ": failed to RUN_ARRAY %s: %s\n",
@ -616,17 +621,19 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
mddev, okcnt, okcnt==1?"":"s"); mddev, okcnt, okcnt==1?"":"s");
return 0; return 0;
} }
fprintf(stderr, Name ": %s assembled from %d drive%s", mddev, okcnt, okcnt==1?"":"s"); if (verbose >= 0) {
if (sparecnt) fprintf(stderr, Name ": %s assembled from %d drive%s", mddev, okcnt, okcnt==1?"":"s");
fprintf(stderr, " and %d spare%s", sparecnt, sparecnt==1?"":"s"); if (sparecnt)
if (!enough(info.array.level, info.array.raid_disks, okcnt)) fprintf(stderr, " and %d spare%s", sparecnt, sparecnt==1?"":"s");
fprintf(stderr, " - not enough to start the array.\n"); if (!enough(info.array.level, info.array.raid_disks, okcnt))
else { fprintf(stderr, " - not enough to start the array.\n");
if (req_cnt == info.array.raid_disks) else {
fprintf(stderr, " - need all %d to start it", req_cnt); if (req_cnt == info.array.raid_disks)
else fprintf(stderr, " - need all %d to start it", req_cnt);
fprintf(stderr, " - need %d of %d to start", req_cnt, info.array.raid_disks); else
fprintf(stderr, " (use --run to insist).\n"); fprintf(stderr, " - need %d of %d to start", req_cnt, info.array.raid_disks);
fprintf(stderr, " (use --run to insist).\n");
}
} }
return 1; return 1;
} else { } else {

14
Build.c
View File

@ -36,7 +36,7 @@
int Build(char *mddev, int mdfd, int chunk, int level, int layout, int Build(char *mddev, int mdfd, int chunk, int level, int layout,
int raiddisks, int raiddisks,
mddev_dev_t devlist, int assume_clean, mddev_dev_t devlist, int assume_clean,
char *bitmap_file, int bitmap_chunk, int write_behind, int delay) char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int verbose)
{ {
/* Build a linear or raid0 arrays without superblocks /* Build a linear or raid0 arrays without superblocks
* We cannot really do any checks, we just do it. * We cannot really do any checks, we just do it.
@ -51,7 +51,6 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
* SET_ARRAY_INFO, ADD_NEW_DISK, RUN_ARRAY * SET_ARRAY_INFO, ADD_NEW_DISK, RUN_ARRAY
* *
*/ */
int verbose = 0;
int i; int i;
int vers; int vers;
struct stat stb; struct stat stb;
@ -92,21 +91,21 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
break; break;
case 10: case 10:
layout = 0x102; /* near=2, far=1 */ layout = 0x102; /* near=2, far=1 */
if (verbose) if (verbose > 0)
fprintf(stderr, fprintf(stderr,
Name ": layout defaults to n1\n"); Name ": layout defaults to n1\n");
break; break;
case 5: case 5:
case 6: case 6:
layout = map_name(r5layout, "default"); layout = map_name(r5layout, "default");
if (verbose) if (verbose > 0)
fprintf(stderr, fprintf(stderr,
Name ": layout defaults to %s\n", map_num(r5layout, layout)); Name ": layout defaults to %s\n", map_num(r5layout, layout));
break; break;
case LEVEL_FAULTY: case LEVEL_FAULTY:
layout = map_name(faultylayout, "default"); layout = map_name(faultylayout, "default");
if (verbose) if (verbose > 0)
fprintf(stderr, fprintf(stderr,
Name ": layout defaults to %s\n", map_num(faultylayout, layout)); Name ": layout defaults to %s\n", map_num(faultylayout, layout));
break; break;
@ -233,8 +232,9 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
goto abort; goto abort;
} }
} }
fprintf(stderr, Name ": array %s built and started.\n", if (verbose >= 0)
mddev); fprintf(stderr, Name ": array %s built and started.\n",
mddev);
return 0; return 0;
abort: abort:

View File

@ -119,21 +119,21 @@ int Create(struct supertype *st, char *mddev, int mdfd,
break; break;
case 10: case 10:
layout = 0x102; /* near=2, far=1 */ layout = 0x102; /* near=2, far=1 */
if (verbose) if (verbose > 0)
fprintf(stderr, fprintf(stderr,
Name ": layout defaults to n1\n"); Name ": layout defaults to n1\n");
break; break;
case 5: case 5:
case 6: case 6:
layout = map_name(r5layout, "default"); layout = map_name(r5layout, "default");
if (verbose) if (verbose > 0)
fprintf(stderr, fprintf(stderr,
Name ": layout defaults to %s\n", map_num(r5layout, layout)); Name ": layout defaults to %s\n", map_num(r5layout, layout));
break; break;
case LEVEL_FAULTY: case LEVEL_FAULTY:
layout = map_name(faultylayout, "default"); layout = map_name(faultylayout, "default");
if (verbose) if (verbose > 0)
fprintf(stderr, fprintf(stderr,
Name ": layout defaults to %s\n", map_num(faultylayout, layout)); Name ": layout defaults to %s\n", map_num(faultylayout, layout));
break; break;
@ -156,14 +156,14 @@ int Create(struct supertype *st, char *mddev, int mdfd,
case -1: /* linear */ case -1: /* linear */
if (chunk == 0) { if (chunk == 0) {
chunk = 64; chunk = 64;
if (verbose) if (verbose > 0)
fprintf(stderr, Name ": chunk size defaults to 64K\n"); fprintf(stderr, Name ": chunk size defaults to 64K\n");
} }
break; break;
default: /* raid1, multipath */ default: /* raid1, multipath */
if (chunk) { if (chunk) {
chunk = 0; chunk = 0;
if (verbose) if (verbose > 0)
fprintf(stderr, Name ": chunk size ignored for this level\n"); fprintf(stderr, Name ": chunk size ignored for this level\n");
} }
break; break;
@ -236,9 +236,11 @@ int Create(struct supertype *st, char *mddev, int mdfd,
mindisc = dname; mindisc = dname;
minsize = freesize; minsize = freesize;
} }
warn |= check_ext2(fd, dname); if (runstop != 1 || verbose >= 0) {
warn |= check_reiser(fd, dname); warn |= check_ext2(fd, dname);
warn |= check_raid(fd, dname); warn |= check_reiser(fd, dname);
warn |= check_raid(fd, dname);
}
close(fd); close(fd);
} }
if (fail) { if (fail) {
@ -257,13 +259,14 @@ int Create(struct supertype *st, char *mddev, int mdfd,
return 1; return 1;
} }
size = minsize; size = minsize;
if (verbose) if (verbose > 0)
fprintf(stderr, Name ": size set to %luK\n", size); fprintf(stderr, Name ": size set to %luK\n", size);
} }
} }
if (level > 0 && ((maxsize-size)*100 > maxsize)) { if (level > 0 && ((maxsize-size)*100 > maxsize)) {
fprintf(stderr, Name ": largest drive (%s) exceed size (%luK) by more than 1%%\n", if (runstop != 1 || verbose >= 0)
maxdisc, size); fprintf(stderr, Name ": largest drive (%s) exceed size (%luK) by more than 1%%\n",
maxdisc, size);
warn = 1; warn = 1;
} }
@ -274,7 +277,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
return 1; return 1;
} }
} else { } else {
if (verbose) if (verbose > 0)
fprintf(stderr, Name ": creation continuing despite oddities due to --run\n"); fprintf(stderr, Name ": creation continuing despite oddities due to --run\n");
} }
} }
@ -473,7 +476,8 @@ int Create(struct supertype *st, char *mddev, int mdfd,
Manage_runstop(mddev, mdfd, -1, 0); Manage_runstop(mddev, mdfd, -1, 0);
return 1; return 1;
} }
fprintf(stderr, Name ": array %s started.\n", mddev); if (verbose >= 0)
fprintf(stderr, Name ": array %s started.\n", mddev);
} else { } else {
fprintf(stderr, Name ": not starting array - not enough devices.\n"); fprintf(stderr, Name ": not starting array - not enough devices.\n");
} }

View File

@ -92,7 +92,7 @@ int Examine(mddev_dev_t devlist, int brief, int scan, int SparcAdjust, struct su
if (err) rv =1; if (err) rv =1;
if (SparcAdjust) if (SparcAdjust)
st->ss->update_super(NULL, super, "sparc2.2", devlist->devname, 0); st->ss->update_super(NULL, super, "sparc2.2", devlist->devname, 0);
/* Ok, its good enough to try, though the checksum could be wrong */ /* Ok, its good enough to try, though the checksum could be wrong */
if (brief) { if (brief) {
struct array *ap; struct array *ap;

View File

@ -154,7 +154,7 @@ int Manage_reconfig(char *devname, int fd, int layout)
} }
int Manage_subdevs(char *devname, int fd, int Manage_subdevs(char *devname, int fd,
mddev_dev_t devlist) mddev_dev_t devlist, int verbose)
{ {
/* do something to each dev. /* do something to each dev.
* devmode can be * devmode can be
@ -208,8 +208,9 @@ int Manage_subdevs(char *devname, int fd,
md_get_version(fd)%100 < 2) { md_get_version(fd)%100 < 2) {
if (ioctl(fd, HOT_ADD_DISK, if (ioctl(fd, HOT_ADD_DISK,
(unsigned long)stb.st_rdev)==0) { (unsigned long)stb.st_rdev)==0) {
fprintf(stderr, Name ": hot added %s\n", if (verbose >= 0)
dv->devname); fprintf(stderr, Name ": hot added %s\n",
dv->devname);
continue; continue;
} }
@ -276,7 +277,8 @@ int Manage_subdevs(char *devname, int fd,
dv->devname, j, strerror(errno)); dv->devname, j, strerror(errno));
return 1; return 1;
} }
fprintf(stderr, Name ": added %s\n", dv->devname); if (verbose >= 0)
fprintf(stderr, Name ": added %s\n", dv->devname);
break; break;
case 'r': case 'r':
@ -287,7 +289,8 @@ int Manage_subdevs(char *devname, int fd,
dv->devname, strerror(errno)); dv->devname, strerror(errno));
return 1; return 1;
} }
fprintf(stderr, Name ": hot removed %s\n", dv->devname); if (verbose >= 0)
fprintf(stderr, Name ": hot removed %s\n", dv->devname);
break; break;
case 'f': /* set faulty */ case 'f': /* set faulty */
@ -297,8 +300,9 @@ int Manage_subdevs(char *devname, int fd,
dv->devname, strerror(errno)); dv->devname, strerror(errno));
return 1; return 1;
} }
fprintf(stderr, Name ": set %s faulty in %s\n", if (verbose >= 0)
dv->devname, devname); fprintf(stderr, Name ": set %s faulty in %s\n",
dv->devname, devname);
break; break;
} }
} }

View File

@ -91,7 +91,7 @@ char Version[] = Name " - v2.0-devel-3 - DEVELOPMENT VERSION NOT FOR REGULAR USE
* At the time if writing, there is only minimal support. * At the time if writing, there is only minimal support.
*/ */
char short_options[]="-ABCDEFGQhVXvb::c:i:l:p:m:n:x:u:c:d:z:U:sa::rfRSow1te:"; char short_options[]="-ABCDEFGQhVXvqb::c:i:l:p:m:n:x:u:c:d:z:U:sa::rfRSow1te:";
struct option long_options[] = { struct option long_options[] = {
{"manage", 0, 0, '@'}, {"manage", 0, 0, '@'},
{"misc", 0, 0, '#'}, {"misc", 0, 0, '#'},
@ -114,6 +114,7 @@ struct option long_options[] = {
{"help-options",0,0,'h'}, {"help-options",0,0,'h'},
{"version", 0, 0, 'V'}, {"version", 0, 0, 'V'},
{"verbose", 0, 0, 'v'}, {"verbose", 0, 0, 'v'},
{"quiet", 0, 0, 'q'},
/* For create or build: */ /* For create or build: */
{"chunk", 1, 0, 'c'}, {"chunk", 1, 0, 'c'},
@ -205,6 +206,7 @@ char OptionHelp[] =
" --help-options : This help message\n" " --help-options : This help message\n"
" --version -V : Print version information for mdadm\n" " --version -V : Print version information for mdadm\n"
" --verbose -v : Be more verbose about what is happening\n" " --verbose -v : Be more verbose about what is happening\n"
" --quiet -q : Don't print un-necessary messages\n"
" --brief -b : Be less verbose, more brief\n" " --brief -b : Be less verbose, more brief\n"
" --force -f : Override normal checks and be more forceful\n" " --force -f : Override normal checks and be more forceful\n"
"\n" "\n"

View File

@ -192,6 +192,12 @@ This currently only affects
and and
.BR "--examine --scan" . .BR "--examine --scan" .
.TP
.BR -q ", " --quiet
Avoid printing purely informative messages. With this,
.B mdadm
will be silent unless there is something really important to report.
.TP .TP
.BR -b ", " --brief .BR -b ", " --brief
Be less verbose. This is used with Be less verbose. This is used with

20
mdadm.c
View File

@ -70,6 +70,7 @@ int main(int argc, char *argv[])
mddev_dev_t dv; mddev_dev_t dv;
int devs_found = 0; int devs_found = 0;
int verbose = 0; int verbose = 0;
int quiet = 0;
int brief = 0; int brief = 0;
int force = 0; int force = 0;
int test = 0; int test = 0;
@ -114,7 +115,7 @@ int main(int argc, char *argv[])
short_options, long_options, short_options, long_options,
&option_index)) != -1) { &option_index)) != -1) {
int newmode = mode; int newmode = mode;
/* firstly, so mode-independant options */ /* firstly, some mode-independant options */
switch(opt) { switch(opt) {
case 'h': case 'h':
help_text = Help; help_text = Help;
@ -141,6 +142,9 @@ int main(int argc, char *argv[])
case 'v': verbose++; case 'v': verbose++;
continue; continue;
case 'q': quiet++;
continue;
case 'b': case 'b':
if (mode == ASSEMBLE || mode == BUILD || mode == CREATE || mode == GROW) if (mode == ASSEMBLE || mode == BUILD || mode == CREATE || mode == GROW)
break; /* b means bitmap */ break; /* b means bitmap */
@ -860,7 +864,7 @@ int main(int argc, char *argv[])
rv = Manage_ro(devlist->devname, mdfd, readonly); rv = Manage_ro(devlist->devname, mdfd, readonly);
if (!rv && devs_found>1) if (!rv && devs_found>1)
rv = Manage_subdevs(devlist->devname, mdfd, rv = Manage_subdevs(devlist->devname, mdfd,
devlist->next); devlist->next, verbose-quiet);
if (!rv && readonly < 0) if (!rv && readonly < 0)
rv = Manage_ro(devlist->devname, mdfd, readonly); rv = Manage_ro(devlist->devname, mdfd, readonly);
if (!rv && runstop) if (!rv && runstop)
@ -883,14 +887,14 @@ int main(int argc, char *argv[])
else { else {
rv |= Assemble(ss, devlist->devname, mdfd, array_ident, configfile, rv |= Assemble(ss, devlist->devname, mdfd, array_ident, configfile,
NULL, NULL,
readonly, runstop, update, verbose, force); readonly, runstop, update, verbose-quiet, force);
close(mdfd); close(mdfd);
} }
} }
} else if (!scan) } else if (!scan)
rv = Assemble(ss, devlist->devname, mdfd, &ident, configfile, rv = Assemble(ss, devlist->devname, mdfd, &ident, configfile,
devlist->next, devlist->next,
readonly, runstop, update, verbose, force); readonly, runstop, update, verbose-quiet, force);
else if (devs_found>0) { else if (devs_found>0) {
if (update && devs_found > 1) { if (update && devs_found > 1) {
fprintf(stderr, Name ": can only update a single array at a time\n"); fprintf(stderr, Name ": can only update a single array at a time\n");
@ -912,7 +916,7 @@ int main(int argc, char *argv[])
} }
rv |= Assemble(ss, dv->devname, mdfd, array_ident, configfile, rv |= Assemble(ss, dv->devname, mdfd, array_ident, configfile,
NULL, NULL,
readonly, runstop, update, verbose, force); readonly, runstop, update, verbose-quiet, force);
close(mdfd); close(mdfd);
} }
} else { } else {
@ -936,7 +940,7 @@ int main(int argc, char *argv[])
rv |= Assemble(ss, array_list->devname, mdfd, rv |= Assemble(ss, array_list->devname, mdfd,
array_list, configfile, array_list, configfile,
NULL, NULL,
readonly, runstop, NULL, verbose, force); readonly, runstop, NULL, verbose-quiet, force);
close(mdfd); close(mdfd);
} }
} }
@ -969,7 +973,7 @@ int main(int argc, char *argv[])
} }
rv = Build(devlist->devname, mdfd, chunk, level, layout, rv = Build(devlist->devname, mdfd, chunk, level, layout,
raiddisks, devlist->next, assume_clean, raiddisks, devlist->next, assume_clean,
bitmap_file, bitmap_chunk, write_behind, delay); bitmap_file, bitmap_chunk, write_behind, delay, verbose-quiet);
break; break;
case CREATE: case CREATE:
if (delay == 0) delay = DEFAULT_BITMAP_DELAY; if (delay == 0) delay = DEFAULT_BITMAP_DELAY;
@ -989,7 +993,7 @@ int main(int argc, char *argv[])
rv = Create(ss, devlist->devname, mdfd, chunk, level, layout, size<0 ? 0 : size, rv = Create(ss, devlist->devname, mdfd, chunk, level, layout, size<0 ? 0 : size,
raiddisks, sparedisks, ident.name, raiddisks, sparedisks, ident.name,
devs_found-1, devlist->next, runstop, verbose, force, devs_found-1, devlist->next, runstop, verbose-quiet, force,
bitmap_file, bitmap_chunk, write_behind, delay); bitmap_file, bitmap_chunk, write_behind, delay);
break; break;
case MISC: case MISC:

View File

@ -224,7 +224,7 @@ extern int Manage_runstop(char *devname, int fd, int runstop, int quiet);
extern int Manage_resize(char *devname, int fd, long long size, int raid_disks); extern int Manage_resize(char *devname, int fd, long long size, int raid_disks);
extern int Manage_reconfig(char *devname, int fd, int layout); extern int Manage_reconfig(char *devname, int fd, int layout);
extern int Manage_subdevs(char *devname, int fd, extern int Manage_subdevs(char *devname, int fd,
mddev_dev_t devlist); mddev_dev_t devlist, int verbose);
extern int Grow_Add_device(char *devname, int fd, char *newdev); extern int Grow_Add_device(char *devname, int fd, char *newdev);
extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind); extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind);
@ -240,7 +240,7 @@ extern int Assemble(struct supertype *st, char *mddev, int mdfd,
extern int Build(char *mddev, int mdfd, int chunk, int level, int layout, extern int Build(char *mddev, int mdfd, int chunk, int level, int layout,
int raiddisks, int raiddisks,
mddev_dev_t devlist, int assume_clean, mddev_dev_t devlist, int assume_clean,
char *bitmap_file, int bitmap_chunk, int write_behind, int delay); char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int verbose);
extern int Create(struct supertype *st, char *mddev, int mdfd, extern int Create(struct supertype *st, char *mddev, int mdfd,

View File

@ -271,12 +271,13 @@ static int update_super0(struct mdinfo *info, void *sbv, char *update, char *dev
memcpy(sb32+MD_SB_GENERIC_CONSTANT_WORDS+7, memcpy(sb32+MD_SB_GENERIC_CONSTANT_WORDS+7,
sb32+MD_SB_GENERIC_CONSTANT_WORDS+7+1, sb32+MD_SB_GENERIC_CONSTANT_WORDS+7+1,
(MD_SB_WORDS - (MD_SB_GENERIC_CONSTANT_WORDS+7+1))*4); (MD_SB_WORDS - (MD_SB_GENERIC_CONSTANT_WORDS+7+1))*4);
fprintf (stderr, Name ": adjusting superblock of %s for 2.2/sparc compatability.\n", if (verbose >= 0)
devname); fprintf (stderr, Name ": adjusting superblock of %s for 2.2/sparc compatability.\n",
devname);
} }
if (strcmp(update, "super-minor") ==0) { if (strcmp(update, "super-minor") ==0) {
sb->md_minor = info->array.md_minor; sb->md_minor = info->array.md_minor;
if (verbose) if (verbose > 0)
fprintf(stderr, Name ": updating superblock of %s with minor number %d\n", fprintf(stderr, Name ": updating superblock of %s with minor number %d\n",
devname, info->array.md_minor); devname, info->array.md_minor);
} }

75
test
View File

@ -14,7 +14,6 @@ fi
dir=`pwd` dir=`pwd`
mdadm=$dir/mdadm mdadm=$dir/mdadm
export mdadm
if [ \! -x $mdadm ] if [ \! -x $mdadm ]
then then
echo >&2 "test: $mdadm isn't usable." echo >&2 "test: $mdadm isn't usable."
@ -23,16 +22,14 @@ fi
export check="sh $dir/tests/check" export check="sh $dir/tests/check"
# assume md0, md1, md2 exist in /dev # assume md0, md1, md2 exist in /dev
export md0=/dev/md0 md1=/dev/md1 md2=/dev/md2 md0=/dev/md0 md1=/dev/md1 md2=/dev/md2
# We test mdadm on loop-back block devices. # We test mdadm on loop-back block devices.
# dir for storing files should be settable by command line maybe # dir for storing files should be settable by command line maybe
targetdir=/tmp targetdir=/tmp
export targetdir dir
size=20000 size=20000
mdsize0=19904 mdsize0=19904
mdsize1=19992 mdsize1=19992
export size mdsize0 mdsize1
cleanup() { cleanup() {
$mdadm -Ss $mdadm -Ss
@ -48,16 +45,78 @@ for d in 0 1 2 3 4 5 6 7
do do
[ -f $targetdir/mdtest$d ] || dd if=/dev/zero of=$targetdir/mdtest$d count=$size bs=1K > /dev/null 2>&1 [ -f $targetdir/mdtest$d ] || dd if=/dev/zero of=$targetdir/mdtest$d count=$size bs=1K > /dev/null 2>&1
losetup /dev/loop$d $targetdir/mdtest$d losetup /dev/loop$d $targetdir/mdtest$d
export dev$d=/dev/loop$d eval dev$d=/dev/loop$d
eval devlist=\"\$devlist \$dev$d\" eval devlist=\"\$devlist \$dev$d\"
done done
export devlist
# mdadm always adds --quiet, and we want to see any unexpected messages
mdadm() {
$mdadm 2>&1 --quiet "$@"
}
# check various things
check() {
case $1 in
raid* | linear )
grep -s "active $1 " /proc/mdstat > /dev/null || {
echo >&2 "ERROR active $1 not found" ; cat /proc/mdstat ; exit 1;}
;;
resync | recovery )
sleep 0.1
grep -s $1 /proc/mdstat > /dev/null || {
echo >&2 ERROR no $1 happening; cat /proc/mdstat; exit 1; }
;;
nosync )
sleep 0.5
if grep -s 're[synccovery]* =' > /dev/null /proc/mdstat ; then
echo >&2 "ERROR resync or recovery is happening!"; cat /proc/mdstat ; exit 1;
fi
;;
wait )
sleep 0.1
while grep 're[synccovery]* =' > /dev/null /proc/mdstat
do sleep 2;
done
;;
state )
grep -s "blocks.*\[$2\]\$" /proc/mdstat > /dev/null || {
echo >&2 "ERROR state $2 not found!"; cat /proc/mdstat ; exit 1; }
sleep 0.5
;;
* ) echo >&2 ERROR unknown check $1 ; exit 1;
esac
}
# basic device test
testdev() {
dev=$1
cnt=$2
dvsize=$3
chunk=$4
mkfs -j $dev > /dev/null 2>&1 && fsck -fn $dev >&2
dsize=$[dvsize/chunk]
dsize=$[dsize*chunk]
rasize=$[dsize*1024*cnt]
if [ $rasize -ne `/sbin/blockdev --getsize64 $dev` ]
then
echo "ERROR: size is wrong for $dev: $cnt * $dvsize (chunk=$chunk) = $rasize, not `/sbin/blockdev --getsize64 $dev`"
exit 1
fi
}
for script in tests/$prefix*[^~] for script in tests/$prefix*[^~]
do do
if sh -x $script > $targetdir/log 2>&1 # source script in a subshell, so it has access to our
then echo "$script succeeded" # namespace, but cannot change it.
if ( set -ex ; . $script ) 2> $targetdir/log
then echo "$script succeeded"
else cat $targetdir/log else cat $targetdir/log
echo "$script failed" echo "$script failed"
exit 1 exit 1

View File

@ -1,22 +1,20 @@
# create a simple linear # create a simple linear
set -ex
$mdadm -CR $md0 -l linear -n3 $dev0 $dev1 $dev2 mdadm -CR $md0 -l linear -n3 $dev0 $dev1 $dev2
$check linear check linear
sh tests/testdev $md0 3 $mdsize0 64 testdev $md0 3 $mdsize0 64
$mdadm -S $md0 mdadm -S $md0
# now with verion-1 superblock # now with verion-1 superblock
$mdadm -CR $md0 -e1 --level=linear -n4 $dev0 $dev1 $dev2 $dev3 mdadm -CR $md0 -e1 --level=linear -n4 $dev0 $dev1 $dev2 $dev3
$check linear check linear
sh tests/testdev $md0 4 $mdsize1 64 testdev $md0 4 $mdsize1 64
$mdadm -S $md0 mdadm -S $md0
# now with no superblock # now with no superblock
$mdadm -B $md0 -l linear -n5 $dev0 $dev1 $dev2 $dev3 $dev4 mdadm -B $md0 -l linear -n5 $dev0 $dev1 $dev2 $dev3 $dev4
$check linear check linear
sh tests/testdev $md0 5 $size 64 testdev $md0 5 $size 64
$mdadm -S $md0 mdadm -S $md0
exit 0

View File

@ -1,44 +1,43 @@
# create a simple raid0 # create a simple raid0
set -e
$mdadm -CR $md0 -l raid0 -n3 $dev0 $dev1 $dev2 mdadm -CR $md0 -l raid0 -n3 $dev0 $dev1 $dev2
$check raid0 check raid0
sh tests/testdev $md0 3 $mdsize0 64 testdev $md0 3 $mdsize0 64
$mdadm -S $md0 mdadm -S $md0
# now with verion-1 superblock # now with verion-1 superblock
$mdadm -CR $md0 -e1 -l0 -n4 $dev0 $dev1 $dev2 $dev3 mdadm -CR $md0 -e1 -l0 -n4 $dev0 $dev1 $dev2 $dev3
$check raid0 check raid0
sh tests/testdev $md0 4 $mdsize1 64 testdev $md0 4 $mdsize1 64
$mdadm -S $md0 mdadm -S $md0
# now with no superblock # now with no superblock
$mdadm -B $md0 -l0 -n5 $dev0 $dev1 $dev2 $dev3 $dev4 mdadm -B $md0 -l0 -n5 $dev0 $dev1 $dev2 $dev3 $dev4
$check raid0 check raid0
sh tests/testdev $md0 5 $size 64 testdev $md0 5 $size 64
$mdadm -S $md0 mdadm -S $md0
# now same again with different chunk size # now same again with different chunk size
for chunk in 4 32 256 for chunk in 4 32 256
do do
$mdadm -CR $md0 -l raid0 --chunk $chunk -n3 $dev0 $dev1 $dev2 mdadm -CR $md0 -l raid0 --chunk $chunk -n3 $dev0 $dev1 $dev2
$check raid0 check raid0
sh tests/testdev $md0 3 $mdsize0 $chunk testdev $md0 3 $mdsize0 $chunk
$mdadm -S $md0 mdadm -S $md0
# now with verion-1 superblock # now with verion-1 superblock
$mdadm -CR $md0 -e1 -l0 -c $chunk -n4 $dev0 $dev1 $dev2 $dev3 mdadm -CR $md0 -e1 -l0 -c $chunk -n4 $dev0 $dev1 $dev2 $dev3
$check raid0 check raid0
sh tests/testdev $md0 4 $mdsize1 $chunk testdev $md0 4 $mdsize1 $chunk
$mdadm -S $md0 mdadm -S $md0
# now with no superblock # now with no superblock
$mdadm -B $md0 -l0 -n5 --chun=$chunk $dev0 $dev1 $dev2 $dev3 $dev4 mdadm -B $md0 -l0 -n5 --chun=$chunk $dev0 $dev1 $dev2 $dev3 $dev4
$check raid0 check raid0
sh tests/testdev $md0 5 $size $chunk testdev $md0 5 $size $chunk
$mdadm -S $md0 mdadm -S $md0
done done
exit 0 exit 0

View File

@ -4,32 +4,32 @@
# test resync and recovery. # test resync and recovery.
set -e set -e
$mdadm -CR $md0 -l 1 -n2 $dev0 $dev1 mdadm -CR $md0 -l 1 -n2 $dev0 $dev1
$check resync check resync
$check raid1 check raid1
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
$mdadm -S $md0 mdadm -S $md0
# now with verion-1 superblock, spare # now with verion-1 superblock, spare
$mdadm -CR $md0 -e1 --level=raid1 -n3 -x2 $dev0 missing missing $dev1 $dev2 mdadm -CR $md0 -e1 --level=raid1 -n3 -x2 $dev0 missing missing $dev1 $dev2
$check recovery check recovery
$check raid1 check raid1
sh tests/testdev $md0 1 $mdsize1 1 testdev $md0 1 $mdsize1 1
$mdadm -S $md0 mdadm -S $md0
# now with no superblock # now with no superblock
$mdadm -B $md0 -l mirror -n2 $dev0 $dev1 mdadm -B $md0 -l mirror -n2 $dev0 $dev1
$check resync check resync
$check raid1 check raid1
sh tests/testdev $md0 1 $size 1 testdev $md0 1 $size 1
$mdadm -S $md0 mdadm -S $md0
# again, but with no resync # again, but with no resync
$mdadm -B $md0 -l 1 --assume-clean -n2 $dev0 $dev1 mdadm -B $md0 -l 1 --assume-clean -n2 $dev0 $dev1
$check raid1 check raid1
$check nosync check nosync
sh tests/testdev $md0 1 $size 1 testdev $md0 1 $size 1
$mdadm -S $md0 mdadm -S $md0
exit 0 exit 0

View File

@ -12,8 +12,8 @@ do
n2 ) m=3;; n2 ) m=3;;
n3 ) m=2;; n3 ) m=2;;
esac esac
$mdadm --create --run --level=raid10 --layout $lo --raid-disks 6 -x 1 $md0 $devs mdadm --create --run --level=raid10 --layout $lo --raid-disks 6 -x 1 $md0 $devs
$check resync ; $check raid10 check resync ; check raid10
sh tests/testdev $md0 $m $mdsize0 $[64*cm] testdev $md0 $m $mdsize0 $[64*cm]
$mdadm -S $md0 mdadm -S $md0
done done

View File

@ -1,17 +1,16 @@
# create a simple raid4 set # create a simple raid4 set
set -e
$mdadm -CfR $md0 -l 4 -n3 $dev0 $dev1 $dev2 mdadm -CfR $md0 -l 4 -n3 $dev0 $dev1 $dev2
$check resync ; $check raid5 check resync ; check raid5
sh tests/testdev $md0 2 $mdsize0 64 testdev $md0 2 $mdsize0 64
$mdadm -S $md0 mdadm -S $md0
# now with verion-1 superblock # now with verion-1 superblock
$mdadm -CR $md0 -e1 --level=raid4 -n4 $dev0 $dev1 $dev2 $dev3 mdadm -CR $md0 -e1 --level=raid4 -n4 $dev0 $dev1 $dev2 $dev3
$check resync; $check raid5 check resync; check raid5
sh tests/testdev $md0 3 $mdsize1 64 testdev $md0 3 $mdsize1 64
$mdadm -S $md0 mdadm -S $md0
exit 0 exit 0

View File

@ -1,33 +1,32 @@
# create a simple raid5 set # create a simple raid5 set
set -e
$mdadm -CfR $md0 -l 5 -n3 $dev0 $dev1 $dev2 mdadm -CfR $md0 -l 5 -n3 $dev0 $dev1 $dev2
$check resync check resync
sh tests/testdev $md0 2 $mdsize0 64 testdev $md0 2 $mdsize0 64
$mdadm -S $md0 mdadm -S $md0
# now with verion-1 superblock # now with verion-1 superblock
$mdadm -CR $md0 -e1 --level=raid5 -n4 $dev0 $dev1 $dev2 $dev3 mdadm -CR $md0 -e1 --level=raid5 -n4 $dev0 $dev1 $dev2 $dev3
$check recovery check recovery
sh tests/testdev $md0 3 $mdsize1 64 testdev $md0 3 $mdsize1 64
$mdadm -S $md0 mdadm -S $md0
# now same again with explicit layout # now same again with explicit layout
for lo in la ra left-symmetric right-symmetric for lo in la ra left-symmetric right-symmetric
do do
$mdadm -CfR $md0 -l 5 -p $lo -n3 $dev0 $dev1 $dev2 mdadm -CfR $md0 -l 5 -p $lo -n3 $dev0 $dev1 $dev2
$check resync ; $check raid5 check resync ; check raid5
sh tests/testdev $md0 2 $mdsize0 64 testdev $md0 2 $mdsize0 64
$mdadm -S $md0 mdadm -S $md0
# now with verion-1 superblock # now with verion-1 superblock
$mdadm -CR $md0 -e1 --level=raid5 --layout $lo -n4 $dev0 $dev1 $dev2 $dev3 mdadm -CR $md0 -e1 --level=raid5 --layout $lo -n4 $dev0 $dev1 $dev2 $dev3
$check recovery ; $check raid5 check recovery ; check raid5
sh tests/testdev $md0 3 $mdsize1 64 testdev $md0 3 $mdsize1 64
$mdadm -S $md0 mdadm -S $md0
done done

View File

@ -1,17 +1,16 @@
# create a simple raid6 set # create a simple raid6 set
set -e
$mdadm -CfR $md0 -l 6 -n4 $dev0 $dev1 $dev2 $dev3 mdadm -CfR $md0 -l 6 -n4 $dev0 $dev1 $dev2 $dev3
$check resync ; $check raid6 check resync ; check raid6
sh tests/testdev $md0 2 $mdsize0 64 testdev $md0 2 $mdsize0 64
$mdadm -S $md0 mdadm -S $md0
# now with verion-1 superblock # now with verion-1 superblock
$mdadm -CR $md0 -e1 --level=raid6 -n5 $dev0 $dev1 $dev2 $dev3 $dev4 mdadm -CR $md0 -e1 --level=raid6 -n5 $dev0 $dev1 $dev2 $dev3 $dev4
$check resync ; $check raid6 check resync ; check raid6
sh tests/testdev $md0 3 $mdsize1 64 testdev $md0 3 $mdsize1 64
$mdadm -S $md0 mdadm -S $md0
exit 0 exit 0

View File

@ -1,30 +1,28 @@
set -e
# create a raid1, fail and remove a drive during initial sync # create a raid1, fail and remove a drive during initial sync
# Add two more, fail and remove one # Add two more, fail and remove one
# wait for sync to complete, fail, remove, re-add # wait for sync to complete, fail, remove, re-add
$mdadm -CR $md0 -l1 -n4 $dev0 $dev1 $dev2 missing mdadm -CR $md0 -l1 -n4 $dev0 $dev1 $dev2 missing
$check resync check resync
$mdadm $md0 --fail $dev2 mdadm $md0 --fail $dev2
$check resync check resync
$mdadm $md0 --fail $dev1 mdadm $md0 --fail $dev1
sleep 1 sleep 1
$check nosync check nosync
$check state U___ check state U___
$mdadm $md0 --add $dev4 $dev3 mdadm $md0 --add $dev4 $dev3
$check recovery check recovery
# there could be two separate recoveries, one for each dev # there could be two separate recoveries, one for each dev
$check wait check wait
$check wait check wait
$mdadm $md0 --remove $dev2 $dev1 mdadm $md0 --remove $dev2 $dev1
$check nosync check nosync
$check state UUU_ check state UUU_
$mdadm $md0 -a $dev2 mdadm $md0 -a $dev2
$check recovery check recovery
$check wait check wait
$check state UUUU check state UUUU
$mdadm -S $md0 mdadm -S $md0

View File

@ -5,23 +5,23 @@ set -e
# Add two more, fail and remove one # Add two more, fail and remove one
# wait for sync to complete, fail, remove, re-add # wait for sync to complete, fail, remove, re-add
$mdadm -CR $md0 -l5 -n4 $dev0 $dev1 $dev2 $dev3 mdadm -CR $md0 -l5 -n4 $dev0 $dev1 $dev2 $dev3
$check recovery check recovery
$mdadm $md0 --fail $dev3 mdadm $md0 --fail $dev3
$check nosync check nosync
$check state UUU_ check state UUU_
$mdadm $md0 --add $dev4 $dev5 mdadm $md0 --add $dev4 $dev5
$check recovery check recovery
$check wait check wait
$mdadm $md0 --fail $dev0 mdadm $md0 --fail $dev0
$mdadm $md0 --remove $dev3 $dev0 mdadm $md0 --remove $dev3 $dev0
$check recovery check recovery
$check state _UUU check state _UUU
$mdadm $md0 -a $dev3 mdadm $md0 -a $dev3
$check recovery check recovery
$check wait check wait
$check state UUUU check state UUUU
$mdadm -S $md0 mdadm -S $md0

View File

@ -2,40 +2,40 @@
set -e set -e
# Make a raid1, add a device, then remove it again. # Make a raid1, add a device, then remove it again.
$mdadm -CR $md0 -l1 -n2 -x1 $dev0 $dev1 $dev2 mdadm -CR $md0 -l1 -n2 -x1 $dev0 $dev1 $dev2
$check resync check resync
$check wait check wait
$check state UU check state UU
$mdadm --grow $md0 -n 3 mdadm --grow $md0 -n 3
$check recovery check recovery
$check wait check wait
$check state UUU check state UUU
$mdadm $md0 --fail $dev0 mdadm $md0 --fail $dev0
$check state _UU check state _UU
$mdadm --grow $md0 -n 2 mdadm --grow $md0 -n 2
$check state UU check state UU
$mdadm -S $md0 mdadm -S $md0
# same again for version-1 # same again for version-1
$mdadm -CR $md0 -l1 -n2 -e1.2 -x1 $dev0 $dev1 $dev2 mdadm -CR $md0 -l1 -n2 -e1.2 -x1 $dev0 $dev1 $dev2
$check resync check resync
$check wait check wait
$check state UU check state UU
$mdadm --grow $md0 -n 3 mdadm --grow $md0 -n 3
$check recovery check recovery
$check wait check wait
$check state UUU check state UUU
$mdadm $md0 --fail $dev0 mdadm $md0 --fail $dev0
$check state _UU check state _UU
$mdadm --grow $md0 -n 2 mdadm --grow $md0 -n 2
$check state UU check state UU
$mdadm -S $md0 mdadm -S $md0

View File

@ -3,35 +3,35 @@ set -e
# create a small raid1 array, make it larger. Then make it smaller # create a small raid1 array, make it larger. Then make it smaller
$mdadm -CR $md0 --level raid1 --raid-disks 3 --size $[size/2] $dev1 $dev2 $dev3 mdadm -CR $md0 --level raid1 --raid-disks 3 --size $[size/2] $dev1 $dev2 $dev3
$check wait check wait
$check state UUU check state UUU
sh tests/testdev $md0 1 $[size/2] 1 testdev $md0 1 $[size/2] 1
$mdadm --grow $md0 --size max mdadm --grow $md0 --size max
$check resync check resync
$check wait check wait
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
$mdadm --grow $md0 --size $[size/2] mdadm --grow $md0 --size $[size/2]
$check nosync check nosync
sh tests/testdev $md0 1 $[size/2] 1 testdev $md0 1 $[size/2] 1
$mdadm -S $md0 mdadm -S $md0
# same again with version 1.1 superblock # same again with version 1.1 superblock
$mdadm -CR $md0 --level raid1 --metadata=1.1 --raid-disks 3 --size $[size/2] $dev1 $dev2 $dev3 mdadm -CR $md0 --level raid1 --metadata=1.1 --raid-disks 3 --size $[size/2] $dev1 $dev2 $dev3
$check wait check wait
$check state UUU check state UUU
sh tests/testdev $md0 1 $[size/2] 1 testdev $md0 1 $[size/2] 1
$mdadm --grow $md0 --size max mdadm --grow $md0 --size max
$check resync check resync
$check wait check wait
sh tests/testdev $md0 1 $[size-1] 1 testdev $md0 1 $[size-1] 1
$mdadm --grow $md0 --size $[size/2] mdadm --grow $md0 --size $[size/2]
$check nosync check nosync
sh tests/testdev $md0 1 $[size/2] 1 testdev $md0 1 $[size/2] 1
$mdadm -S $md0 mdadm -S $md0

View File

@ -3,35 +3,35 @@ set -e
# create a small raid5 array, make it larger. Then make it smaller # create a small raid5 array, make it larger. Then make it smaller
$mdadm -CR $md0 --level raid5 --chunk=32 --raid-disks 3 --size $[size/2] $dev1 $dev2 $dev3 mdadm -CR $md0 --level raid5 --chunk=32 --raid-disks 3 --size $[size/2] $dev1 $dev2 $dev3
$check wait check wait
$check state UUU check state UUU
sh tests/testdev $md0 2 $[size/2] 32 testdev $md0 2 $[size/2] 32
$mdadm --grow $md0 --size max mdadm --grow $md0 --size max
$check resync check resync
$check wait check wait
sh tests/testdev $md0 2 $mdsize0 64 testdev $md0 2 $mdsize0 64
$mdadm --grow $md0 --size $[size/2] mdadm --grow $md0 --size $[size/2]
$check nosync check nosync
sh tests/testdev $md0 2 $[size/2] 64 testdev $md0 2 $[size/2] 64
$mdadm -S $md0 mdadm -S $md0
# same again with version 1.1 superblock # same again with version 1.1 superblock
$mdadm -CR $md0 --level raid5 --metadata=1.1 --chunk=128 --raid-disks 4 --size $[size/2] $dev1 $dev2 $dev3 $dev4 mdadm -CR $md0 --level raid5 --metadata=1.1 --chunk=128 --raid-disks 4 --size $[size/2] $dev1 $dev2 $dev3 $dev4
$check wait check wait
$check state UUUU check state UUUU
testdev $md0 3 $[size/2] 128
mdadm --grow $md0 --size max
check resync
check wait
testdev $md0 3 $[size-1] 128
mdadm --grow $md0 --size $[size/2]
check nosync
sh tests/testdev $md0 3 $[size/2] 128 sh tests/testdev $md0 3 $[size/2] 128
$mdadm --grow $md0 --size max mdadm -S $md0
$check resync
$check wait
sh tests/testdev $md0 3 $[size-1] 128
$mdadm --grow $md0 --size $[size/2]
$check nosync
sh tests/testdev $md0 3 $[size/2] 128
$mdadm -S $md0

View File

@ -3,35 +3,35 @@ set -e
# create a small raid6 array, make it larger. Then make it smaller # create a small raid6 array, make it larger. Then make it smaller
$mdadm -CR $md0 --level raid6 --chunk=32 --raid-disks 4 --size $[size/2] $dev1 $dev2 $dev3 $dev4 mdadm -CR $md0 --level raid6 --chunk=32 --raid-disks 4 --size $[size/2] $dev1 $dev2 $dev3 $dev4
$check wait check wait
$check state UUUU check state UUUU
sh tests/testdev $md0 2 $[size/2] 32 testdev $md0 2 $[size/2] 32
$mdadm --grow $md0 --size max mdadm --grow $md0 --size max
$check resync check resync
$check wait check wait
sh tests/testdev $md0 2 $mdsize0 64 testdev $md0 2 $mdsize0 64
$mdadm --grow $md0 --size $[size/2] mdadm --grow $md0 --size $[size/2]
$check nosync check nosync
sh tests/testdev $md0 2 $[size/2] 64 testdev $md0 2 $[size/2] 64
$mdadm -S $md0 mdadm -S $md0
# same again with version 1.1 superblock # same again with version 1.1 superblock
$mdadm -CR $md0 --level raid6 --metadata=1.1 --chunk=128 --raid-disks 4 --size $[size/2] $dev1 $dev2 $dev3 $dev4 mdadm -CR $md0 --level raid6 --metadata=1.1 --chunk=128 --raid-disks 4 --size $[size/2] $dev1 $dev2 $dev3 $dev4
$check wait check wait
$check state UUUU check state UUUU
sh tests/testdev $md0 2 $[size/2] 128 testdev $md0 2 $[size/2] 128
$mdadm --grow $md0 --size max mdadm --grow $md0 --size max
$check resync check resync
$check wait check wait
sh tests/testdev $md0 2 $[size-1] 128 testdev $md0 2 $[size-1] 128
$mdadm --grow $md0 --size $[size/2] mdadm --grow $md0 --size $[size/2]
$check nosync check nosync
sh tests/testdev $md0 2 $[size/2] 128 testdev $md0 2 $[size/2] 128
$mdadm -S $md0 mdadm -S $md0

View File

@ -1,28 +1,27 @@
set -e
# create a raid0 array from 3 devices, and assemble it in a multitude of ways. # create a raid0 array from 3 devices, and assemble it in a multitude of ways.
# explicitly list devices # explicitly list devices
# uuid, md-minor on command line with wildcard devices # uuid, md-minor on command line with wildcard devices
# mdadm.conf file # mdadm.conf file
$mdadm -CR $md2 -l0 -n3 $dev0 $dev1 $dev2 mdadm -CR $md2 -l0 -n3 $dev0 $dev1 $dev2
$check raid0 check raid0
tst="sh tests/testdev $md2 3 $mdsize0 64" tst="testdev $md2 3 $mdsize0 64"
$tst $tst
uuid=`$mdadm -Db $md2 | sed 's/.*UUID=//'` uuid=`mdadm -Db $md2 | sed 's/.*UUID=//'`
$mdadm -S $md2 mdadm -S $md2
$mdadm -A $md2 $dev0 $dev1 $dev2 mdadm -A $md2 $dev0 $dev1 $dev2
$tst $tst
$mdadm -S $md2 mdadm -S $md2
$mdadm -A $md2 -u $uuid $devlist mdadm -A $md2 -u $uuid $devlist
$tst $tst
$mdadm -S $md2 mdadm -S $md2
$mdadm --assemble $md2 --super-minor=2 $devlist mdadm --assemble $md2 --super-minor=2 $devlist
$tst $tst
$mdadm -S $md2 mdadm -S $md2
conf=$targetdir/mdadm.conf conf=$targetdir/mdadm.conf
{ {
@ -30,18 +29,18 @@ conf=$targetdir/mdadm.conf
echo array $md2 UUID=$uuid echo array $md2 UUID=$uuid
} > $conf } > $conf
$mdadm -As -c $conf $md2 mdadm -As -c $conf $md2
$tst $tst
$mdadm -S $md2 mdadm -S $md2
{ {
echo DEVICE $devlist echo DEVICE $devlist
echo array $md2 super-minor=2 echo array $md2 super-minor=2
} > $conf } > $conf
$mdadm -As -c $conf $md2 mdadm -As -c $conf $md2
$tst $tst
$mdadm -S $md2 mdadm -S $md2
{ {
@ -49,46 +48,46 @@ $mdadm -S $md2
echo array $md2 devices=$dev0,$dev1,$dev2 echo array $md2 devices=$dev0,$dev1,$dev2
} > $conf } > $conf
$mdadm -As -c $conf $md2 mdadm -As -c $conf $md2
$tst $tst
echo "DEVICE $devlist" > $conf echo "DEVICE $devlist" > $conf
$mdadm -Db $md2 >> $conf mdadm -Db $md2 >> $conf
$mdadm -S $md2 mdadm -S $md2
$mdadm --assemble --scan --config=$conf $md2 mdadm --assemble --scan --config=$conf $md2
$tst $tst
$mdadm -S $md2 mdadm -S $md2
echo " metadata=0.90 devices=$dev0,$dev1,$dev2" >> $conf echo " metadata=0.90 devices=$dev0,$dev1,$dev2" >> $conf
$mdadm --assemble --scan --config=$conf $md2 mdadm --assemble --scan --config=$conf $md2
$tst $tst
$mdadm -S $md2 mdadm -S $md2
### Now for version 1... ### Now for version 1...
$mdadm -CR $md2 -l0 --metadata=1.0 -n3 $dev0 $dev1 $dev2 mdadm -CR $md2 -l0 --metadata=1.0 -n3 $dev0 $dev1 $dev2
$check raid0 check raid0
tst="sh tests/testdev $md2 3 $mdsize1 64" tst="testdev $md2 3 $mdsize1 64"
$tst $tst
uuid=`$mdadm -Db $md2 | sed 's/.*UUID=//'` uuid=`mdadm -Db $md2 | sed 's/.*UUID=//'`
$mdadm -S $md2 mdadm -S $md2
$mdadm -A $md2 $dev0 $dev1 $dev2 mdadm -A $md2 $dev0 $dev1 $dev2
$tst $tst
$mdadm -S $md2 mdadm -S $md2
$mdadm -A $md2 -u $uuid $devlist mdadm -A $md2 -u $uuid $devlist
$tst $tst
$mdadm -S $md2 mdadm -S $md2
# version 1 has now super-minor # version 1 has now super-minor
# $mdadm --assemble $md2 --super-minor=2 $devlist # # mdadm --assemble $md2 --super-minor=2 $devlist #
# $tst # $tst
# $mdadm -S $md2 # mdadm -S $md2
conf=$targetdir/mdadm.conf conf=$targetdir/mdadm.conf
{ {
@ -96,18 +95,18 @@ conf=$targetdir/mdadm.conf
echo array $md2 UUID=$uuid echo array $md2 UUID=$uuid
} > $conf } > $conf
$mdadm -As -c $conf $md2 mdadm -As -c $conf $md2
$tst $tst
$mdadm -S $md2 mdadm -S $md2
#{ #{
# echo DEVICE $devlist # echo DEVICE $devlist
# echo array $md2 super-minor=2 # echo array $md2 super-minor=2
#} > $conf #} > $conf
# #
#$mdadm -As -c $conf $md2 #mdadm -As -c $conf $md2
#$tst #$tst
#$mdadm -S $md2 #mdadm -S $md2
{ {
@ -115,18 +114,18 @@ $mdadm -S $md2
echo array $md2 devices=$dev0,$dev1,$dev2 echo array $md2 devices=$dev0,$dev1,$dev2
} > $conf } > $conf
$mdadm -As -c $conf $md2 mdadm -As -c $conf $md2
$tst $tst
echo "DEVICE $devlist" > $conf echo "DEVICE $devlist" > $conf
$mdadm -Db $md2 >> $conf mdadm -Db $md2 >> $conf
$mdadm -S $md2 mdadm -S $md2
$mdadm --assemble --scan --config=$conf $md2 mdadm --assemble --scan --config=$conf $md2
$tst $tst
$mdadm -S $md2 mdadm -S $md2
echo " metadata=1 devices=$dev0,$dev1,$dev2" >> $conf echo " metadata=1 devices=$dev0,$dev1,$dev2" >> $conf
$mdadm --assemble --scan --config=$conf $md2 mdadm --assemble --scan --config=$conf $md2
$tst $tst
$mdadm -S $md2 mdadm -S $md2

View File

@ -3,19 +3,19 @@ set -e
# create a raid5 array and assemble it in various ways, # create a raid5 array and assemble it in various ways,
# including with missing devices. # including with missing devices.
$mdadm -CR $md1 -l5 -n3 $dev0 $dev1 $dev2 mdadm -CR $md1 -l5 -n3 $dev0 $dev1 $dev2
tst="$check raid5 ;sh tests/testdev $md1 2 $mdsize0 64 ; $mdadm -S $md1" tst="check raid5 ;testdev $md1 2 $mdsize0 64 ; mdadm -S $md1"
uuid=`$mdadm -Db $md1 | sed 's/.*UUID=//'` uuid=`mdadm -Db $md1 | sed 's/.*UUID=//'`
$check wait check wait
eval $tst eval $tst
$mdadm -A $md1 $dev0 $dev1 $dev2 mdadm -A $md1 $dev0 $dev1 $dev2
eval $tst eval $tst
$mdadm -A $md1 -u $uuid $devlist mdadm -A $md1 -u $uuid $devlist
eval $tst eval $tst
$mdadm -A $md1 -m 1 $devlist mdadm -A $md1 -m 1 $devlist
eval $tst eval $tst
@ -25,7 +25,7 @@ conf=$targetdir/mdadm.conf
echo array $md1 UUID=$uuid echo array $md1 UUID=$uuid
} > $conf } > $conf
$mdadm -As -c $conf $md1 mdadm -As -c $conf $md1
eval $tst eval $tst
{ {
@ -33,7 +33,7 @@ eval $tst
echo array $md1 super-minor=1 echo array $md1 super-minor=1
} > $conf } > $conf
$mdadm -As -c $conf mdadm -As -c $conf
eval $tst eval $tst
{ {
@ -41,31 +41,31 @@ eval $tst
echo array $md1 devices=$dev0,$dev1,$dev2 echo array $md1 devices=$dev0,$dev1,$dev2
} > $conf } > $conf
$mdadm -As -c $conf mdadm -As -c $conf
echo "DEVICE $devlist" > $conf echo "DEVICE $devlist" > $conf
$mdadm -Db $md1 >> $conf mdadm -Db $md1 >> $conf
eval $tst eval $tst
$mdadm --assemble --scan --config=$conf $md1 mdadm --assemble --scan --config=$conf $md1
eval $tst eval $tst
echo " metadata=0.90 devices=$dev0,$dev1,$dev2" >> $conf echo " metadata=0.90 devices=$dev0,$dev1,$dev2" >> $conf
$mdadm --assemble --scan --config=$conf $md1 mdadm --assemble --scan --config=$conf $md1
eval $tst eval $tst
### Now with a missing device ### Now with a missing device
$mdadm -AR $md1 $dev0 $dev2 # mdadm -AR $md1 $dev0 $dev2 #
$check state U_U check state U_U
eval $tst eval $tst
$mdadm -A $md1 -u $uuid $devlist mdadm -A $md1 -u $uuid $devlist
$check state U_U check state U_U
eval $tst eval $tst
$mdadm -A $md1 -m 1 $devlist mdadm -A $md1 -m 1 $devlist
$check state U_U check state U_U
eval $tst eval $tst
@ -75,8 +75,8 @@ conf=$targetdir/mdadm.conf
echo array $md1 UUID=$uuid echo array $md1 UUID=$uuid
} > $conf } > $conf
$mdadm -As -c $conf $md1 mdadm -As -c $conf $md1
$check state U_U check state U_U
eval $tst eval $tst
{ {
@ -84,8 +84,8 @@ eval $tst
echo array $md1 super-minor=1 echo array $md1 super-minor=1
} > $conf } > $conf
$mdadm -As -c $conf mdadm -As -c $conf
$check state U_U check state U_U
eval $tst eval $tst
{ {
@ -93,18 +93,18 @@ eval $tst
echo array $md1 devices=$dev0,$dev1,$dev2 echo array $md1 devices=$dev0,$dev1,$dev2
} > $conf } > $conf
$mdadm -As -c $conf mdadm -As -c $conf
echo "DEVICE $devlist" > $conf echo "DEVICE $devlist" > $conf
$mdadm -Db $md1 >> $conf mdadm -Db $md1 >> $conf
$check state U_U check state U_U
eval $tst eval $tst
$mdadm --assemble --scan --config=$conf $md1 mdadm --assemble --scan --config=$conf $md1
$check state U_U check state U_U
eval $tst eval $tst
echo " metadata=0.90 devices=$dev0,$dev1,$dev2" >> $conf echo " metadata=0.90 devices=$dev0,$dev1,$dev2" >> $conf
$mdadm --assemble --scan --config=$conf $md1 mdadm --assemble --scan --config=$conf $md1
$check state U_U check state U_U
eval $tst eval $tst

View File

@ -1,18 +1,18 @@
set -e set -e
# create a raid0, re-assemble with a different super-minor # create a raid0, re-assemble with a different super-minor
$mdadm -CR $md0 -l0 -n3 $dev0 $dev1 $dev2 mdadm -CR $md0 -l0 -n3 $dev0 $dev1 $dev2
sh tests/testdev $md0 3 $mdsize0 64 testdev $md0 3 $mdsize0 64
minor1=`$mdadm -E $dev0 | sed -n -e 's/.*Preferred Minor : //p'` minor1=`mdadm -E $dev0 | sed -n -e 's/.*Preferred Minor : //p'`
$mdadm -S /dev/md0 mdadm -S /dev/md0
$mdadm -A $md1 $dev0 $dev1 $dev2 mdadm -A $md1 $dev0 $dev1 $dev2
minor2=`$mdadm -E $dev0 | sed -n -e 's/.*Preferred Minor : //p'` minor2=`mdadm -E $dev0 | sed -n -e 's/.*Preferred Minor : //p'`
$mdadm -S /dev/md1 mdadm -S /dev/md1
$mdadm -A $md1 --update=super-minor $dev0 $dev1 $dev2 mdadm -A $md1 --update=super-minor $dev0 $dev1 $dev2
minor3=`$mdadm -E $dev0 | sed -n -e 's/.*Preferred Minor : //p'` minor3=`mdadm -E $dev0 | sed -n -e 's/.*Preferred Minor : //p'`
$mdadm -S /dev/md1 mdadm -S /dev/md1
case "$minor1 $minor2 $minor3" in case "$minor1 $minor2 $minor3" in
"0 0 1" ) ;; "0 0 1" ) ;;

View File

@ -2,14 +2,14 @@ set -i
# create a raid1 array, let it sync, then re-assemble with a force-sync # create a raid1 array, let it sync, then re-assemble with a force-sync
$mdadm -CR $md0 -l1 -n2 $dev0 $dev1 mdadm -CR $md0 -l1 -n2 $dev0 $dev1
$check wait check wait
$mdadm -S $md0 mdadm -S $md0
$mdadm -A $md0 $dev0 $dev1 mdadm -A $md0 $dev0 $dev1
$check nosync check nosync
$mdadm -S $md0 mdadm -S $md0
$mdadm -A $md0 -U resync $dev0 $dev1 mdadm -A $md0 -U resync $dev0 $dev1
$check resync check resync
$mdadm -S $md0 mdadm -S $md0

View File

@ -5,45 +5,45 @@ set -e
# #
bmf=$targetdir/bitmap bmf=$targetdir/bitmap
rm -f $bmf rm -f $bmf
$mdadm --create --run $md0 --level=1 -n2 --delay=1 --bitmap $bmf $dev1 $dev2 mdadm --create --run $md0 --level=1 -n2 --delay=1 --bitmap $bmf $dev1 $dev2
$check wait check wait
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
$mdadm -S $md0 mdadm -S $md0
$mdadm --assemble $md0 --bitmap=$bmf $dev1 $dev2 mdadm --assemble $md0 --bitmap=$bmf $dev1 $dev2
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
dirty1=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty1=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sleep 4 sleep 4
dirty2=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ] if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2" then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
exit 1 exit 1
fi fi
$mdadm $md0 -f $dev1 mdadm $md0 -f $dev1
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
sleep 4 sleep 4
dirty3=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty3 -lt 400 ] if [ $dirty3 -lt 400 ]
then then
echo >&2 "ERROR dirty count $dirty3 is too small" echo >&2 "ERROR dirty count $dirty3 is too small"
exit 2 exit 2
fi fi
$mdadm -S $md0 mdadm -S $md0
$mdadm --assemble -R $md0 --bitmap=$bmf $dev2 mdadm --assemble -R $md0 --bitmap=$bmf $dev2
$mdadm $md0 --add $dev1 mdadm $md0 --add $dev1
$check recovery check recovery
dirty4=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty4=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
$check wait check wait
sleep 4 sleep 4
dirty5=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty5=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ] if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5" then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
exit 1 exit 1
fi fi
$mdadm -S $md0 mdadm -S $md0

View File

@ -3,22 +3,22 @@ set -e
# #
# create a raid1 array, add an external bitmap # create a raid1 array, add an external bitmap
# #
$mdadm --create --run $md0 -l 1 -n 2 $dev1 $dev2 mdadm --create --run $md0 -l 1 -n 2 $dev1 $dev2
$check wait check wait
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
bmf=$targetdir/bm bmf=$targetdir/bm
rm -f $bmf rm -f $bmf
$mdadm -E $dev1 mdadm -E $dev1
$mdadm --grow $md0 --bitmap=$bmf --delay=1 || { $mdadm -X $bmf ; exit 1; } mdadm --grow $md0 --bitmap=$bmf --delay=1 || { $mdadm -X $bmf ; exit 1; }
dirty1=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty1=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sleep 4 sleep 4
dirty2=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
dirty3=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sleep 4 sleep 4
dirty4=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty4=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
echo $dirty1 $dirty2 $dirty3 $dirty4 echo $dirty1 $dirty2 $dirty3 $dirty4
if [ $dirty2 -ne 0 -o $dirty4 -ne 0 -o $dirty3 -lt 400 ] if [ $dirty2 -ne 0 -o $dirty4 -ne 0 -o $dirty3 -lt 400 ]
@ -26,4 +26,4 @@ then
echo bad dirty counts echo bad dirty counts
exit 1 exit 1
fi fi
$mdadm -S $md0 mdadm -S $md0

View File

@ -3,45 +3,45 @@ set -e
# #
# create a raid1 with an internal bitmap # create a raid1 with an internal bitmap
# #
$mdadm --create --run $md0 --level=1 -n2 --delay=1 --bitmap internal $dev1 $dev2 mdadm --create --run $md0 --level=1 -n2 --delay=1 --bitmap internal $dev1 $dev2
$check wait check wait
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
$mdadm -S $md0 mdadm -S $md0
$mdadm --assemble $md0 $dev1 $dev2 mdadm --assemble $md0 $dev1 $dev2
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
dirty1=`$mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sleep 4 sleep 4
dirty2=`$mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ] if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2" then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
exit 1 exit 1
fi fi
$mdadm $md0 -f $dev1 mdadm $md0 -f $dev1
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
sleep 4 sleep 4
dirty3=`$mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty3 -lt 400 ] if [ $dirty3 -lt 400 ]
then then
echo >&2 "ERROR dirty count $dirty3 is too small" echo >&2 "ERROR dirty count $dirty3 is too small"
exit 2 exit 2
fi fi
$mdadm -S $md0 mdadm -S $md0
$mdadm --assemble -R $md0 $dev2 mdadm --assemble -R $md0 $dev2
$mdadm $md0 --add $dev1 mdadm $md0 --add $dev1
$check recovery check recovery
dirty4=`$mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty4=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
$check wait check wait
sleep 4 sleep 4
dirty5=`$mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty5=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ] if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5" then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
exit 1 exit 1
fi fi
$mdadm -S $md0 mdadm -S $md0

View File

@ -7,47 +7,47 @@ set -e
# #
bmf=$targetdir/bitmap bmf=$targetdir/bitmap
rm -f $bmf rm -f $bmf
$mdadm --create --run $md0 --level=1 -n3 --delay=1 --bitmap $bmf $dev1 $dev2 $dev3 mdadm --create --run $md0 --level=1 -n3 --delay=1 --bitmap $bmf $dev1 $dev2 $dev3
$check wait check wait
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
$mdadm -S $md0 mdadm -S $md0
$mdadm --assemble $md0 --bitmap=$bmf $dev1 $dev2 $dev3 mdadm --assemble $md0 --bitmap=$bmf $dev1 $dev2 $dev3
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
dirty1=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty1=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sleep 4 sleep 4
dirty2=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ] if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2" then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
exit 1 exit 1
fi fi
$mdadm $md0 -f $dev2 mdadm $md0 -f $dev2
sh tests/testdev $md0 1 $mdsize0 1 testdev $md0 1 $mdsize0 1
sleep 4 sleep 4
dirty3=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty3 -lt 400 ] if [ $dirty3 -lt 400 ]
then then
echo >&2 "ERROR dirty count $dirty3 is too small" echo >&2 "ERROR dirty count $dirty3 is too small"
exit 2 exit 2
fi fi
$mdadm -S $md0 mdadm -S $md0
$mdadm --assemble -R $md0 --bitmap=$bmf $dev1 $dev3 mdadm --assemble -R $md0 --bitmap=$bmf $dev1 $dev3
$check nosync check nosync
$mdadm $md0 --add $dev2 mdadm $md0 --add $dev2
$check recovery check recovery
dirty4=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty4=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
$check wait check wait
sleep 4 sleep 4
dirty5=`$mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'` dirty5=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ] if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5" then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
exit 1 exit 1
fi fi
$mdadm -S $md0 mdadm -S $md0
exit 0 exit 0

View File

@ -2,12 +2,12 @@ set -x
# create an array with a name # create an array with a name
$mdadm -CR $md0 -l0 -n2 --metadata=1 --name="Fred" $dev0 $dev1 mdadm -CR $md0 -l0 -n2 --metadata=1 --name="Fred" $dev0 $dev1
$mdadm -E $dev0 | grep 'Name : Fred$' > /dev/null || exit 1 mdadm -E $dev0 | grep 'Name : Fred$' > /dev/null || exit 1
$mdadm -D $md0 | grep 'Name : Fred$' > /dev/null || exit 1 mdadm -D $md0 | grep 'Name : Fred$' > /dev/null || exit 1
$mdadm -S $md0 mdadm -S $md0
$mdadm -A $md0 --name="Fred" $devlist mdadm -A $md0 --name="Fred" $devlist
$mdadm -Db $md0 mdadm -Db $md0
$mdadm -S $md0 mdadm -S $md0

View File

@ -2,18 +2,18 @@ set -e
# make a raid5 array, byte swap the superblocks, then assemble... # make a raid5 array, byte swap the superblocks, then assemble...
$mdadm -CR $md0 -l5 -n4 $dev0 $dev1 $dev2 $dev3 mdadm -CR $md0 -l5 -n4 $dev0 $dev1 $dev2 $dev3
sleep 4 sleep 4
$mdadm -S $md0 mdadm -S $md0
$mdadm -E --metadata=0 $dev1 | grep -v Events > $targetdir/d1 mdadm -E --metadata=0 $dev1 | grep -v Events > $targetdir/d1
for d in $dev0 $dev1 $dev2 $dev3 for d in $dev0 $dev1 $dev2 $dev3
do $dir/swap_super $d do $dir/swap_super $d
done done
$mdadm -E --metadata=0.swap $dev1 | grep -v Events > $targetdir/d1s mdadm -E --metadata=0.swap $dev1 | grep -v Events > $targetdir/d1s
diff -u $targetdir/d1 $targetdir/d1s diff -u $targetdir/d1 $targetdir/d1s
$mdadm --assemble --update=byteorder $md0 $dev0 $dev1 $dev2 $dev3 mdadm --assemble --update=byteorder $md0 $dev0 $dev1 $dev2 $dev3
sleep 3 sleep 3
cat /proc/mdstat cat /proc/mdstat
$mdadm -S $md0 mdadm -S $md0

View File

@ -2,14 +2,14 @@ set -e
# create a raid1 array with a wrmostly device # create a raid1 array with a wrmostly device
$mdadm -CR $md0 -l1 -n3 $dev0 $dev1 --write-mostly $dev2 mdadm -CR $md0 -l1 -n3 $dev0 $dev1 --write-mostly $dev2
sh tests/testdev $md0 1 $mdsize0 64 testdev $md0 1 $mdsize0 64
# unfortunately, we cannot measure if any read requests are going to $dev2 # unfortunately, we cannot measure if any read requests are going to $dev2
$mdadm -S $md0 mdadm -S $md0
$mdadm -CR $md0 -l1 -n3 --write-behind --bitmap=internal $dev0 $dev1 --write-mostly $dev2 mdadm -CR $md0 -l1 -n3 --write-behind --bitmap=internal $dev0 $dev1 --write-mostly $dev2
sh tests/testdev $md0 1 $mdsize0 64 testdev $md0 1 $mdsize0 64
$mdadm -S $md0 mdadm -S $md0

View File

@ -2,7 +2,7 @@ dev=$1
cnt=$2 cnt=$2
size=$3 size=$3
chunk=$4 chunk=$4
mkfs -j $dev > /dev/null 2>&1 && fsck -fn $dev mkfs -j $dev > /dev/null 2>&1 && fsck -fn $dev >&2
dsize=$[size/chunk] dsize=$[size/chunk]
dsize=$[dsize*chunk] dsize=$[dsize*chunk]
rasize=$[dsize*1024*cnt] rasize=$[dsize*1024*cnt]