All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Repost clvmd bugfix
@ 2011-09-21 11:36 Zdenek Kabelac
  2011-09-21 11:36 ` [PATCH 1/2] Clvmd fix restart Zdenek Kabelac
  2011-09-21 11:36 ` [PATCH 2/2] Clvmd restart cleanup Zdenek Kabelac
  0 siblings, 2 replies; 4+ messages in thread
From: Zdenek Kabelac @ 2011-09-21 11:36 UTC (permalink / raw)
  To: lvm-devel

Reposting this patch:
https://www.redhat.com/archives/lvm-devel/2011-September/msg00048.html

Patch is split into files - 1st is pure bugfix for easy backporting.
Second is cleanup and simplification of the restaring code.

Zdenek Kabelac (2):
  Clvmd fix restart
  Clvmd restart cleanup

 daemons/clvmd/clvmd-command.c |   45 ++++++++++++++++++----------------------
 1 files changed, 20 insertions(+), 25 deletions(-)

-- 
1.7.6.2



^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] Clvmd fix restart
  2011-09-21 11:36 [PATCH 0/2] Repost clvmd bugfix Zdenek Kabelac
@ 2011-09-21 11:36 ` Zdenek Kabelac
  2011-09-21 13:41   ` Milan Broz
  2011-09-21 11:36 ` [PATCH 2/2] Clvmd restart cleanup Zdenek Kabelac
  1 sibling, 1 reply; 4+ messages in thread
From: Zdenek Kabelac @ 2011-09-21 11:36 UTC (permalink / raw)
  To: lvm-devel

Patch fixes two reads in the iteration loop,
where only every second lock is then passed to restarted clvmd.

Also moves initialisation of  'hn' to NULL - since for the first loop
it's already initialized to NULL, while the second loop
needs to start with 'hn' == NULL.

Signed-off-by: Zdenek Kabelac <zkabelac@redhat.com>
---
 daemons/clvmd/clvmd-command.c |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/daemons/clvmd/clvmd-command.c b/daemons/clvmd/clvmd-command.c
index 75f1367..c83e2cf 100644
--- a/daemons/clvmd/clvmd-command.c
+++ b/daemons/clvmd/clvmd-command.c
@@ -369,7 +369,6 @@ static int restart_clvmd(void)
 	DEBUGLOG("clvmd restart requested\n");
 
 	/* Count exclusively-open LVs */
-	hn = NULL;
 	do {
 		hn = get_next_excl_lock(hn, &lv_name);
 		if (lv_name)
@@ -403,6 +402,7 @@ static int restart_clvmd(void)
 	 */
 
 	/* Now add the exclusively-open LVs */
+	hn = NULL;
 	do {
 		hn = get_next_excl_lock(hn, &lv_name);
 		if (lv_name) {
@@ -414,7 +414,6 @@ static int restart_clvmd(void)
 				goto_out;
 
 			DEBUGLOG("excl lock: %s\n", lv_name);
-			hn = get_next_excl_lock(hn, &lv_name);
 		}
 	} while (hn && *lv_name);
 	argv[argc++] = NULL;
-- 
1.7.6.2



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] Clvmd restart cleanup
  2011-09-21 11:36 [PATCH 0/2] Repost clvmd bugfix Zdenek Kabelac
  2011-09-21 11:36 ` [PATCH 1/2] Clvmd fix restart Zdenek Kabelac
@ 2011-09-21 11:36 ` Zdenek Kabelac
  1 sibling, 0 replies; 4+ messages in thread
From: Zdenek Kabelac @ 2011-09-21 11:36 UTC (permalink / raw)
  To: lvm-devel

Patch tries to fix Clang warning about possible access via lv_name NULL pointer.

Also replaces allocation of memory (strdup) with just pointer assigment
(since we are going to call execve anyway).

Also check for  !lv_name only when lv_name is defined
(and as I'm not quite sure what state this really is - putting a FIXME
arround - since this rather looks like some expected situation ??).

Signed-off-by: Zdenek Kabelac <zkabelac@redhat.com>
---
 daemons/clvmd/clvmd-command.c |   42 ++++++++++++++++++----------------------
 1 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/daemons/clvmd/clvmd-command.c b/daemons/clvmd/clvmd-command.c
index c83e2cf..597fb6e 100644
--- a/daemons/clvmd/clvmd-command.c
+++ b/daemons/clvmd/clvmd-command.c
@@ -362,38 +362,39 @@ void cmd_client_cleanup(struct local_client *client)
 static int restart_clvmd(void)
 {
 	char **argv = NULL;
-	char *debug_arg = NULL, *lv_name;
-	int i, argc = 0, max_locks = 0;
+	char *lv_name;
+	int argc = 0, max_locks = 0;
 	struct dm_hash_node *hn = NULL;
+	char debug_arg[16];
+	char e_arg[] = "-E";
+	char clvmd_arg[] = "clvmd";
 
 	DEBUGLOG("clvmd restart requested\n");
 
 	/* Count exclusively-open LVs */
 	do {
 		hn = get_next_excl_lock(hn, &lv_name);
-		if (lv_name)
+		if (lv_name) {
 			max_locks++;
-	} while (hn && *lv_name);
+			if (!*lv_name)
+				break; /* FIXME: Is this error ? */
+		}
+	} while (hn);
 
 	/* clvmd + locks (-E uuid) + debug (-d X) + NULL */
-	argv = malloc((max_locks * 2 + 4) * sizeof(*argv));
-	if (!argv)
+	if (!(argv = malloc((max_locks * 2 + 4) * sizeof(*argv))))
 		goto_out;
 
 	/*
 	 * Build the command-line
 	 */
-	argv[argc++] = strdup("clvmd");
-	if (!argv[0])
-		goto_out;
+	argv[argc++] = clvmd_arg;
 
 	/* Propogate debug options */
 	if (clvmd_get_debug()) {
-		if (!(debug_arg = malloc(16)) ||
-		    dm_snprintf(debug_arg, 16, "-d%u", clvmd_get_debug()) < 0)
+		if (dm_snprintf(debug_arg, sizeof(debug_arg), "-d%u", clvmd_get_debug()) < 0)
 			goto_out;
 		argv[argc++] = debug_arg;
-		debug_arg = NULL;
 	}
 
 	/*
@@ -406,30 +407,25 @@ static int restart_clvmd(void)
 	do {
 		hn = get_next_excl_lock(hn, &lv_name);
 		if (lv_name) {
-			argv[argc] = strdup("-E");
-			if (!argv[argc++])
-				goto_out;
-			argv[argc] = strdup(lv_name);
-			if (!argv[argc++])
-				goto_out;
-
+			if (!*lv_name)
+				break; /* FIXME: Is this error ? */
+			argv[argc++] = e_arg;
+			argv[argc++] = lv_name;
 			DEBUGLOG("excl lock: %s\n", lv_name);
 		}
-	} while (hn && *lv_name);
+	} while (hn);
 	argv[argc++] = NULL;
 
 	/* Exec new clvmd */
 	DEBUGLOG("--- Restarting %s ---\n", CLVMD_PATH);
+
 	/* NOTE: This will fail when downgrading! */
 	execve(CLVMD_PATH, argv, NULL);
 out:
 	/* We failed */
 	DEBUGLOG("Restart of clvmd failed.\n");
 
-	for (i = 0; i < argc && argv[i]; i++)
-		free(argv[i]);
 	free(argv);
-	free(debug_arg);
 
 	return EIO;
 }
-- 
1.7.6.2



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 1/2] Clvmd fix restart
  2011-09-21 11:36 ` [PATCH 1/2] Clvmd fix restart Zdenek Kabelac
@ 2011-09-21 13:41   ` Milan Broz
  0 siblings, 0 replies; 4+ messages in thread
From: Milan Broz @ 2011-09-21 13:41 UTC (permalink / raw)
  To: lvm-devel

On 09/21/2011 01:36 PM, Zdenek Kabelac wrote:
> Patch fixes two reads in the iteration loop,
> where only every second lock is then passed to restarted clvmd.
> 
> Also moves initialisation of  'hn' to NULL - since for the first loop
> it's already initialized to NULL, while the second loop
> needs to start with 'hn' == NULL.

Ack. (I wonder that nobody noticed yet!)

Milan



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-09-21 13:41 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-21 11:36 [PATCH 0/2] Repost clvmd bugfix Zdenek Kabelac
2011-09-21 11:36 ` [PATCH 1/2] Clvmd fix restart Zdenek Kabelac
2011-09-21 13:41   ` Milan Broz
2011-09-21 11:36 ` [PATCH 2/2] Clvmd restart cleanup Zdenek Kabelac

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.