diff options
Diffstat (limited to 'glusterfsd/src/glusterfsd.c')
| -rw-r--r-- | glusterfsd/src/glusterfsd.c | 43 | 
1 files changed, 40 insertions, 3 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index 919c048f9b0..1015a130505 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -516,7 +516,7 @@ err:                  xlator_destroy (master);          } -        return -1; +        return 1;  } @@ -1041,6 +1041,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 uint8_t  gf_get_process_mode (char *exec_name) @@ -1642,6 +1652,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; @@ -1655,15 +1666,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->mnt_pid > 0) {                          ret = waitpid (ctx->mnt_pid, &cstatus, 0);                          if (!(ret == ctx->mnt_pid && cstatus == 0)) { @@ -1672,7 +1704,10 @@ daemonize (glusterfs_ctx_t *ctx)                                  exit (1);                          }                  } -                _exit (0); + +                err = 1; +                read (ctx->daemon_pipe[0], (void *)&err, sizeof (err)); +                _exit (err);          }  postfork: @@ -1754,7 +1789,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); @@ -1771,6 +1807,7 @@ glusterfs_volumes_init (glusterfs_ctx_t *ctx)                  goto out;  out: +        emancipate (ctx, ret);          return ret;  }  | 
