int require_homehost = 1;
char *mailaddr = NULL;
char *program = NULL;
+ int increments = 20;
int delay = 0;
int daemonise = 0;
char *pidfile = NULL;
program = optarg;
continue;
+ case O(MONITOR,'r'): /* rebuild increments */
+ increments = atoi(optarg);
+ if (increments>99 || increments<1) {
+ fprintf(stderr, Name ": please specify positive integer between 1 and 99 as rebuild increments.\n");
+ exit(2);
+ }
+ continue;
+
case O(MONITOR,'d'): /* delay in seconds */
case O(GROW, 'd'):
case O(BUILD,'d'): /* delay for bitmap updates */
struct mdstat_ent *ms = mdstat_read(0, 1);
struct mdstat_ent *e;
struct map_ent *map = NULL;
+ int members;
int v = verbose>1?0:verbose+1;
+ for (members = 0; members <= 1; members++) {
for (e=ms ; e ; e=e->next) {
char *name;
struct map_ent *me;
+ int member = e->metadata_version &&
+ strncmp(e->metadata_version,
+ "external:/", 10) == 0;
+ if (members != member)
+ continue;
me = map_by_devnum(&map, e->devnum);
if (me && me->path
&& strcmp(me->path, "/unknown") != 0)
export, test,
homehost);
else
- rv |= WaitClean(name, v);
+ rv |= WaitClean(name, -1, v);
put_md_name(name);
}
+ }
free_mdstat(ms);
} else if (devmode == 'S' && scan) {
/* apply --stop to all devices in /proc/mdstat */
export, test, homehost);
continue;
case 'K': /* Zero superblock */
- rv |= Kill(dv->devname, force, quiet,0);
+ if (ss)
+ rv |= Kill(dv->devname, ss, force, quiet,0);
+ else {
+ int q = quiet;
+ do {
+ rv |= Kill(dv->devname, NULL, force, q, 0);
+ q = 1;
+ } while ((rv & 2) == 0);
+ rv &= ~2;
+ }
continue;
case 'Q':
rv |= Query(dv->devname); continue;
case 'W':
rv |= Wait(dv->devname); continue;
case Waitclean:
- rv |= WaitClean(dv->devname, verbose-quiet); continue;
+ rv |= WaitClean(dv->devname, -1, verbose-quiet); continue;
}
mdfd = open_mddev(dv->devname, 1);
if (mdfd>=0) {
}
rv= Monitor(devlist, mailaddr, program,
delay?delay:60, daemonise, scan, oneshot,
- dosyslog, test, pidfile);
+ dosyslog, test, pidfile, increments);
break;
case GROW:
if (array_size >= 0) {
/* alway impose array size first, independent of
* anything else
+ * Do not allow level or raid_disks changes at the
+ * same time as that can be irreversibly destructive.
*/
struct mdinfo sra;
int err;
+ if (raiddisks || level != UnSet) {
+ fprintf(stderr, Name ": cannot change array size in same operation "
+ "as changing raiddisks or level.\n"
+ " Change size first, then check that data is still intact.\n");
+ rv = 1;
+ break;
+ }
sysfs_init(&sra, mdfd, 0);
if (array_size == 0)
err = sysfs_set_str(&sra, NULL, "array_size", "default");