88 lines
2.5 KiB
Plaintext
88 lines
2.5 KiB
Plaintext
From 50cebd09cf3c79c25638b3c7befeb1219b1a04d9 Mon Sep 17 00:00:00 2001
|
|
From: Hannes Reinecke <hare@suse.de>
|
|
Date: Tue, 29 Apr 2008 13:48:23 +0200
|
|
Subject: [PATCH] libdevmapper prints garbage on shutdown
|
|
|
|
This patch fixes 2 logging bugs:
|
|
o multipath command prints unexpected log message like
|
|
"libdevmapper: libdm-common.c(303): Created /dev/mapper/<mapname>"
|
|
o multipathd doesn't log messages like "--------shut down------"
|
|
during the exit path
|
|
|
|
What is the problem:
|
|
o multipath command and multipathd register dm_write_log() using
|
|
dm_log_init() and it can be called from libdevmapper codes like
|
|
dm_lib_release().
|
|
o dm_write_log() references the global "conf" to find the verbosity,
|
|
but it is freed before dm_lib_release() calls dm_write_log().
|
|
o So dm_write_log() reads garbage value like big vervosity.
|
|
|
|
What does the patch do:
|
|
o multipath command sets NULL to "conf" after freeing it.
|
|
This prevents dm_write_log() from reading garbage data.
|
|
o multipath command and multipathd free "conf" after all logging
|
|
are completed, because the logging functions reference it
|
|
to find the verbosity.
|
|
|
|
Signed-off-by: Kiyoshi Ueda <k-ueda@ct.jp.nec.com>
|
|
Signed-off-by: Hannes Reinecke <hare@suse.de>
|
|
---
|
|
multipath/main.c | 10 +++++++++-
|
|
multipathd/main.c | 10 ++++++++--
|
|
2 files changed, 17 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/multipath/main.c b/multipath/main.c
|
|
index 0f4b2d2..b6ea6fd 100644
|
|
--- a/multipath/main.c
|
|
+++ b/multipath/main.c
|
|
@@ -429,9 +429,17 @@ main (int argc, char *argv[])
|
|
|
|
out:
|
|
sysfs_cleanup();
|
|
- free_config(conf);
|
|
dm_lib_release();
|
|
dm_lib_exit();
|
|
+
|
|
+ /*
|
|
+ * Freeing config must be done after dm_lib_exit(), because
|
|
+ * the logging function (dm_write_log()), which is called there,
|
|
+ * references the config.
|
|
+ */
|
|
+ free_config(conf);
|
|
+ conf = NULL;
|
|
+
|
|
#ifdef _DEBUG_
|
|
dbg_free_final(NULL);
|
|
#endif
|
|
diff --git a/multipathd/main.c b/multipathd/main.c
|
|
index 50e7441..385521c 100644
|
|
--- a/multipathd/main.c
|
|
+++ b/multipathd/main.c
|
|
@@ -1373,8 +1373,6 @@ child (void * param)
|
|
vecs->lock = NULL;
|
|
FREE(vecs);
|
|
vecs = NULL;
|
|
- free_config(conf);
|
|
- conf = NULL;
|
|
|
|
condlog(2, "--------shut down-------");
|
|
|
|
@@ -1384,6 +1382,14 @@ child (void * param)
|
|
dm_lib_release();
|
|
dm_lib_exit();
|
|
|
|
+ /*
|
|
+ * Freeing config must be done after condlog() and dm_lib_exit(),
|
|
+ * because logging functions like dlog() and dm_write_log()
|
|
+ * reference the config.
|
|
+ */
|
|
+ free_config(conf);
|
|
+ conf = NULL;
|
|
+
|
|
#ifdef _DEBUG_
|
|
dbg_free_final(NULL);
|
|
#endif
|
|
--
|
|
1.5.2.4
|
|
|