[dm-devel] multipath-tools/multipathd main.c clone_platform.h
bmarzins at sourceware.org
bmarzins at sourceware.org
Mon May 12 17:45:29 UTC 2008
CVSROOT: /cvs/dm
Module name: multipath-tools
Branch: RHEL5_FC6
Changes by: bmarzins at sourceware.org 2008-05-12 17:45:28
Modified files:
multipathd : main.c
Removed files:
multipathd : clone_platform.h
Log message:
Better fix for 355961. Instead of using clone(), use fork() and unshare()
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/multipath-tools/multipathd/main.c.diff?cvsroot=dm&only_with_tag=RHEL5_FC6&r1=1.69.2.5&r2=1.69.2.6
http://sourceware.org/cgi-bin/cvsweb.cgi/multipath-tools/multipathd/clone_platform.h.diff?cvsroot=dm&only_with_tag=RHEL5_FC6&r1=1.4.2.1&r2=NONE
--- multipath-tools/multipathd/main.c 2008/01/15 01:34:36 1.69.2.5
+++ multipath-tools/multipathd/main.c 2008/05/12 17:45:28 1.69.2.6
@@ -60,7 +60,6 @@
#include "cli_handlers.h"
#include "lock.h"
#include "waiter.h"
-#include "clone_platform.h"
#include "copy.h"
#define FILE_NAME_SIZE 256
@@ -1537,8 +1536,6 @@
vecs->lock = NULL;
FREE(vecs);
vecs = NULL;
- free_config(conf);
- conf = NULL;
condlog(2, "--------shut down-------");
@@ -1548,6 +1545,14 @@
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
@@ -1559,9 +1564,6 @@
daemonize(void)
{
int pid;
-#ifdef CLONE_NEWNS
- void *child_stack;
-#endif
if( (pid = fork()) < 0){
fprintf(stderr, "Failed first fork : %s\n", strerror(errno));
@@ -1572,35 +1574,19 @@
setsid();
-#ifdef CLONE_NEWNS
-
- child_stack = (void *)malloc(CHILD_STACK_SIZE);
- if (!child_stack) {
- fprintf(stderr, "Failed to allocate child stack : %s\n",
- strerror(errno));
- _exit(1);
- }
-# if defined(__hppa__) || defined(__powerpc64__)
- pid = clone(child, child_stack, CLONE_NEWNS, (void *)1);
-# elif defined(__ia64__)
- pid = clone2(child, child_stack, CHILD_STACK_SIZE, CLONE_NEWNS,
- (void *)1, NULL, NULL, NULL);
-# else
- pid = clone(child, child_stack + CHILD_STACK_SIZE, CLONE_NEWNS,
- (void *)1);
-# endif
- if (pid < 0) {
- fprintf(stderr, "Clone failed : %s\n", strerror(errno));
- _exit(1);
- }
- _exit(0);
-#else
if ( (pid = fork()) < 0){
fprintf(stderr, "Failed second fork : %s\n", strerror(errno));
_exit(1);
}
if (pid != 0)
_exit(0);
+#ifdef CLONE_NEWNS
+ if (unshare(CLONE_NEWNS) < 0) {
+ fprintf(stderr, "Failed to unshare namespace : %s\n", strerror(errno));
+ return child((void *)0);
+ }
+ return child((void *)1);
+#else
return child((void *)0);
#endif
}
More information about the dm-devel
mailing list