qemu-devel
[Top][All Lists]
Advanced

[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
> 
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]