nbd: Allow description when creating NBD blockdev
Allow blockdevs to match the feature already present in qemu-nbd -D. Enhance iotest 223 to cover it. Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <20191114024635.11363-5-eblake@redhat.com>
This commit is contained in:
parent
7bd9d0a9e2
commit
deb6ccb077
@ -144,6 +144,7 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void qmp_nbd_server_add(const char *device, bool has_name, const char *name,
|
void qmp_nbd_server_add(const char *device, bool has_name, const char *name,
|
||||||
|
bool has_description, const char *description,
|
||||||
bool has_writable, bool writable,
|
bool has_writable, bool writable,
|
||||||
bool has_bitmap, const char *bitmap, Error **errp)
|
bool has_bitmap, const char *bitmap, Error **errp)
|
||||||
{
|
{
|
||||||
@ -167,6 +168,11 @@ void qmp_nbd_server_add(const char *device, bool has_name, const char *name,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (has_description && strlen(description) > NBD_MAX_STRING_SIZE) {
|
||||||
|
error_setg(errp, "description '%s' too long", description);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (nbd_export_find(name)) {
|
if (nbd_export_find(name)) {
|
||||||
error_setg(errp, "NBD server already has export named '%s'", name);
|
error_setg(errp, "NBD server already has export named '%s'", name);
|
||||||
return;
|
return;
|
||||||
@ -195,7 +201,8 @@ void qmp_nbd_server_add(const char *device, bool has_name, const char *name,
|
|||||||
writable = false;
|
writable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
exp = nbd_export_new(bs, 0, len, name, NULL, bitmap, !writable, !writable,
|
exp = nbd_export_new(bs, 0, len, name, description, bitmap,
|
||||||
|
!writable, !writable,
|
||||||
NULL, false, on_eject_blk, errp);
|
NULL, false, on_eject_blk, errp);
|
||||||
if (!exp) {
|
if (!exp) {
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -2351,7 +2351,7 @@ void hmp_nbd_server_start(Monitor *mon, const QDict *qdict)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
qmp_nbd_server_add(info->value->device, false, NULL,
|
qmp_nbd_server_add(info->value->device, false, NULL, false, NULL,
|
||||||
true, writable, false, NULL, &local_err);
|
true, writable, false, NULL, &local_err);
|
||||||
|
|
||||||
if (local_err != NULL) {
|
if (local_err != NULL) {
|
||||||
@ -2373,7 +2373,7 @@ void hmp_nbd_server_add(Monitor *mon, const QDict *qdict)
|
|||||||
bool writable = qdict_get_try_bool(qdict, "writable", false);
|
bool writable = qdict_get_try_bool(qdict, "writable", false);
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
|
||||||
qmp_nbd_server_add(device, !!name, name, true, writable,
|
qmp_nbd_server_add(device, !!name, name, false, NULL, true, writable,
|
||||||
false, NULL, &local_err);
|
false, NULL, &local_err);
|
||||||
hmp_handle_error(mon, local_err);
|
hmp_handle_error(mon, local_err);
|
||||||
}
|
}
|
||||||
|
@ -250,9 +250,12 @@
|
|||||||
# @name: Export name. If unspecified, the @device parameter is used as the
|
# @name: Export name. If unspecified, the @device parameter is used as the
|
||||||
# export name. (Since 2.12)
|
# export name. (Since 2.12)
|
||||||
#
|
#
|
||||||
|
# @description: Free-form description of the export, up to 4096 bytes.
|
||||||
|
# (Since 5.0)
|
||||||
|
#
|
||||||
# @writable: Whether clients should be able to write to the device via the
|
# @writable: Whether clients should be able to write to the device via the
|
||||||
# NBD connection (default false).
|
# NBD connection (default false).
|
||||||
|
#
|
||||||
# @bitmap: Also export the dirty bitmap reachable from @device, so the
|
# @bitmap: Also export the dirty bitmap reachable from @device, so the
|
||||||
# NBD client can use NBD_OPT_SET_META_CONTEXT with
|
# NBD client can use NBD_OPT_SET_META_CONTEXT with
|
||||||
# "qemu:dirty-bitmap:NAME" to inspect the bitmap. (since 4.0)
|
# "qemu:dirty-bitmap:NAME" to inspect the bitmap. (since 4.0)
|
||||||
@ -263,8 +266,8 @@
|
|||||||
# Since: 1.3.0
|
# Since: 1.3.0
|
||||||
##
|
##
|
||||||
{ 'command': 'nbd-server-add',
|
{ 'command': 'nbd-server-add',
|
||||||
'data': {'device': 'str', '*name': 'str', '*writable': 'bool',
|
'data': {'device': 'str', '*name': 'str', '*description': 'str',
|
||||||
'*bitmap': 'str' } }
|
'*writable': 'bool', '*bitmap': 'str' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @NbdServerRemoveMode:
|
# @NbdServerRemoveMode:
|
||||||
|
@ -153,7 +153,7 @@ _send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-add",
|
|||||||
"bitmap":"b3"}}' "error" # Missing bitmap
|
"bitmap":"b3"}}' "error" # Missing bitmap
|
||||||
_send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-add",
|
_send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-add",
|
||||||
"arguments":{"device":"n", "name":"n2", "writable":true,
|
"arguments":{"device":"n", "name":"n2", "writable":true,
|
||||||
"bitmap":"b2"}}' "return"
|
"description":"some text", "bitmap":"b2"}}' "return"
|
||||||
$QEMU_NBD_PROG -L -k "$SOCK_DIR/nbd"
|
$QEMU_NBD_PROG -L -k "$SOCK_DIR/nbd"
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
@ -50,7 +50,7 @@ exports available: 0
|
|||||||
{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}}
|
{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}}
|
||||||
{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b3"}}
|
{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b3"}}
|
||||||
{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}}
|
{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}}
|
||||||
{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "writable":true, "bitmap":"b2"}}
|
{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "writable":true, "description":"some text", "bitmap":"b2"}}
|
||||||
{"return": {}}
|
{"return": {}}
|
||||||
exports available: 2
|
exports available: 2
|
||||||
export: 'n'
|
export: 'n'
|
||||||
@ -63,6 +63,7 @@ exports available: 2
|
|||||||
base:allocation
|
base:allocation
|
||||||
qemu:dirty-bitmap:b
|
qemu:dirty-bitmap:b
|
||||||
export: 'n2'
|
export: 'n2'
|
||||||
|
description: some text
|
||||||
size: 4194304
|
size: 4194304
|
||||||
flags: 0xced ( flush fua trim zeroes df cache fast-zero )
|
flags: 0xced ( flush fua trim zeroes df cache fast-zero )
|
||||||
min block: 1
|
min block: 1
|
||||||
@ -130,7 +131,7 @@ exports available: 0
|
|||||||
{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}}
|
{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}}
|
||||||
{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b3"}}
|
{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b3"}}
|
||||||
{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}}
|
{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}}
|
||||||
{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "writable":true, "bitmap":"b2"}}
|
{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "writable":true, "description":"some text", "bitmap":"b2"}}
|
||||||
{"return": {}}
|
{"return": {}}
|
||||||
exports available: 2
|
exports available: 2
|
||||||
export: 'n'
|
export: 'n'
|
||||||
@ -143,6 +144,7 @@ exports available: 2
|
|||||||
base:allocation
|
base:allocation
|
||||||
qemu:dirty-bitmap:b
|
qemu:dirty-bitmap:b
|
||||||
export: 'n2'
|
export: 'n2'
|
||||||
|
description: some text
|
||||||
size: 4194304
|
size: 4194304
|
||||||
flags: 0xced ( flush fua trim zeroes df cache fast-zero )
|
flags: 0xced ( flush fua trim zeroes df cache fast-zero )
|
||||||
min block: 1
|
min block: 1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user