[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 4/4] qemu-nbd: do not start the block layer in the p
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 4/4] qemu-nbd: do not start the block layer in the parent |
Date: |
Fri, 28 Oct 2011 12:17:57 +0200 |
Forking and threading do not behave very well together. With qemu-nbd in
-c mode it could happen that the thread pool is started in the parent, and
the children (the one actually doing the I/O) is left without working I/O.
Fix this by only running bdrv_init in the child process.
Reported-by: Pierre Riteau <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
qemu-nbd.c | 31 ++++++++++++++-----------------
1 files changed, 14 insertions(+), 17 deletions(-)
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 5031158..962952c 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -371,21 +371,6 @@ int main(int argc, char **argv)
return 0;
}
- bdrv_init();
-
- bs = bdrv_new("hda");
-
- if ((ret = bdrv_open(bs, argv[optind], flags, NULL)) < 0) {
- errno = -ret;
- err(EXIT_FAILURE, "Failed to bdrv_open '%s'", argv[optind]);
- }
-
- fd_size = bs->total_sectors * 512;
-
- if (partition != -1 &&
- find_partition(bs, partition, &dev_offset, &fd_size))
- err(EXIT_FAILURE, "Could not find partition %d", partition);
-
if (device) {
pid_t pid;
int sock;
@@ -418,7 +403,6 @@ int main(int argc, char **argv)
size_t blocksize;
ret = 0;
- bdrv_close(bs);
do {
sock = unix_socket_outgoing(socket);
@@ -473,8 +457,21 @@ int main(int argc, char **argv)
/* children */
}
+ bdrv_init();
+ bs = bdrv_new("hda");
+ if ((ret = bdrv_open(bs, argv[optind], flags, NULL)) < 0) {
+ errno = -ret;
+ err(EXIT_FAILURE, "Failed to bdrv_open '%s'", argv[optind]);
+ }
+
+ fd_size = bs->total_sectors * 512;
+
+ if (partition != -1 &&
+ find_partition(bs, partition, &dev_offset, &fd_size)) {
+ err(EXIT_FAILURE, "Could not find partition %d", partition);
+ }
+
sharing_fds = g_malloc((shared + 1) * sizeof(int));
-
if (socket) {
sharing_fds[0] = unix_socket_incoming(socket);
} else {
--
1.7.6.4
[Qemu-devel] [PATCH 3/4] qemu-nbd: report errors to syslog when daemonized, Paolo Bonzini, 2011/10/28