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>
stable-1.0
Paolo Bonzini 2011-11-04 15:51:24 +01:00 committed by Kevin Wolf
parent f1ef5555c2
commit 802ddc375a
1 changed files with 17 additions and 17 deletions

View File

@ -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);