[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 4/4] qemu-nbd: do not start the block layer in t
From: |
Pierre Riteau |
Subject: |
Re: [Qemu-devel] [PATCH 4/4] qemu-nbd: do not start the block layer in the parent |
Date: |
Fri, 28 Oct 2011 13:56:40 +0200 |
Thanks a lot Paolo, I confirm this patchset fixes the bug!
--
Pierre Riteau -- PhD student, Myriads team, IRISA, Rennes, France
http://perso.univ-rennes1.fr/pierre.riteau/
On 28 oct. 2011, at 12:17, Paolo Bonzini wrote:
> 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