[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 3/8] qapi: add nbd-server-remove
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PULL 3/8] qapi: add nbd-server-remove |
Date: |
Fri, 26 Jan 2018 10:04:06 -0600 |
From: Vladimir Sementsov-Ogievskiy <address@hidden>
Add command for removing an export. It is needed for cases when we
don't want to keep the export after the operation on it was completed.
The other example is a temporary node, created with blockdev-add.
If we want to delete it we should firstly remove any corresponding
NBD export.
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
Message-Id: <address@hidden>
[eblake: drop dead nb_clients code]
Signed-off-by: Eric Blake <address@hidden>
---
qapi/block.json | 41 +++++++++++++++++++++++++++++++++++++++++
include/block/nbd.h | 1 +
blockdev-nbd.c | 24 ++++++++++++++++++++++++
nbd/server.c | 13 +++++++++++++
4 files changed, 79 insertions(+)
diff --git a/qapi/block.json b/qapi/block.json
index 353e3a45bdf..c6945240029 100644
--- a/qapi/block.json
+++ b/qapi/block.json
@@ -227,6 +227,47 @@
{ 'command': 'nbd-server-add',
'data': {'device': 'str', '*name': 'str', '*writable': 'bool'} }
+##
+# @NbdServerRemoveMode:
+#
+# Mode for removing an NBD export.
+#
+# @safe: Remove export if there are no existing connections, fail otherwise.
+#
+# @hard: Drop all connections immediately and remove export.
+#
+# Potential additional modes to be added in the future:
+#
+# hide: Just hide export from new clients, leave existing connections as is.
+# Remove export after all clients are disconnected.
+#
+# soft: Hide export from new clients, answer with ESHUTDOWN for all further
+# requests from existing clients.
+#
+# Since: 2.12
+##
+{'enum': 'NbdServerRemoveMode', 'data': ['safe', 'hard']}
+
+##
+# @nbd-server-remove:
+#
+# Remove NBD export by name.
+#
+# @name: Export name.
+#
+# @mode: Mode of command operation. See @NbdServerRemoveMode description.
+# Default is 'safe'.
+#
+# Returns: error if
+# - the server is not running
+# - export is not found
+# - mode is 'safe' and there are existing connections
+#
+# Since: 2.12
+##
+{ 'command': 'nbd-server-remove',
+ 'data': {'name': 'str', '*mode': 'NbdServerRemoveMode'} }
+
##
# @nbd-server-stop:
#
diff --git a/include/block/nbd.h b/include/block/nbd.h
index 978e4433664..ee74ec391a8 100644
--- a/include/block/nbd.h
+++ b/include/block/nbd.h
@@ -261,6 +261,7 @@ NBDExport *nbd_export_new(BlockDriverState *bs, off_t
dev_offset, off_t size,
bool writethrough, BlockBackend *on_eject_blk,
Error **errp);
void nbd_export_close(NBDExport *exp);
+void nbd_export_remove(NBDExport *exp, NbdServerRemoveMode mode, Error **errp);
void nbd_export_get(NBDExport *exp);
void nbd_export_put(NBDExport *exp);
diff --git a/blockdev-nbd.c b/blockdev-nbd.c
index 104789e521c..a9f79c6778e 100644
--- a/blockdev-nbd.c
+++ b/blockdev-nbd.c
@@ -189,6 +189,30 @@ void qmp_nbd_server_add(const char *device, bool has_name,
const char *name,
nbd_export_put(exp);
}
+void qmp_nbd_server_remove(const char *name,
+ bool has_mode, NbdServerRemoveMode mode,
+ Error **errp)
+{
+ NBDExport *exp;
+
+ if (!nbd_server) {
+ error_setg(errp, "NBD server not running");
+ return;
+ }
+
+ exp = nbd_export_find(name);
+ if (exp == NULL) {
+ error_setg(errp, "Export '%s' is not found", name);
+ return;
+ }
+
+ if (!has_mode) {
+ mode = NBD_SERVER_REMOVE_MODE_SAFE;
+ }
+
+ nbd_export_remove(exp, mode, errp);
+}
+
void qmp_nbd_server_stop(Error **errp)
{
nbd_export_close_all();
diff --git a/nbd/server.c b/nbd/server.c
index 6caa8d17be7..112e3f69dff 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -1177,6 +1177,19 @@ void nbd_export_close(NBDExport *exp)
nbd_export_put(exp);
}
+void nbd_export_remove(NBDExport *exp, NbdServerRemoveMode mode, Error **errp)
+{
+ if (mode == NBD_SERVER_REMOVE_MODE_HARD || QTAILQ_EMPTY(&exp->clients)) {
+ nbd_export_close(exp);
+ return;
+ }
+
+ assert(mode == NBD_SERVER_REMOVE_MODE_SAFE);
+
+ error_setg(errp, "export '%s' still in use", exp->name);
+ error_append_hint(errp, "Use mode='hard' to force client disconnect\n");
+}
+
void nbd_export_get(NBDExport *exp)
{
assert(exp->refcount > 0);
--
2.14.3
- [Qemu-devel] [PULL 0/8] NBD patches through 26 Jan, Eric Blake, 2018/01/26
- [Qemu-devel] [PULL 1/8] qapi: add name parameter to nbd-server-add, Eric Blake, 2018/01/26
- [Qemu-devel] [PULL 3/8] qapi: add nbd-server-remove,
Eric Blake <=
- [Qemu-devel] [PULL 7/8] hmp: Add nbd_server_remove to mirror QMP command, Eric Blake, 2018/01/26
- [Qemu-devel] [PULL 6/8] iotest 205: new test for qmp nbd-server-remove, Eric Blake, 2018/01/26
- [Qemu-devel] [PULL 2/8] hmp: Add name parameter to nbd_server_add, Eric Blake, 2018/01/26
- [Qemu-devel] [PULL 5/8] iotests: implement QemuIoInteractive class, Eric Blake, 2018/01/26
- [Qemu-devel] [PULL 4/8] iotest 147: add cases to test new @name parameter of nbd-server-add, Eric Blake, 2018/01/26
- [Qemu-devel] [PULL 8/8] nbd: implement bdrv_get_info callback, Eric Blake, 2018/01/26
- Re: [Qemu-devel] [PULL 0/8] NBD patches through 26 Jan, Peter Maydell, 2018/01/29