X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=blockdev-nbd.c;h=922cf5657b99f23f4a8afc707c0e0bf79d03bbd0;hb=8b7acc79b9adb4dda6cc867b90e3a1e873f4f7e8;hp=803181307194a100f5f467d94a11f925a3684f06;hpb=8a527317059bb6ece8a01a8d5be92b5452fa5ad0;p=qemu.git diff --git a/blockdev-nbd.c b/blockdev-nbd.c index 803181307..922cf5657 100644 --- a/blockdev-nbd.c +++ b/blockdev-nbd.c @@ -9,15 +9,15 @@ * later. See the COPYING file in the top-level directory. */ -#include "blockdev.h" -#include "hw/block-common.h" -#include "monitor.h" -#include "qerror.h" -#include "sysemu.h" +#include "sysemu/blockdev.h" +#include "hw/block/block.h" +#include "monitor/monitor.h" +#include "qapi/qmp/qerror.h" +#include "sysemu/sysemu.h" #include "qmp-commands.h" #include "trace.h" -#include "nbd.h" -#include "qemu_socket.h" +#include "block/nbd.h" +#include "qemu/sockets.h" static int server_fd = -1; @@ -69,12 +69,6 @@ static void nbd_close_notifier(Notifier *n, void *data) g_free(cn); } -static void nbd_server_put_ref(NBDExport *exp) -{ - BlockDriverState *bs = nbd_export_get_blockdev(exp); - drive_put_ref(drive_get_by_blockdev(bs)); -} - void qmp_nbd_server_add(const char *device, bool has_writable, bool writable, Error **errp) { @@ -82,6 +76,11 @@ void qmp_nbd_server_add(const char *device, bool has_writable, bool writable, NBDExport *exp; NBDCloseNotifier *n; + if (server_fd == -1) { + error_setg(errp, "NBD server not running"); + return; + } + if (nbd_export_find(device)) { error_setg(errp, "NBD server already exporting device '%s'", device); return; @@ -93,11 +92,16 @@ void qmp_nbd_server_add(const char *device, bool has_writable, bool writable, return; } - exp = nbd_export_new(bs, 0, -1, writable ? 0 : NBD_FLAG_READ_ONLY, - nbd_server_put_ref); + if (!has_writable) { + writable = false; + } + if (bdrv_is_read_only(bs)) { + writable = false; + } + + exp = nbd_export_new(bs, 0, -1, writable ? 0 : NBD_FLAG_READ_ONLY, NULL); nbd_export_set_name(exp, device); - drive_get_ref(drive_get_by_blockdev(bs)); n = g_malloc0(sizeof(NBDCloseNotifier)); n->n.notify = nbd_close_notifier; @@ -113,7 +117,9 @@ void qmp_nbd_server_stop(Error **errp) nbd_close_notifier(&cn->n, nbd_export_get_blockdev(cn->exp)); } - qemu_set_fd_handler2(server_fd, NULL, NULL, NULL, NULL); - close(server_fd); - server_fd = -1; + if (server_fd != -1) { + qemu_set_fd_handler2(server_fd, NULL, NULL, NULL, NULL); + close(server_fd); + server_fd = -1; + } }