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 <pierre.rit...@irisa.fr> > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > 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 > >