Luca Berra: fix mdmon option parsing

Martin F. Krafft madduck at alioth.debian.org
Mon May 24 09:21:07 UTC 2010


Module: mdadm
Branch: upstream
Commit: eb49460b74f42e23bf284c4ccf92f4b6da2c582d
URL:    http://git.debian.org/?p=pkg-mdadm/mdadm.git;a=commit;h=eb49460b74f42e23bf284c4ccf92f4b6da2c582d

Author: Luca Berra <bluca at comedia.it>
Date:   Sat Feb 27 16:07:04 2010 +0100

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 at comedia.it>
Signed-off-by: NeilBrown <neilb at suse.de>

---

 mdmon.8 |   10 +++++++++-
 mdmon.c |   16 ++++++++++------
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/mdmon.8 b/mdmon.8
index df9dfbc..8a482b3 100644
--- a/mdmon.8
+++ b/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
 .B \-\-takeover
 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
 Note that
@@ -228,7 +236,7 @@ filesystem, like the root filesystem, should be remounted read-only.
 
 .SH EXAMPLES
 
-.B "  mdmon \-\-all \-\-takeover"
+.B "  mdmon \-\-all-active-arrays \-\-takeover"
 .br
 Any
 .I mdmon
diff --git a/mdmon.c b/mdmon.c
index 8e62a68..a3da795 100644
--- a/mdmon.c
+++ b/mdmon.c
@@ -247,7 +247,7 @@ static int do_fork(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);
 }
 
@@ -264,19 +264,23 @@ int main(int argc, char *argv[])
 	int takeover = 0;
 
 	for (arg = 1; arg < argc; arg++) {
-		if (strcmp(argv[arg], "--all") == 0 ||
-		    strcmp(argv[arg], "/proc/mdstat") == 0)
+		if (strncmp(argv[arg], "--all",5) == 0 ||
+		    strcmp(argv[arg], "/proc/mdstat") == 0) {
+			container_name = argv[arg];
 			all = 1;
-		else if (strcmp(argv[arg], "--takeover") == 0)
+		} else if (strcmp(argv[arg], "--takeover") == 0)
 			takeover = 1;
 		else if (container_name == NULL)
 			container_name = argv[arg];
 		else
 			usage();
 	}
+	if (container_name == NULL)
+		usage();
 
 	if (all) {
 		struct mdstat_ent *mdstat, *e;
+		int container_len = strlen(container_name);
 
 		/* launch an mdmon instance for each container found */
 		mdstat = mdstat_read(0, 0);
@@ -287,8 +291,8 @@ int main(int argc, char *argv[])
 				/* update cmdline so this mdmon instance can be
 				 * distinguished from others in a call to ps(1)
 				 */
-				if (strlen(devname) <= strlen(container_name)) {
-					memset(container_name, 0, strlen(container_name));
+				if (strlen(devname) <= container_len) {
+					memset(container_name, 0, container_len);
 					sprintf(container_name, "%s", devname);
 				}
 				status |= mdmon(devname, e->devnum, 1,




More information about the pkg-mdadm-commits mailing list