block: Catch duplicate IDs in bdrv_new()
Since commit f298d071
, block devices added with blockdev-add don't have
a QemuOpts around in dinfo->opts. Consequently, we can't rely any more
on QemuOpts catching duplicate IDs for block devices.
This patch adds a new check for duplicate IDs to bdrv_new(), and moves
the existing check that the ID isn't already taken for a node-name there
as well.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
9ffe333276
commit
f2d953ec31
11
block.c
11
block.c
|
@ -336,6 +336,17 @@ BlockDriverState *bdrv_new(const char *device_name, Error **errp)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
|
|
||||||
|
if (bdrv_find(device_name)) {
|
||||||
|
error_setg(errp, "Device with id '%s' already exists",
|
||||||
|
device_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (bdrv_find_node(device_name)) {
|
||||||
|
error_setg(errp, "Device with node-name '%s' already exists",
|
||||||
|
device_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
bs = g_malloc0(sizeof(BlockDriverState));
|
bs = g_malloc0(sizeof(BlockDriverState));
|
||||||
QLIST_INIT(&bs->dirty_bitmaps);
|
QLIST_INIT(&bs->dirty_bitmaps);
|
||||||
pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
|
pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
|
||||||
|
|
|
@ -452,12 +452,6 @@ static DriveInfo *blockdev_init(const char *file, QDict *bs_opts,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bdrv_find_node(qemu_opts_id(opts))) {
|
|
||||||
error_setg(errp, "device id=%s is conflicting with a node-name",
|
|
||||||
qemu_opts_id(opts));
|
|
||||||
goto early_err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* init */
|
/* init */
|
||||||
dinfo = g_malloc0(sizeof(*dinfo));
|
dinfo = g_malloc0(sizeof(*dinfo));
|
||||||
dinfo->id = g_strdup(qemu_opts_id(opts));
|
dinfo->id = g_strdup(qemu_opts_id(opts));
|
||||||
|
|
|
@ -72,6 +72,39 @@ run_qemu <<EOF
|
||||||
{ "execute": "quit" }
|
{ "execute": "quit" }
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo === Duplicate ID ===
|
||||||
|
echo
|
||||||
|
|
||||||
|
run_qemu <<EOF
|
||||||
|
{ "execute": "qmp_capabilities" }
|
||||||
|
{ "execute": "blockdev-add",
|
||||||
|
"arguments": {
|
||||||
|
"options": {
|
||||||
|
"driver": "$IMGFMT",
|
||||||
|
"id": "disk",
|
||||||
|
"file": {
|
||||||
|
"driver": "file",
|
||||||
|
"filename": "$TEST_IMG"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{ "execute": "blockdev-add",
|
||||||
|
"arguments": {
|
||||||
|
"options": {
|
||||||
|
"driver": "$IMGFMT",
|
||||||
|
"id": "disk",
|
||||||
|
"file": {
|
||||||
|
"driver": "file",
|
||||||
|
"filename": "$TEST_IMG"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{ "execute": "quit" }
|
||||||
|
EOF
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo === aio=native without O_DIRECT ===
|
echo === aio=native without O_DIRECT ===
|
||||||
echo
|
echo
|
||||||
|
|
|
@ -13,6 +13,19 @@ QMP_VERSION
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "floppy0", "tray-open": true}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "floppy0", "tray-open": true}}
|
||||||
|
|
||||||
|
|
||||||
|
=== Duplicate ID ===
|
||||||
|
|
||||||
|
Testing:
|
||||||
|
QMP_VERSION
|
||||||
|
{"return": {}}
|
||||||
|
{"return": {}}
|
||||||
|
{"error": {"class": "GenericError", "desc": "Device with id 'disk' already exists"}}
|
||||||
|
{"return": {}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN"}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "ide1-cd0", "tray-open": true}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "floppy0", "tray-open": true}}
|
||||||
|
|
||||||
|
|
||||||
=== aio=native without O_DIRECT ===
|
=== aio=native without O_DIRECT ===
|
||||||
|
|
||||||
Testing:
|
Testing:
|
||||||
|
|
Loading…
Reference in New Issue