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:
parent
fcf5762500
commit
eb49460b74
10
mdmon.8
10
mdmon.8
|
@ -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
16
mdmon.c
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue