From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: mprivozn@redhat.com, aliguori@us.ibm.com, eblake@redhat.com,
jcody@redhat.com, lcapitulino@redhat.com
Subject: [Qemu-devel] [PATCH 08/13] qemu-ga: become_daemon(): reopen standard fds to /dev/null
Date: Tue, 15 May 2012 09:48:54 -0500 [thread overview]
Message-ID: <1337093339-10786-9-git-send-email-mdroth@linux.vnet.ibm.com> (raw)
In-Reply-To: <1337093339-10786-1-git-send-email-mdroth@linux.vnet.ibm.com>
From: Luiz Capitulino <lcapitulino@redhat.com>
This fixes a bug where qemu-ga doesn't suspend the guest because it
fails to detect suspend support even when the guest does support
suspend. This happens because of the way qemu-ga fds are managed in
daemon mode.
When starting qemu-ga with --daemon, become_daemon() will close all
standard fds. This will cause qemu-ga to end up with the following
fds (if started with 'qemu-ga --daemon'):
0 -> /dev/vport0p1
3 -> /run/qemu-ga.pid
Then a guest-suspend-* function is issued. They call bios_supports_mode(),
which will call pipe(), and qemu-ga's fd will be:
0 -> /dev/vport0p1
1 -> pipe:[16247]
2 -> pipe:[16247]
3 -> /run/qemu-ga.pid
bios_supports_mode() forks off a child and blocks waiting for the child
to write something to the pipe. The child, however, closes its reading
end of the pipe _and_ reopen all standard fds to /dev/null. This will
cause the child's fds to be:
0 -> /dev/null
1 -> /dev/null
2 -> /dev/null
3 -> /run/qemu-ga.pid
In other words, the child's writing end of the pipe is now /dev/null.
It writes there and exits. The parent process (blocked on read()) will
get an EOF and interpret this as "something unexpected happened in
the child, let's assume the guest doesn't support suspend". And suspend
will fail.
To solve this problem we have to reopen standard fds to /dev/null
in become_daemon(), instead of closing them.
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
qemu-ga.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/qemu-ga.c b/qemu-ga.c
index 8d53e04..6e7caed 100644
--- a/qemu-ga.c
+++ b/qemu-ga.c
@@ -445,9 +445,9 @@ static void become_daemon(const char *pidfile)
goto fail;
}
- close(STDIN_FILENO);
- close(STDOUT_FILENO);
- close(STDERR_FILENO);
+ reopen_fd_to_null(STDIN_FILENO);
+ reopen_fd_to_null(STDOUT_FILENO);
+ reopen_fd_to_null(STDERR_FILENO);
return;
fail:
--
1.7.4.1
next prev parent reply other threads:[~2012-05-15 14:49 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-15 14:48 [Qemu-devel] [PULL] qemu-ga fixes for 1.1 Michael Roth
2012-05-15 14:48 ` [Qemu-devel] [PATCH 01/13] qapi: add support for command options Michael Roth
2012-05-15 14:48 ` [Qemu-devel] [PATCH 02/13] qemu-ga: don't warn on no command return Michael Roth
2012-05-15 14:48 ` [Qemu-devel] [PATCH 03/13] qemu-ga: guest-shutdown: don't emit a success response Michael Roth
2012-05-15 14:48 ` [Qemu-devel] [PATCH 04/13] qemu-ga: guest-suspend-disk: " Michael Roth
2012-05-15 14:48 ` [Qemu-devel] [PATCH 05/13] qemu-ga: guest-suspend-ram: " Michael Roth
2012-05-15 14:48 ` [Qemu-devel] [PATCH 06/13] qemu-ga: guest-suspend-hybrid: " Michael Roth
2012-05-15 14:48 ` [Qemu-devel] [PATCH 07/13] qemu-ga: make reopen_fd_to_null() public Michael Roth
2012-05-15 14:48 ` Michael Roth [this message]
2012-05-15 14:48 ` [Qemu-devel] [PATCH 09/13] qemu-ga: guest-suspend: make the API synchronous Michael Roth
2012-05-15 14:48 ` [Qemu-devel] [PATCH 10/13] qemu-ga: guest-shutdown: become synchronous Michael Roth
2012-05-15 14:48 ` [Qemu-devel] [PATCH 11/13] qemu-ga: guest-shutdown: use only async-signal-safe functions Michael Roth
2012-05-15 14:48 ` [Qemu-devel] [PATCH 12/13] qemu-ga: fix segv after failure to open log file Michael Roth
2012-05-15 14:48 ` [Qemu-devel] [PATCH 13/13] qemu-ga: align versioning with QEMU_VERSION Michael Roth
2012-05-21 16:51 ` [Qemu-devel] [PULL] qemu-ga fixes for 1.1 Luiz Capitulino
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=1337093339-10786-9-git-send-email-mdroth@linux.vnet.ibm.com \
--to=mdroth@linux.vnet.ibm.com \
--cc=aliguori@us.ibm.com \
--cc=eblake@redhat.com \
--cc=jcody@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=mprivozn@redhat.com \
--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).