fix mdmon option parsing

running mdmon --takeover --all resulted in a segfault.

Also allow "--all" to be longer so that e.g. md_d127 can
successfully over-write it in the argument list visible
to 'ps'.

Signed-off-by: Luca Berra <bluca@comedia.it>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Luca Berra 2010-02-27 16:07:04 +01:00 committed by NeilBrown
parent fcf5762500
commit eb49460b74
2 changed files with 19 additions and 7 deletions

10
mdmon.8
View File

@ -157,6 +157,14 @@ This tells mdmon to find any active containers and start monitoring
each of them if appropriate. This is normally used with each of them if appropriate. This is normally used with
.B \-\-takeover .B \-\-takeover
late in the boot sequence. late in the boot sequence.
A separate
.I mdmon
process is started for each container as the
.B \-\-all
argument is over-written with the name of the container. To allow for
containers with names longer than 5 characters, this argument can be
arbitrarily extended, e.g. to
.BR \-\-all-active-arrays .
.PP .PP
Note that Note that
@ -228,7 +236,7 @@ filesystem, like the root filesystem, should be remounted read-only.
.SH EXAMPLES .SH EXAMPLES
.B " mdmon \-\-all \-\-takeover" .B " mdmon \-\-all-active-arrays \-\-takeover"
.br .br
Any Any
.I mdmon .I mdmon

16
mdmon.c
View File

@ -247,7 +247,7 @@ static int do_fork(void)
void usage(void) void usage(void)
{ {
fprintf(stderr, "Usage: mdmon /device/name/for/container [target_dir]\n"); fprintf(stderr, "Usage: mdmon [--all] [--takeover] CONTAINER\n");
exit(2); exit(2);
} }
@ -264,19 +264,23 @@ int main(int argc, char *argv[])
int takeover = 0; int takeover = 0;
for (arg = 1; arg < argc; arg++) { for (arg = 1; arg < argc; arg++) {
if (strcmp(argv[arg], "--all") == 0 || if (strncmp(argv[arg], "--all",5) == 0 ||
strcmp(argv[arg], "/proc/mdstat") == 0) strcmp(argv[arg], "/proc/mdstat") == 0) {
container_name = argv[arg];
all = 1; all = 1;
else if (strcmp(argv[arg], "--takeover") == 0) } else if (strcmp(argv[arg], "--takeover") == 0)
takeover = 1; takeover = 1;
else if (container_name == NULL) else if (container_name == NULL)
container_name = argv[arg]; container_name = argv[arg];
else else
usage(); usage();
} }
if (container_name == NULL)
usage();
if (all) { if (all) {
struct mdstat_ent *mdstat, *e; struct mdstat_ent *mdstat, *e;
int container_len = strlen(container_name);
/* launch an mdmon instance for each container found */ /* launch an mdmon instance for each container found */
mdstat = mdstat_read(0, 0); mdstat = mdstat_read(0, 0);
@ -287,8 +291,8 @@ int main(int argc, char *argv[])
/* update cmdline so this mdmon instance can be /* update cmdline so this mdmon instance can be
* distinguished from others in a call to ps(1) * distinguished from others in a call to ps(1)
*/ */
if (strlen(devname) <= strlen(container_name)) { if (strlen(devname) <= container_len) {
memset(container_name, 0, strlen(container_name)); memset(container_name, 0, container_len);
sprintf(container_name, "%s", devname); sprintf(container_name, "%s", devname);
} }
status |= mdmon(devname, e->devnum, 1, status |= mdmon(devname, e->devnum, 1,