qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Michael Tokarev <mjt@tls.msk.ru>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] rework daemonizing logic in qemu-nbd
Date: Sun, 15 Jan 2012 17:11:19 +0100	[thread overview]
Message-ID: <4F12FAA7.5000103@redhat.com> (raw)
In-Reply-To: <4F12CB7C.308@msgid.tls.msk.ru>

On 01/15/2012 01:50 PM, Michael Tokarev wrote:
> On 15.01.2012 14:42, Paolo Bonzini wrote:
>> On 01/14/2012 01:39 PM, Michael Tokarev wrote:
>>>            if (pid == 0) {
>>> -            close(stderr_fd[0]);
>>> -            ret = qemu_daemon(0, 0);
>>> -
>>> -            /* Temporarily redirect stderr to the parent's pipe...  */
>>> -            dup2(stderr_fd[1], STDERR_FILENO);
>>> -            if (ret == -1) {
>>> +            int nullfd = open("/dev/null", O_RDWR);
>>> +            if (nullfd<   0 || setsid()<   0) {
>>>                    err(EXIT_FAILURE, "Failed to daemonize");
>>>                }
>>
>> This is forking only once.
>
> Is it good or bad?  There's no need to fork twice.  Second
> fork (to the one which is already done in daemon(3)) has
> been done to work around lack of proper communication between
> parent and child in case of using plain daemon(3).  I.e., due
> to daemon(3) interface being unflexible/unsuitable for the
> current use case.

daemon(3) forks twice (so qemu-nbd is effectively forking three times, 
one of which is unnecessary).

See 
http://stackoverflow.com/questions/881388/what-is-the-reason-for-performing-a-double-fork-when-creating-a-daemon 
for why there is a fork before setsid and one after.

>>> -
>>> -            /* ... close the descriptor we inherited and go on.  */
>>> -            close(stderr_fd[1]);
>>> -        } else {
>>> -            bool errors = false;
>>> -            char *buf;
>>> -
>>> -            /* In the parent.  Print error messages from the child until
>>> -             * it closes the pipe.
>>> +            /* redirect stdin from /dev/null,
>>> +             * stdout (temporarily) to the pipe to parent,
>>
>> This is a bit of a hack.
>
> There's another way -- to keep the writing pipe end in some
> local variable and use that one instead of STDOUT_FILENO.
> I can do it that way for sure, just thought it's already
> using too much local variables.

Yes, that would be better.

>>> +    /* now complete the daemonizing procedure.
>>> +     */
>>> +    if (device&&  !verbose) {
>>> +        if (chdir("/")<  0) {
>>> +            err(EXIT_FAILURE, "unable to chdir to /");
>>> +        }
>>> +        /* this redirects stderr to /dev/null */
>>> +        dup2(STDIN_FILENO, STDERR_FILENO);
>>> +        /* this redirects stdout to /dev/null too, and closes parent pipe */
>>> +        dup2(STDIN_FILENO, STDOUT_FILENO);
>>> +    }
>>> +
>>
>> Half of this is already done in client_thread, and that would be
>> theplace where you should add dup2(0, 1).
>
> I partly disagree.
>
> I wanted to de-couple -c (device) case with daemonizing.
> client_thread only works in -c case, but daemonizing in
> that case is wrong as I already pointed out in another
> email - we should either stop daemonizing here at all
> or have a separate option for it.

We can only clean up standard file descriptors after all initialization 
tasks have been done.  nbd_client_thread could still write error 
messages.  Your patch introduces a race.

>>   Also, the chdir can be moved earlier, after bdrv_open.
>
> There's no need to, afiacs.  We complete init process and
> enter main loop.  Chdir should be done befor entering main
> loop, the rest makes no difference (as long as the files
> we open will be accessible from cwd).

Yes, but I prefer to have the chdir done unconditionally as soon as 
possible.

Paolo

  reply	other threads:[~2012-01-15 16:11 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-14 12:39 [Qemu-devel] [PATCH] rework daemonizing logic in qemu-nbd Michael Tokarev
2012-01-15 10:42 ` Paolo Bonzini
2012-01-15 12:50   ` Michael Tokarev
2012-01-15 16:11     ` Paolo Bonzini [this message]
2012-01-15 16:44       ` Michael Tokarev
2012-01-15 17:31         ` Paolo Bonzini
2012-01-15 17:46           ` Paolo Bonzini
2012-01-16  7:22           ` Michael Tokarev
2012-01-16  7:41             ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F12FAA7.5000103@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=mjt@tls.msk.ru \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).