diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2011-11-04 15:51:24 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2011-11-11 14:02:58 +0100 |
commit | 802ddc375acabf06c0cb5a2716ca3573bc9ca89f (patch) | |
tree | 6bcec5b805731e5013e8b0a205e92d04cd1757ee /qemu-nbd.c | |
parent | f1ef5555c24914f8ad4051a20571a5c62022d928 (diff) | |
download | hqemu-802ddc375acabf06c0cb5a2716ca3573bc9ca89f.zip hqemu-802ddc375acabf06c0cb5a2716ca3573bc9ca89f.tar.gz |
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 <pbonzini@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'qemu-nbd.c')
-rw-r--r-- | qemu-nbd.c | 34 |
1 files changed, 17 insertions, 17 deletions
@@ -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); |