From 802ddc375acabf06c0cb5a2716ca3573bc9ca89f Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Fri, 4 Nov 2011 15:51:24 +0100 Subject: qemu-nbd: open the block device after starting the client thread This is cleaner, because we do not need to close the block device when there is an error opening /dev/nbdX. It was done this way only to print errors before daemonizing. At the same time, use atexit to ensure that the block device is closed whenever we exit. Signed-off-by: Paolo Bonzini Signed-off-by: Kevin Wolf --- qemu-nbd.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/qemu-nbd.c b/qemu-nbd.c index 6f84ad01e5..291cba2eaa 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -460,22 +460,6 @@ int main(int argc, char **argv) } } - bdrv_init(); - - bs = bdrv_new("hda"); - - srcpath = argv[optind]; - if ((ret = bdrv_open(bs, srcpath, flags, NULL)) < 0) { - errno = -ret; - err(EXIT_FAILURE, "Failed to bdrv_open '%s'", srcpath); - } - - 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) { /* Open before spawning new threads. In the future, we may * drop privileges after opening. @@ -491,6 +475,23 @@ int main(int argc, char **argv) } } + bdrv_init(); + atexit(bdrv_close_all); + + bs = bdrv_new("hda"); + srcpath = argv[optind]; + if ((ret = bdrv_open(bs, srcpath, 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 (sockpath) { @@ -568,7 +569,6 @@ int main(int argc, char **argv) qemu_vfree(data); close(sharing_fds[0]); - bdrv_close(bs); g_free(sharing_fds); if (sockpath) { unlink(sockpath); -- cgit v1.2.1