summaryrefslogtreecommitdiffstats
path: root/glusterfsd/src/glusterfsd.c
diff options
context:
space:
mode:
Diffstat (limited to 'glusterfsd/src/glusterfsd.c')
-rw-r--r--glusterfsd/src/glusterfsd.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c
index 053a7c2461a..e3285658a99 100644
--- a/glusterfsd/src/glusterfsd.c
+++ b/glusterfsd/src/glusterfsd.c
@@ -387,7 +387,7 @@ err:
xlator_destroy (master);
}
- return -1;
+ return 1;
}
@@ -865,6 +865,16 @@ reincarnate (int signum)
return;
}
+void
+emancipate (glusterfs_ctx_t *ctx, int ret)
+{
+ /* break free from the parent */
+ if (ctx->daemon_pipe[1] != -1) {
+ write (ctx->daemon_pipe[1], (void *) &ret, sizeof (ret));
+ close (ctx->daemon_pipe[1]);
+ ctx->daemon_pipe[1] = -1;
+ }
+}
static char *
generate_uuid ()
@@ -1456,6 +1466,7 @@ daemonize (glusterfs_ctx_t *ctx)
int ret = -1;
cmd_args_t *cmd_args = NULL;
int cstatus = 0;
+ int err = 0;
cmd_args = &ctx->cmd_args;
@@ -1469,15 +1480,36 @@ daemonize (glusterfs_ctx_t *ctx)
if (cmd_args->debug_mode)
goto postfork;
+ ret = pipe (ctx->daemon_pipe);
+ if (ret) {
+ /* If pipe() fails, retain daemon_pipe[] = {-1, -1}
+ and parent will just not wait for child status
+ */
+ ctx->daemon_pipe[0] = -1;
+ ctx->daemon_pipe[1] = -1;
+ }
+
ret = os_daemon_return (0, 0);
switch (ret) {
case -1:
+ if (ctx->daemon_pipe[0] != -1) {
+ close (ctx->daemon_pipe[0]);
+ close (ctx->daemon_pipe[1]);
+ }
+
gf_log ("daemonize", GF_LOG_ERROR,
"Daemonization failed: %s", strerror(errno));
goto out;
case 0:
+ /* child */
+ /* close read */
+ close (ctx->daemon_pipe[0]);
break;
default:
+ /* parent */
+ /* close write */
+ close (ctx->daemon_pipe[1]);
+
if (ctx->mtab_pid > 0) {
ret = waitpid (ctx->mtab_pid, &cstatus, 0);
if (!(ret == ctx->mtab_pid && cstatus == 0)) {
@@ -1486,7 +1518,10 @@ daemonize (glusterfs_ctx_t *ctx)
exit (1);
}
}
- _exit (0);
+
+ err = 1;
+ read (ctx->daemon_pipe[0], (void *)&err, sizeof (err));
+ _exit (err);
}
postfork:
@@ -1568,7 +1603,8 @@ glusterfs_volumes_init (glusterfs_ctx_t *ctx)
if (cmd_args->volfile_server) {
ret = glusterfs_mgmt_init (ctx);
- goto out;
+ /* return, do not emancipate() yet */
+ return ret;
}
fp = get_volfp (ctx);
@@ -1585,6 +1621,7 @@ glusterfs_volumes_init (glusterfs_ctx_t *ctx)
goto out;
out:
+ emancipate (ctx, ret);
return ret;
}