* Sydney, 2052
* Australia
*
- * Additions for bitmap and async RAID options, Copyright (C) 2003-2004,
+ * Additions for bitmap and write-behind RAID options, Copyright (C) 2003-2004,
* Paul Clements, SteelEye Technology, Inc.
*/
char devmode = 0;
int runstop = 0;
int readonly = 0;
+ int write_behind = 0;
int bitmap_fd = -1;
char *bitmap_file = NULL;
int bitmap_chunk = UnSet;
char *pidfile = NULL;
int oneshot = 0;
struct supertype *ss = NULL;
+ int writemostly = 0;
int copies;
ident.autof = 0;
ident.st = NULL;
ident.bitmap_fd = -1;
+ ident.name[0] = 0;
while ((option_index = -1) ,
(opt=getopt_long(argc, argv,
fputs(Version, stderr);
exit(0);
- case 'v': verbose = 1;
+ case 'v': verbose++;
continue;
case 'b':
}
dv->devname = optarg;
dv->disposition = devmode;
+ dv->writemostly = writemostly;
dv->next = NULL;
*devlistend = dv;
devlistend = &dv->next;
}
dv->devname = optarg;
dv->disposition = devmode;
+ dv->writemostly = writemostly;
dv->next = NULL;
*devlistend = dv;
devlistend = &dv->next;
max_disks = ss->max_devs;
continue;
+ case O(MANAGE,'W'):
+ case O(BUILD,'W'):
+ case O(CREATE,'W'):
+ /* set write-mostly for following devices */
+ writemostly = 1;
+ continue;
+
case O(GROW,'z'):
case O(CREATE,'z'): /* size */
if (size >= 0) {
continue;
case O(BUILD,'f'): /* force honouring '-n 1' */
+ case O(GROW,'f'): /* ditto */
case O(CREATE,'f'): /* force honouring of device list */
case O(ASSEMBLE,'f'): /* force assembly */
case O(MISC,'f'): /* force zero */
}
continue;
+ case O(CREATE,'N'):
+ case O(ASSEMBLE,'N'):
+ if (ident.name[0]) {
+ fprintf(stderr, Name ": name cannot be set twice. "
+ "Second value %s.\n", optarg);
+ exit(2);
+ }
+ if (strlen(optarg) > 32) {
+ fprintf(stderr, Name ": name '%s' is too long, 32 chars max.\n",
+ optarg);
+ exit(2);
+ }
+ strcpy(ident.name, optarg);
+ continue;
+
case O(ASSEMBLE,'m'): /* super-minor for array */
if (ident.super_minor != UnSet) {
fprintf(stderr, Name ": super-minor cannot be set twice. "
continue;
if (strcmp(update, "resync")==0)
continue;
+ if (strcmp(update, "byteorder")==0) {
+ if (ss) {
+ fprintf(stderr, Name ": must not set metadata type with --update=byteorder.\n");
+ exit(2);
+ }
+ for(i=0; !ss && superlist[i]; i++)
+ ss = superlist[i]->match_metadata_desc("0.swap");
+ if (!ss) {
+ fprintf(stderr, Name ": INTERNAL ERROR cannot find 0.swap\n");
+ exit(2);
+ }
+
+ continue;
+ }
fprintf(stderr, Name ": '--update %s' invalid. Only 'sparc2.2', 'super-minor', 'resync' or 'summaries' supported\n",update);
exit(2);
/* convert K to B, chunk of 0K means 512B */
bitmap_chunk = bitmap_chunk ? bitmap_chunk * 1024 : 512;
continue;
+
+ case O(BUILD, 5):
+ case O(CREATE, 5): /* write-behind mode */
+ write_behind = DEFAULT_MAX_WRITE_BEHIND;
+ if (optarg) {
+ write_behind = strtol(optarg, &c, 10);
+ if (write_behind < 0 || *c ||
+ write_behind > 16383) {
+ fprintf(stderr, Name ": Invalid value for maximum outstanding write-behind writes: %s.\n\tMust be between 0 and 16383.\n", optarg);
+ exit(2);
+ }
+ }
+ continue;
}
/* We have now processed all the valid options. Anything else is
* an error
break;
case ASSEMBLE:
if (devs_found == 1 && ident.uuid_set == 0 &&
- ident.super_minor == UnSet && !scan ) {
+ ident.super_minor == UnSet && ident.name[0] == 0 && !scan ) {
/* Only a device has been given, so get details from config file */
mddev_ident_t array_ident = conf_get_ident(configfile, devlist->devname);
if (array_ident == NULL) {
case BUILD:
if (bitmap_chunk == UnSet) bitmap_chunk = DEFAULT_BITMAP_CHUNK;
if (delay == 0) delay = DEFAULT_BITMAP_DELAY;
+ if (write_behind && !bitmap_file) {
+ fprintf(stderr, Name ": write-behind mode requires a bitmap.\n");
+ rv = 1;
+ break;
+ }
+
if (bitmap_file) {
if (strcmp(bitmap_file, "internal")==0) {
fprintf(stderr, Name ": 'internal' bitmaps not supported with --build\n");
}
if (bitmap_fd < 0) {
bitmap_fd = CreateBitmap(bitmap_file, force, NULL,
- bitmap_chunk, delay, size);
+ bitmap_chunk, delay, write_behind, size);
}
}
rv = Build(devlist->devname, mdfd, chunk, level, layout,
raiddisks, devlist->next, assume_clean,
- bitmap_file, bitmap_chunk, delay);
+ bitmap_file, bitmap_chunk, write_behind, delay);
break;
case CREATE:
if (delay == 0) delay = DEFAULT_BITMAP_DELAY;
+ if (write_behind && !bitmap_file) {
+ fprintf(stderr, Name ": write-behind mode requires a bitmap.\n");
+ rv = 1;
+ break;
+ }
if (ss == NULL) {
for(i=0; !ss && superlist[i]; i++)
ss = superlist[i]->match_metadata_desc("default");
}
rv = Create(ss, devlist->devname, mdfd, chunk, level, layout, size<0 ? 0 : size,
- raiddisks, sparedisks,
+ raiddisks, sparedisks, ident.name,
devs_found-1, devlist->next, runstop, verbose, force,
- bitmap_file, bitmap_chunk, delay);
+ bitmap_file, bitmap_chunk, write_behind, delay);
break;
case MISC:
fprintf(stderr, Name ": No devices listed in %s\n", configfile?configfile:DefaultConfFile);
exit(1);
}
- rv = Examine(devlist, scan?!verbose:brief, scan, SparcAdjust, ss);
+ rv = Examine(devlist, scan?(verbose>1?0:verbose+1):brief, scan, SparcAdjust, ss);
} else {
if (devlist == NULL) {
if (devmode=='D' && scan) {
e->dev);
continue;
}
- rv |= Detail(name, !verbose, test);
+ rv |= Detail(name, verbose>1?0:verbose+1, test);
put_md_name(name);
}
} else if (devmode == 'S' && scan) {
for (dv=devlist ; dv; dv=dv->next) {
switch(dv->disposition) {
case 'D':
- rv |= Detail(dv->devname, brief, test); continue;
+ rv |= Detail(dv->devname, brief?1+verbose:0, test); continue;
case 'K': /* Zero superblock */
rv |= Kill(dv->devname, force); continue;
case 'Q':
else if (bitmap_file) {
if (delay == 0) delay = DEFAULT_BITMAP_DELAY;
rv = Grow_addbitmap(devlist->devname, mdfd, bitmap_file,
- bitmap_chunk, delay);
+ bitmap_chunk, delay, write_behind);
} else
fprintf(stderr, Name ": no changes to --grow\n");
break;