Skip to content

Commit

Permalink
qapi: add nbd-server-remove
Browse files Browse the repository at this point in the history
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 <[email protected]>
Message-Id: <[email protected]>
[eblake: drop dead nb_clients code]
Signed-off-by: Eric Blake <[email protected]>
  • Loading branch information
Vladimir Sementsov-Ogievskiy authored and ebblake committed Jan 26, 2018
1 parent dba4932 commit a3b0dc7
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 0 deletions.
24 changes: 24 additions & 0 deletions blockdev-nbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
1 change: 1 addition & 0 deletions include/block/nbd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
13 changes: 13 additions & 0 deletions nbd/server.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
41 changes: 41 additions & 0 deletions qapi/block.json
Original file line number Diff line number Diff line change
Expand Up @@ -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:
#
Expand Down

0 comments on commit a3b0dc7

Please sign in to comment.