[libvirt] [PATCH 00/55] qemu: Add support for -blockdev

In this version everything except blockjobs should work properly. Stats were fixed so that they are properly extracted from the new output in qemu. Additionally I've also fixed the disk resize API which I forgot last time. The blockjobs support is still missing so they either will not work or will mess up internal state. That means that the last patch still should not be pushed leaving this feature dormant until we achieve full feature parity. Peter Krempa (55): tests: qemumonitorjson: Simplify debugging of 'blockInfo' test qemu: Improve errors in qemuDomainBlockResize qemu: monitor: Remove unsupported function check for 'block_resize' qemu: monitor: Remove useless 'locked' property from struct qemuDomainDiskInfo tests: qemucapabilities: Update capability data for qemu 3.0.0 Revert "qemu: monitor: Add the 'query-nodes' argument for query-blockstats" qemu: monitor: Reuse qemuMonitorJSONQueryBlock in qemuMonitorJSONBlockIoThrottleInfo qemu: monitor: Allow using 'id' instead of 'device' for 'block_set_io_throttle' qemu: monitor: Allow using 'qdev' instead of 'device' for getting disk throttling qemu: monitor: Add 'nodename' argument for 'block_resize' tests: qemu: Drop disk from hostdev-mdev tests tests: qemuxml2argv: Fork CAPS_LATEST test cases for 'blockdev' tests: qemu: Add test data for backing chains and indexes qemu: hotplug: Don't generate alias when detaching disk util: virqemu: Simplify debugging if building QOM object with missing args qemu: caps: Add capability for using the blockdev infrastructure qemu: process: clear QEMU_CAPS_BLOCKDEV for VMs where we can't support it qemu: domain: Don't redetect backing chain when using -blockdev qemu: process: Don't detect nodenames when we support -blockdev conf: domain: Format out user provided backing chains in XML qemu: domain: Add infrastructure to generate block node names conf: Implement private data formatting and parsing for disks conf: Allow formatting and parsing of 'index' for disk source image qemu: Use proper backingIndex when reporting stats for backing chain qemu: Add field to store QDEV path of a disk in private data qemu: alias: Generate QDEV name of the block backend for disks qemu: domain: Add field for storing node name for copy-on-read qemu: proces: assign node names for user defined backing chains qemu: block: Add generator for the 'copy-on-read' blockdev driver qemu: domain: Prepare qemuDomainDiskGetBackendAlias for -blockdev qemu: command: format disk source commandline for -blockdev qemu: command: Add helper to check if disk throttling is enabled qemu: process: Setup disk io throttling for -blockdev qemu: driver: Use QOM backend name for disk IO throttling APIs qemu: driver: Prepare qemuDomainBlockResize for blockdev qemu: hotplug: Prepare for blockdev-add/blockdev-del with backing chains qemu: monitor: Add APIs for cdrom tray handling for -blockdev qemu: hotplug: Implement removable media change for -blockdev qemu: driver: Don't copy disk alias in qemuDomainBlocksStatsGather qemu: Explicitly find disks for stats totals qemu: monitor: Retrieve blockstats also by qdev and node-names qemu: monitor: Add APIs for refreshing disk capacity when using -blockdev qemu: driver: Don't pass 'virDomainDiskDefPtr' to qemuDomainGetStatsOneBlock qemu: monitor: Extract 'write-threshold' automatically for -blockdev qemu: Extract exporting of disk block statistics qemu: Extract exporting of the header for block stats qemu: Export stats relevant for the frontend separately qemu: Refactor control flow in qemuDomainGetStatsBlockExportDisk qemu: Report frontend stats only for the frontend entry qemu: Export stats relevant for the storage backend qemu: monitor: Report data also for 'qdev' entry in qemuMonitorJSONGetBlockInfo qemu: Use QOM path with query-block when using -blockdev qemu: driver: Allow using blockdev with qemuDomainBlocksStatsGather qemu: driver: Prepare qemuDomainGetStatsBlock (bulk disk stats) for -blockdev DO NOT APPLY: Enable QEMU_CAPS_BLOCKDEV if 'query-blockstats' works with -blockdev docs/formatdomain.html.in | 7 +- docs/schemas/domaincommon.rng | 19 + src/conf/domain_conf.c | 89 +++- src/conf/domain_conf.h | 7 + src/qemu/qemu_alias.c | 86 ++- src/qemu/qemu_alias.h | 3 +- src/qemu/qemu_block.c | 24 +- src/qemu/qemu_block.h | 2 + src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 94 +++- src/qemu/qemu_command.h | 3 + src/qemu/qemu_domain.c | 173 +++++- src/qemu/qemu_domain.h | 10 +- src/qemu/qemu_driver.c | 419 +++++++++++---- src/qemu/qemu_hotplug.c | 175 +++++- src/qemu/qemu_monitor.c | 98 +++- src/qemu/qemu_monitor.h | 33 +- src/qemu/qemu_monitor_json.c | 395 +++++++++++--- src/qemu/qemu_monitor_json.h | 33 +- src/qemu/qemu_process.c | 82 ++- src/util/virqemu.c | 5 +- .../qemucapabilitiesdata/caps_3.0.0.x86_64.replies | 591 +++------------------ tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml | 9 +- tests/qemumonitorjsontest.c | 34 +- tests/qemustatusxml2xmldata/modern-in.xml | 6 + tests/qemuxml2argvdata/disk-aio.x86_64-2.12.0.args | 37 ++ tests/qemuxml2argvdata/disk-aio.x86_64-latest.args | 19 +- .../disk-backing-chains-index.x86_64-2.12.0.args | 1 + .../disk-backing-chains-index.x86_64-latest.args | 1 + .../qemuxml2argvdata/disk-backing-chains-index.xml | 145 +++++ .../disk-backing-chains-noindex.x86_64-2.12.0.args | 58 ++ .../disk-backing-chains-noindex.x86_64-latest.args | 163 ++++++ .../disk-backing-chains-noindex.xml | 145 +++++ .../qemuxml2argvdata/disk-cache.x86_64-2.12.0.args | 50 ++ .../qemuxml2argvdata/disk-cache.x86_64-latest.args | 50 +- .../disk-cdrom-network.x86_64-2.12.0.args | 41 ++ .../disk-cdrom-network.x86_64-latest.args | 32 +- .../disk-cdrom-tray.x86_64-2.12.0.args | 39 ++ .../disk-cdrom-tray.x86_64-latest.args | 24 +- .../qemuxml2argvdata/disk-cdrom.x86_64-2.12.0.args | 35 ++ .../qemuxml2argvdata/disk-cdrom.x86_64-latest.args | 17 +- .../disk-copy_on_read.x86_64-2.12.0.args | 41 ++ .../disk-copy_on_read.x86_64-latest.args | 19 +- .../disk-detect-zeroes.x86_64-2.12.0.args | 37 ++ .../disk-detect-zeroes.x86_64-latest.args | 17 +- .../disk-error-policy.x86_64-2.12.0.args | 41 ++ .../disk-error-policy.x86_64-latest.args | 30 +- .../disk-floppy.x86_64-2.12.0.args | 35 ++ .../disk-network-gluster.x86_64-2.12.0.args | 44 ++ .../disk-network-gluster.x86_64-latest.args | 32 +- .../disk-network-iscsi.x86_64-2.12.0.args | 63 +++ .../disk-network-iscsi.x86_64-latest.args | 58 +- .../disk-network-nbd.x86_64-2.12.0.args | 46 ++ .../disk-network-nbd.x86_64-latest.args | 41 +- .../disk-network-rbd.x86_64-2.12.0.args | 61 +++ .../disk-network-rbd.x86_64-latest.args | 67 ++- .../disk-network-sheepdog.x86_64-2.12.0.args | 35 ++ .../disk-network-sheepdog.x86_64-latest.args | 16 +- .../disk-network-source-auth.x86_64-2.12.0.args | 47 ++ .../disk-network-source-auth.x86_64-latest.args | 30 +- .../disk-network-tlsx509.x86_64-2.12.0.args | 59 ++ .../disk-network-tlsx509.x86_64-latest.args | 61 ++- .../disk-readonly-disk.x86_64-2.12.0.args | 34 ++ .../disk-readonly-disk.x86_64-latest.args | 14 +- .../disk-shared.x86_64-2.12.0.args | 37 ++ .../disk-shared.x86_64-latest.args | 18 +- ...isk-virtio-scsi-reservations.x86_64-2.12.0.args | 43 ++ ...isk-virtio-scsi-reservations.x86_64-latest.args | 20 +- .../floppy-drive-fat.x86_64-2.12.0.args | 33 ++ .../hostdev-mdev-display-missing-graphics.xml | 6 - ...v-display-spice-egl-headless.x86_64-latest.args | 2 - .../hostdev-mdev-display-spice-egl-headless.xml | 6 - ...ev-mdev-display-spice-opengl.x86_64-latest.args | 2 - .../hostdev-mdev-display-spice-opengl.xml | 6 - ...dev-display-vnc-egl-headless.x86_64-latest.args | 2 - .../hostdev-mdev-display-vnc-egl-headless.xml | 6 - .../hostdev-mdev-display-vnc.x86_64-latest.args | 2 - .../qemuxml2argvdata/hostdev-mdev-display-vnc.xml | 6 - tests/qemuxml2argvdata/hostdev-mdev-display.xml | 6 - .../hostdev-mdev-invalid-target-address.xml | 5 - .../qemuxml2argvdata/hostdev-mdev-precreated.args | 2 - tests/qemuxml2argvdata/hostdev-mdev-precreated.xml | 6 - .../hostdev-mdev-src-address-invalid.xml | 6 - tests/qemuxml2argvtest.c | 24 + .../disk-backing-chains-inactive.xml | 35 ++ .../disk-backing-chains-index-active.xml | 156 ++++++ .../disk-backing-chains-index-inactive.xml | 156 ++++++ .../disk-backing-chains-noindex-active.xml | 156 ++++++ .../disk-backing-chains-noindex-inactive.xml | 156 ++++++ tests/qemuxml2xmloutdata/disk-mirror-inactive.xml | 4 + .../disk-mirror-old-inactive.xml | 4 + tests/qemuxml2xmloutdata/hostdev-mdev-display.xml | 6 - .../qemuxml2xmloutdata/hostdev-mdev-precreated.xml | 6 - tests/qemuxml2xmltest.c | 2 + 95 files changed, 4017 insertions(+), 1087 deletions(-) create mode 100644 tests/qemuxml2argvdata/disk-aio.x86_64-2.12.0.args create mode 120000 tests/qemuxml2argvdata/disk-backing-chains-index.x86_64-2.12.0.args create mode 120000 tests/qemuxml2argvdata/disk-backing-chains-index.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/disk-backing-chains-index.xml create mode 100644 tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/disk-backing-chains-noindex.xml create mode 100644 tests/qemuxml2argvdata/disk-cache.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-cdrom-network.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-cdrom.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-copy_on_read.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-error-policy.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-floppy.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-gluster.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-iscsi.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-nbd.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-rbd.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-sheepdog.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-source-auth.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-readonly-disk.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-shared.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/floppy-drive-fat.x86_64-2.12.0.args create mode 100644 tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml create mode 100644 tests/qemuxml2xmloutdata/disk-backing-chains-index-inactive.xml create mode 100644 tests/qemuxml2xmloutdata/disk-backing-chains-noindex-active.xml create mode 100644 tests/qemuxml2xmloutdata/disk-backing-chains-noindex-inactive.xml -- 2.16.2

Print the differences in case when the expected data does not match. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tests/qemumonitorjsontest.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 1826c4f297..800c26240e 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -1585,12 +1585,29 @@ testQemuMonitorJSONqemuMonitorJSONGetVirtType(const void *data) return ret; } + +static void +testQemuMonitorJSONGetBlockInfoPrint(const struct qemuDomainDiskInfo *d) +{ + VIR_TEST_VERBOSE("removable: %d, tray: %d, tray_open: %d, empty: %d, " + "io_status: %d, nodename: '%s'\n", + d->removable, d->tray, d->tray_open, d->empty, + d->io_status, NULLSTR(d->nodename)); +} + + static int testHashEqualQemuDomainDiskInfo(const void *value1, const void *value2) { const struct qemuDomainDiskInfo *info1 = value1, *info2 = value2; + int ret; + + if ((ret = memcmp(info1, info2, sizeof(*info1))) != 0) { + testQemuMonitorJSONGetBlockInfoPrint(info1); + testQemuMonitorJSONGetBlockInfoPrint(info2); + } - return memcmp(info1, info2, sizeof(*info1)); + return ret; } static int -- 2.16.2

Remove the pointless "empty path" check and use a better error message if the disk was not found. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index fb0d4a8c7a..5a4357d7a1 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -10963,12 +10963,6 @@ qemuDomainBlockResize(virDomainPtr dom, virCheckFlags(VIR_DOMAIN_BLOCK_RESIZE_BYTES, -1); - if (path[0] == '\0') { - virReportError(VIR_ERR_INVALID_ARG, - "%s", _("empty path")); - return -1; - } - /* We prefer operating on bytes. */ if ((flags & VIR_DOMAIN_BLOCK_RESIZE_BYTES) == 0) { if (size > ULLONG_MAX / 1024) { @@ -10996,7 +10990,7 @@ qemuDomainBlockResize(virDomainPtr dom, if (!(disk = virDomainDiskByName(vm->def, path, false))) { virReportError(VIR_ERR_INVALID_ARG, - _("invalid path: %s"), path); + _("disk '%s' was not found in the domain config"), path); goto endjob; } -- 2.16.2

QEMU supports 'block_resize' since 0.14 so we don't need to do explicit checking. Additionally the caller did not use the different value at all. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor_json.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 2921f110a9..0695ec8d2c 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2550,8 +2550,6 @@ qemuMonitorJSONBlockStatsUpdateCapacity(qemuMonitorPtr mon, } -/* Return 0 on success, -1 on failure, or -2 if not supported. Size - * is in bytes. */ int qemuMonitorJSONBlockResize(qemuMonitorPtr mon, const char *device, unsigned long long size) @@ -2570,11 +2568,6 @@ int qemuMonitorJSONBlockResize(qemuMonitorPtr mon, if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) goto cleanup; - if (qemuMonitorJSONHasError(reply, "CommandNotFound")) { - ret = -2; - goto cleanup; - } - if (qemuMonitorJSONCheckError(cmd, reply) < 0) goto cleanup; -- 2.16.2

We don't use it for anything useful so it does not make much sense to extract it. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.h | 1 - src/qemu/qemu_monitor_json.c | 7 ------- tests/qemumonitorjsontest.c | 1 - 3 files changed, 9 deletions(-) diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index bff293fc0a..7b79d77257 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -438,7 +438,6 @@ struct _qemuDomainVcpuPrivate { struct qemuDomainDiskInfo { bool removable; - bool locked; bool tray; bool tray_open; bool empty; diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 0695ec8d2c..2389ebb9aa 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2243,13 +2243,6 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, goto cleanup; } - if (virJSONValueObjectGetBoolean(dev, "locked", &info->locked) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot read %s value"), - "locked"); - goto cleanup; - } - /* 'tray_open' is present only if the device has a tray */ if (virJSONValueObjectGetBoolean(dev, "tray_open", &info->tray_open) == 0) info->tray = true; diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 800c26240e..863fa440a3 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -1647,7 +1647,6 @@ testQemuMonitorJSONqemuMonitorJSONGetBlockInfo(const void *data) if (VIR_ALLOC(info) < 0) goto cleanup; - info->locked = true; info->removable = true; info->tray = true; -- 2.16.2

The diff contains changes from the change of the JSON library reformatting as well as dropping of the preconfig state and adding of the 'qdev' field to output of 'query-blockstats'. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- .../qemucapabilitiesdata/caps_3.0.0.x86_64.replies | 591 +++------------------ tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml | 8 +- 2 files changed, 88 insertions(+), 511 deletions(-) diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.replies index b2f8377248..714fac5a6f 100644 --- a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.replies +++ b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.replies @@ -4,8 +4,7 @@ } { - "return": { - }, + "return": {}, "id": "libvirt-1" } @@ -17,11 +16,11 @@ { "return": { "qemu": { - "micro": 90, + "micro": 93, "minor": 12, "major": 2 }, - "package": "v3.0.0-rc0-31-g633e824037" + "package": "v3.0.0-rc3-17-g09b94ac0f2" }, "id": "libvirt-2" } @@ -175,7 +174,7 @@ "name": "system_wakeup" }, { - "name": "exit-preconfig" + "name": "x-exit-preconfig" }, { "name": "cont" @@ -5346,40 +5345,35 @@ { "name": "max", "typename": "max-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": false }, { "name": "host", "typename": "host-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": false }, { "name": "base", "typename": "base-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": true, "migration-safe": true }, { "name": "qemu64", "typename": "qemu64-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "qemu32", "typename": "qemu32-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -5400,64 +5394,56 @@ { "name": "pentium3", "typename": "pentium3-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "pentium2", "typename": "pentium2-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "pentium", "typename": "pentium-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "n270", "typename": "n270-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "kvm64", "typename": "kvm64-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "kvm32", "typename": "kvm32-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "coreduo", "typename": "coreduo-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "core2duo", "typename": "core2duo-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -5475,16 +5461,14 @@ { "name": "Westmere-IBRS", "typename": "Westmere-IBRS-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Westmere", "typename": "Westmere-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -5525,40 +5509,35 @@ { "name": "Skylake-Client-IBRS", "typename": "Skylake-Client-IBRS-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Skylake-Client", "typename": "Skylake-Client-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "SandyBridge-IBRS", "typename": "SandyBridge-IBRS-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "SandyBridge", "typename": "SandyBridge-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Penryn", "typename": "Penryn-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -5600,32 +5579,28 @@ { "name": "Opteron_G2", "typename": "Opteron_G2-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Opteron_G1", "typename": "Opteron_G1-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Nehalem-IBRS", "typename": "Nehalem-IBRS-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Nehalem", "typename": "Nehalem-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -5650,48 +5625,42 @@ { "name": "IvyBridge-IBRS", "typename": "IvyBridge-IBRS-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "IvyBridge", "typename": "IvyBridge-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Haswell-noTSX-IBRS", "typename": "Haswell-noTSX-IBRS-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Haswell-noTSX", "typename": "Haswell-noTSX-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Haswell-IBRS", "typename": "Haswell-IBRS-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Haswell", "typename": "Haswell-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -5729,48 +5698,42 @@ { "name": "Conroe", "typename": "Conroe-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Broadwell-noTSX-IBRS", "typename": "Broadwell-noTSX-IBRS-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Broadwell-noTSX", "typename": "Broadwell-noTSX-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Broadwell-IBRS", "typename": "Broadwell-IBRS-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Broadwell", "typename": "Broadwell-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "486", "typename": "486-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true } @@ -6065,13 +6028,11 @@ "option": "spice" }, { - "parameters": [ - ], + "parameters": [], "option": "smbios" }, { - "parameters": [ - ], + "parameters": [], "option": "acpi" }, { @@ -6347,8 +6308,7 @@ "option": "icount" }, { - "parameters": [ - ], + "parameters": [], "option": "numa" }, { @@ -6390,13 +6350,11 @@ "option": "realtime" }, { - "parameters": [ - ], + "parameters": [], "option": "tpmdev" }, { - "parameters": [ - ], + "parameters": [], "option": "object" }, { @@ -6700,23 +6658,19 @@ "option": "rtc" }, { - "parameters": [ - ], + "parameters": [], "option": "net" }, { - "parameters": [ - ], + "parameters": [], "option": "nic" }, { - "parameters": [ - ], + "parameters": [], "option": "netdev" }, { - "parameters": [ - ], + "parameters": [], "option": "device" }, { @@ -7193,8 +7147,6 @@ { "name": "query-status", "ret-type": "1", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "0" }, @@ -7246,8 +7198,6 @@ { "name": "watchdog-set-action", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "5" }, @@ -7264,368 +7214,276 @@ { "name": "job-pause", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "8" }, { "name": "job-resume", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "9" }, { "name": "job-cancel", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "10" }, { "name": "job-complete", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "11" }, { "name": "job-dismiss", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "12" }, { "name": "job-finalize", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "13" }, { "name": "query-jobs", "ret-type": "[14]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "x-block-latency-histogram-set", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "15" }, { "name": "query-block", "ret-type": "[16]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-blockstats", "ret-type": "[18]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "17" }, { "name": "query-block-jobs", "ret-type": "[19]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "block_passwd", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "20" }, { "name": "block_resize", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "21" }, { "name": "blockdev-snapshot-sync", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "22" }, { "name": "blockdev-snapshot", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "23" }, { "name": "change-backing-file", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "24" }, { "name": "block-commit", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "25" }, { "name": "drive-backup", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "26" }, { "name": "blockdev-backup", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "27" }, { "name": "query-named-block-nodes", "ret-type": "[28]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "drive-mirror", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "29" }, { "name": "block-dirty-bitmap-add", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "30" }, { "name": "block-dirty-bitmap-remove", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "31" }, { "name": "block-dirty-bitmap-clear", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "31" }, { "name": "x-block-dirty-bitmap-enable", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "31" }, { "name": "x-block-dirty-bitmap-disable", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "31" }, { "name": "x-block-dirty-bitmap-merge", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "32" }, { "name": "x-debug-block-dirty-bitmap-sha256", "ret-type": "33", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "31" }, { "name": "blockdev-mirror", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "34" }, { "name": "block_set_io_throttle", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "35" }, { "name": "block-stream", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "36" }, { "name": "block-job-set-speed", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "37" }, { "name": "block-job-cancel", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "38" }, { "name": "block-job-pause", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "39" }, { "name": "block-job-resume", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "40" }, { "name": "block-job-complete", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "41" }, { "name": "block-job-dismiss", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "42" }, { "name": "block-job-finalize", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "43" }, { "name": "blockdev-add", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "44" }, { "name": "blockdev-del", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "45" }, { "name": "blockdev-create", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "46" }, { "name": "blockdev-open-tray", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "47" }, { "name": "blockdev-close-tray", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "48" }, { "name": "blockdev-remove-medium", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "49" }, { "name": "blockdev-insert-medium", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "50" }, { "name": "blockdev-change-medium", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "51" }, @@ -7672,96 +7530,72 @@ { "name": "block-set-write-threshold", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "60" }, { "name": "x-blockdev-change", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "61" }, { "name": "x-blockdev-set-iothread", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "62" }, { "name": "query-pr-managers", "ret-type": "[63]", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "0" }, { "name": "blockdev-snapshot-internal-sync", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "64" }, { "name": "blockdev-snapshot-delete-internal-sync", "ret-type": "66", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "65" }, { "name": "eject", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "67" }, { "name": "nbd-server-start", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "68" }, { "name": "nbd-server-add", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "69" }, { "name": "nbd-server-remove", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "70" }, { "name": "x-nbd-server-add-bitmap", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "71" }, { "name": "nbd-server-stop", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, @@ -7788,64 +7622,48 @@ { "name": "query-chardev", "ret-type": "[76]", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "0" }, { "name": "query-chardev-backends", "ret-type": "[77]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "ringbuf-write", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "78" }, { "name": "ringbuf-read", "ret-type": "str", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "79" }, { "name": "chardev-add", "ret-type": "81", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "80" }, { "name": "chardev-change", "ret-type": "81", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "82" }, { "name": "chardev-remove", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "83" }, { "name": "chardev-send-break", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "84" }, @@ -7857,32 +7675,24 @@ { "name": "set_link", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "86" }, { "name": "netdev_add", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "87" }, { "name": "netdev_del", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "88" }, { "name": "query-rx-filter", "ret-type": "[90]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "89" }, @@ -7894,88 +7704,66 @@ { "name": "query-rocker", "ret-type": "93", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "92" }, { "name": "query-rocker-ports", "ret-type": "[95]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "94" }, { "name": "query-rocker-of-dpa-flows", "ret-type": "[97]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "96" }, { "name": "query-rocker-of-dpa-groups", "ret-type": "[99]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "98" }, { "name": "query-tpm-models", "ret-type": "[100]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-tpm-types", "ret-type": "[101]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-tpm", "ret-type": "[102]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "set_password", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "103" }, { "name": "expire_password", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "104" }, { "name": "screendump", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "105" }, { "name": "query-spice", "ret-type": "106", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, @@ -8002,24 +7790,18 @@ { "name": "query-vnc", "ret-type": "110", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-vnc-servers", "ret-type": "[111]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "change-vnc-password", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "112" }, @@ -8041,80 +7823,60 @@ { "name": "query-mice", "ret-type": "[116]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "send-key", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "117" }, { "name": "input-send-event", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "118" }, { "name": "query-migrate", "ret-type": "119", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "migrate-set-capabilities", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "120" }, { "name": "query-migrate-capabilities", "ret-type": "[121]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "migrate-set-parameters", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "122" }, { "name": "query-migrate-parameters", "ret-type": "123", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "client_migrate_info", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "124" }, { "name": "migrate-start-postcopy", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, @@ -8131,104 +7893,78 @@ { "name": "x-colo-lost-heartbeat", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "migrate_cancel", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "migrate-continue", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "127" }, { "name": "migrate_set_downtime", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "128" }, { "name": "migrate_set_speed", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "129" }, { "name": "migrate-set-cache-size", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "130" }, { "name": "query-migrate-cache-size", "ret-type": "int", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "migrate", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "131" }, { "name": "migrate-incoming", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "132" }, { "name": "xen-save-devices-state", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "133" }, { "name": "xen-set-replication", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "134" }, { "name": "query-xen-replication-status", "ret-type": "135", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "xen-colo-do-checkpoint", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, @@ -8236,7 +7972,6 @@ "name": "migrate-recover", "ret-type": "0", "allow-oob": true, - "allow-preconfig": false, "meta-type": "command", "arg-type": "136" }, @@ -8244,135 +7979,102 @@ "name": "migrate-pause", "ret-type": "0", "allow-oob": true, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "transaction", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "137" }, { "name": "trace-event-get-state", "ret-type": "[139]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "138" }, { "name": "trace-event-set-state", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "140" }, { "name": "query-qmp-schema", "ret-type": "[141]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "qmp_capabilities", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "142" }, { "name": "query-version", "ret-type": "143", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "0" }, { "name": "query-commands", "ret-type": "[144]", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "0" }, { "name": "add_client", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "145" }, { "name": "query-name", "ret-type": "146", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "0" }, { "name": "query-kvm", "ret-type": "147", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-uuid", "ret-type": "148", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "0" }, { "name": "query-events", "ret-type": "[149]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-cpus", "ret-type": "[150]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-cpus-fast", "ret-type": "[151]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-iothreads", "ret-type": "[152]", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "0" }, { "name": "query-balloon", "ret-type": "153", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, @@ -8384,192 +8086,144 @@ { "name": "query-pci", "ret-type": "[155]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "quit", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "stop", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "system_reset", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "system_powerdown", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "cpu-add", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "156" }, { "name": "memsave", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "157" }, { "name": "pmemsave", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "158" }, { "name": "cont", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { - "name": "exit-preconfig", + "name": "x-exit-preconfig", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "0" }, { "name": "system_wakeup", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "inject-nmi", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "balloon", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "159" }, { "name": "human-monitor-command", "ret-type": "str", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "160" }, { "name": "qom-list", "ret-type": "[162]", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "161" }, { "name": "qom-get", "ret-type": "any", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "163" }, { "name": "qom-set", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "164" }, { "name": "change", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "165" }, { "name": "qom-list-types", "ret-type": "[167]", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "166" }, { "name": "device-list-properties", "ret-type": "[162]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "168" }, { "name": "qom-list-properties", "ret-type": "[162]", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "169" }, { "name": "xen-set-global-dirty-log", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "170" }, { "name": "device_add", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "171" }, { "name": "device_del", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "172" }, @@ -8581,16 +8235,12 @@ { "name": "dump-guest-memory", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "174" }, { "name": "query-dump", "ret-type": "175", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, @@ -8602,152 +8252,114 @@ { "name": "query-dump-guest-memory-capability", "ret-type": "177", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "dump-skeys", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "178" }, { "name": "object-add", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "179" }, { "name": "object-del", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "180" }, { "name": "getfd", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "181" }, { "name": "closefd", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "182" }, { "name": "query-machines", "ret-type": "[183]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-memory-size-summary", "ret-type": "184", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-cpu-definitions", "ret-type": "[185]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-cpu-model-expansion", "ret-type": "187", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "186" }, { "name": "query-cpu-model-comparison", "ret-type": "189", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "188" }, { "name": "query-cpu-model-baseline", "ret-type": "191", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "190" }, { "name": "add-fd", "ret-type": "193", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "192" }, { "name": "remove-fd", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "194" }, { "name": "query-fdsets", "ret-type": "[195]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-target", "ret-type": "196", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-command-line-options", "ret-type": "[198]", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "197" }, { "name": "query-memdev", "ret-type": "[199]", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "0" }, { "name": "query-memory-devices", "ret-type": "[200]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, @@ -8759,8 +8371,6 @@ { "name": "query-acpi-ospm-status", "ret-type": "[202]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, @@ -8772,8 +8382,6 @@ { "name": "rtc-reset-reinjection", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, @@ -8785,56 +8393,42 @@ { "name": "xen-load-devices-state", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "205" }, { "name": "query-gic-capabilities", "ret-type": "[206]", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-hotpluggable-cpus", "ret-type": "[207]", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "0" }, { "name": "query-vm-generation-id", "ret-type": "208", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-sev", "ret-type": "209", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-sev-launch-measure", "ret-type": "210", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, { "name": "query-sev-capabilities", "ret-type": "211", - "allow-oob": false, - "allow-preconfig": false, "meta-type": "command", "arg-type": "0" }, @@ -8846,15 +8440,12 @@ { "name": "set-numa-node", "ret-type": "0", - "allow-oob": false, - "allow-preconfig": true, "meta-type": "command", "arg-type": "213" }, { "name": "0", - "members": [ - ], + "members": [], "meta-type": "object" }, { @@ -9146,6 +8737,11 @@ "default": null, "type": "str" }, + { + "name": "qdev", + "default": null, + "type": "str" + }, { "name": "node-name", "default": null, @@ -16222,10 +15818,7 @@ }, { "name": "allow-oob", - "type": "bool" - }, - { - "name": "allow-preconfig", + "default": null, "type": "bool" } ], @@ -19117,8 +18710,7 @@ }, { "name": "470", - "members": [ - ], + "members": [], "meta-type": "object" }, { @@ -19938,6 +19530,7 @@ "syscall": true, "level": 13, "avx512dq": false, + "x-migrate-smi-count": true, "svm": false, "full-cpuid-auto-level": true, "hv-reset": false, @@ -20602,6 +20195,7 @@ "syscall": true, "level": 13, "avx512dq": false, + "x-migrate-smi-count": true, "svm": false, "full-cpuid-auto-level": true, "hv-reset": false, @@ -20772,8 +20366,7 @@ } { - "return": { - }, + "return": {}, "id": "libvirt-1" } @@ -20787,8 +20380,7 @@ { "name": "max", "typename": "max-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": false }, @@ -20804,24 +20396,21 @@ { "name": "base", "typename": "base-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": true, "migration-safe": true }, { "name": "qemu64", "typename": "qemu64-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "qemu32", "typename": "qemu32-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -20837,72 +20426,63 @@ { "name": "pentium3", "typename": "pentium3-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "pentium2", "typename": "pentium2-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "pentium", "typename": "pentium-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "n270", "typename": "n270-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "kvm64", "typename": "kvm64-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "kvm32", "typename": "kvm32-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "coreduo", "typename": "coreduo-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "core2duo", "typename": "core2duo-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "athlon", "typename": "athlon-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -20918,8 +20498,7 @@ { "name": "Westmere", "typename": "Westmere-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -21049,8 +20628,7 @@ { "name": "Penryn", "typename": "Penryn-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -21095,16 +20673,14 @@ { "name": "Opteron_G2", "typename": "Opteron_G2-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, { "name": "Opteron_G1", "typename": "Opteron_G1-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -21120,8 +20696,7 @@ { "name": "Nehalem", "typename": "Nehalem-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -21296,8 +20871,7 @@ { "name": "Conroe", "typename": "Conroe-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true }, @@ -21386,8 +20960,7 @@ { "name": "486", "typename": "486-x86_64-cpu", - "unavailable-features": [ - ], + "unavailable-features": [], "static": false, "migration-safe": true } @@ -21905,6 +21478,7 @@ "syscall": true, "level": 13, "avx512dq": false, + "x-migrate-smi-count": true, "svm": true, "full-cpuid-auto-level": true, "hv-reset": false, @@ -22569,6 +22143,7 @@ "syscall": true, "level": 13, "avx512dq": false, + "x-migrate-smi-count": true, "svm": true, "full-cpuid-auto-level": true, "hv-reset": false, diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml index 4bc7cfeebc..a2c6085de7 100644 --- a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml @@ -216,10 +216,10 @@ <flag name='usb-storage.werror'/> <flag name='egl-headless'/> <flag name='vfio-pci.display'/> - <version>2012090</version> + <version>2012093</version> <kvmVersion>0</kvmVersion> - <microcodeVersion>438109</microcodeVersion> - <package>v3.0.0-rc0-31-g633e824037</package> + <microcodeVersion>427343</microcodeVersion> + <package>v3.0.0-rc3-17-g09b94ac0f2</package> <arch>x86_64</arch> <hostCPU type='kvm' model='base' migratability='yes'> <property name='phys-bits' type='number' value='0'/> @@ -328,6 +328,7 @@ <property name='syscall' type='boolean' value='true' migratable='yes'/> <property name='level' type='number' value='13'/> <property name='avx512dq' type='boolean' value='false'/> + <property name='x-migrate-smi-count' type='boolean' value='true' migratable='yes'/> <property name='svm' type='boolean' value='false'/> <property name='full-cpuid-auto-level' type='boolean' value='true' migratable='yes'/> <property name='hv-reset' type='boolean' value='false'/> @@ -581,6 +582,7 @@ <property name='syscall' type='boolean' value='true' migratable='yes'/> <property name='level' type='number' value='13'/> <property name='avx512dq' type='boolean' value='false'/> + <property name='x-migrate-smi-count' type='boolean' value='true' migratable='yes'/> <property name='svm' type='boolean' value='true' migratable='yes'/> <property name='full-cpuid-auto-level' type='boolean' value='true' migratable='yes'/> <property name='hv-reset' type='boolean' value='false'/> -- 2.16.2

Turns out that 'query-nodes' is not what we want and the 'query-blockstats' command was in fact buggy. Revert the new field since it's not needed. This reverts commit 50edca1331298bfcb2622e8fe588d493aff9ab68. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_block.c | 2 +- src/qemu/qemu_monitor.c | 8 ++------ src/qemu/qemu_monitor.h | 3 +-- src/qemu/qemu_monitor_json.c | 9 +++------ src/qemu/qemu_monitor_json.h | 3 +-- 5 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 66e6301210..509b0a5210 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -358,7 +358,7 @@ qemuBlockNodeNamesDetect(virQEMUDriverPtr driver, return -1; data = qemuMonitorQueryNamedBlockNodes(qemuDomainGetMonitor(vm)); - blockstats = qemuMonitorQueryBlockstats(qemuDomainGetMonitor(vm), false); + blockstats = qemuMonitorQueryBlockstats(qemuDomainGetMonitor(vm)); if (qemuDomainObjExitMonitor(driver, vm) < 0 || !data || !blockstats) goto cleanup; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 6e0644221b..4f0bbc147d 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2243,19 +2243,15 @@ qemuMonitorGetBlockInfo(qemuMonitorPtr mon) /** * qemuMonitorQueryBlockstats: * @mon: monitor object - * @nodenames: include backing chain nodes with explicitly specified name * * Returns data from a call to 'query-blockstats'. */ virJSONValuePtr -qemuMonitorQueryBlockstats(qemuMonitorPtr mon, - bool nodenames) +qemuMonitorQueryBlockstats(qemuMonitorPtr mon) { QEMU_CHECK_MONITOR_NULL(mon); - VIR_DEBUG("nodenames: %d", nodenames); - - return qemuMonitorJSONQueryBlockstats(mon, nodenames); + return qemuMonitorJSONQueryBlockstats(mon); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 2fa8d5b51d..b8e3ca2ce1 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -563,8 +563,7 @@ int qemuMonitorSetMemoryStatsPeriod(qemuMonitorPtr mon, int qemuMonitorBlockIOStatusToError(const char *status); virHashTablePtr qemuMonitorGetBlockInfo(qemuMonitorPtr mon); -virJSONValuePtr qemuMonitorQueryBlockstats(qemuMonitorPtr mon, - bool nodenames); +virJSONValuePtr qemuMonitorQueryBlockstats(qemuMonitorPtr mon); typedef struct _qemuBlockStats qemuBlockStats; typedef qemuBlockStats *qemuBlockStatsPtr; diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 2389ebb9aa..e20851eeb2 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2362,16 +2362,13 @@ qemuMonitorJSONGetOneBlockStatsInfo(virJSONValuePtr dev, virJSONValuePtr -qemuMonitorJSONQueryBlockstats(qemuMonitorPtr mon, - bool nodenames) +qemuMonitorJSONQueryBlockstats(qemuMonitorPtr mon) { virJSONValuePtr cmd; virJSONValuePtr reply = NULL; virJSONValuePtr ret = NULL; - if (!(cmd = qemuMonitorJSONMakeCommand("query-blockstats", - "B:query-nodes", nodenames, - NULL))) + if (!(cmd = qemuMonitorJSONMakeCommand("query-blockstats", NULL))) return NULL; if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) @@ -2400,7 +2397,7 @@ qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitorPtr mon, size_t i; virJSONValuePtr devices; - if (!(devices = qemuMonitorJSONQueryBlockstats(mon, false))) + if (!(devices = qemuMonitorJSONQueryBlockstats(mon))) return -1; for (i = 0; i < virJSONValueArraySize(devices); i++) { diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 2408ab0c5b..0458d81c0d 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -86,8 +86,7 @@ int qemuMonitorJSONSetMemoryStatsPeriod(qemuMonitorPtr mon, int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, virHashTablePtr table); -virJSONValuePtr qemuMonitorJSONQueryBlockstats(qemuMonitorPtr mon, - bool nodenames); +virJSONValuePtr qemuMonitorJSONQueryBlockstats(qemuMonitorPtr mon); int qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitorPtr mon, virHashTablePtr hash, bool backingChain); -- 2.16.2

The wrapper executes the command and does error detection so there's no need to open-code all of those things. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor_json.c | 37 +++++-------------------------------- 1 file changed, 5 insertions(+), 32 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index e20851eeb2..48439ccae1 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -4817,21 +4817,14 @@ int qemuMonitorJSONOpenGraphics(qemuMonitorPtr mon, goto cleanup; \ } static int -qemuMonitorJSONBlockIoThrottleInfo(virJSONValuePtr result, +qemuMonitorJSONBlockIoThrottleInfo(virJSONValuePtr io_throttle, const char *device, virDomainBlockIoTuneInfoPtr reply) { - virJSONValuePtr io_throttle; int ret = -1; size_t i; bool found = false; - if (!(io_throttle = virJSONValueObjectGetArray(result, "return"))) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _(" block_io_throttle reply was missing device list")); - goto cleanup; - } - for (i = 0; i < virJSONValueArraySize(io_throttle); i++) { virJSONValuePtr temp_dev = virJSONValueArrayGet(io_throttle, i); virJSONValuePtr inserted; @@ -5001,33 +4994,13 @@ int qemuMonitorJSONGetBlockIoThrottle(qemuMonitorPtr mon, virDomainBlockIoTuneInfoPtr reply) { int ret = -1; - virJSONValuePtr cmd = NULL; - virJSONValuePtr result = NULL; + virJSONValuePtr devices = NULL; - cmd = qemuMonitorJSONMakeCommand("query-block", NULL); - if (!cmd) + if (!(devices = qemuMonitorJSONQueryBlock(mon))) return -1; - if (qemuMonitorJSONCommand(mon, cmd, &result) < 0) - goto cleanup; - - if (virJSONValueObjectHasKey(result, "error")) { - if (qemuMonitorJSONHasError(result, "DeviceNotActive")) - virReportError(VIR_ERR_OPERATION_INVALID, - _("No active operation on device: %s"), device); - else if (qemuMonitorJSONHasError(result, "NotSupported")) - virReportError(VIR_ERR_OPERATION_INVALID, - _("Operation is not supported for device: %s"), device); - else - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unexpected error")); - goto cleanup; - } - - ret = qemuMonitorJSONBlockIoThrottleInfo(result, device, reply); - cleanup: - virJSONValueFree(cmd); - virJSONValueFree(result); + ret = qemuMonitorJSONBlockIoThrottleInfo(devices, device, reply); + virJSONValueFree(devices); return ret; } -- 2.16.2

The 'device' argument matches only the legacy drive alias. For blockdev we need to set the throttling for a QOM id and thus we'll need to use the 'id' field. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_monitor.c | 8 +++++--- src/qemu/qemu_monitor.h | 3 ++- src/qemu/qemu_monitor_json.c | 14 ++++++++++---- src/qemu/qemu_monitor_json.h | 3 ++- tests/qemumonitorjsontest.c | 2 +- 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5a4357d7a1..99fd3bebf5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18488,7 +18488,7 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, * via the JSON error code from the block_set_io_throttle call */ qemuDomainObjEnterMonitor(driver, vm); - ret = qemuMonitorSetBlockIoThrottle(priv->mon, device, + ret = qemuMonitorSetBlockIoThrottle(priv->mon, device, NULL, &info, supportMaxOptions, set_fields & QEMU_BLOCK_IOTUNE_SET_GROUP_NAME, supportMaxLengthOptions); diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 4f0bbc147d..2902c3b246 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3444,17 +3444,19 @@ qemuMonitorGetBlockJobInfo(qemuMonitorPtr mon, int qemuMonitorSetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, + const char *drivealias, + const char *qomid, virDomainBlockIoTuneInfoPtr info, bool supportMaxOptions, bool supportGroupNameOption, bool supportMaxLengthOptions) { - VIR_DEBUG("device=%p, info=%p", device, info); + VIR_DEBUG("drivealias=%s, qomid=%s, info=%p", + NULLSTR(drivealias), NULLSTR(qomid), info); QEMU_CHECK_MONITOR(mon); - return qemuMonitorJSONSetBlockIoThrottle(mon, device, info, + return qemuMonitorJSONSetBlockIoThrottle(mon, drivealias, qomid, info, supportMaxOptions, supportGroupNameOption, supportMaxLengthOptions); diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index b8e3ca2ce1..16fc75819f 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -932,7 +932,8 @@ int qemuMonitorOpenGraphics(qemuMonitorPtr mon, bool skipauth); int qemuMonitorSetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, + const char *drivealias, + const char *qomid, virDomainBlockIoTuneInfoPtr info, bool supportMaxOptions, bool supportGroupNameOption, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 48439ccae1..3a1dfb8563 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -4897,7 +4897,8 @@ qemuMonitorJSONBlockIoThrottleInfo(virJSONValuePtr io_throttle, #undef GET_THROTTLE_STATS_OPTIONAL int qemuMonitorJSONSetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, + const char *drivealias, + const char *qomid, virDomainBlockIoTuneInfoPtr info, bool supportMaxOptions, bool supportGroupNameOption, @@ -4907,12 +4908,17 @@ int qemuMonitorJSONSetBlockIoThrottle(qemuMonitorPtr mon, virJSONValuePtr cmd = NULL; virJSONValuePtr result = NULL; virJSONValuePtr args = NULL; + const char *errdev = drivealias; + + if (!errdev) + errdev = qomid; if (!(cmd = qemuMonitorJSONMakeCommand("block_set_io_throttle", NULL))) return -1; if (virJSONValueObjectCreate(&args, - "s:device", device, + "S:device", drivealias, + "S:id", qomid, "U:bps", info->total_bytes_sec, "U:bps_rd", info->read_bytes_sec, "U:bps_wr", info->write_bytes_sec, @@ -4967,10 +4973,10 @@ int qemuMonitorJSONSetBlockIoThrottle(qemuMonitorPtr mon, if (virJSONValueObjectHasKey(result, "error")) { if (qemuMonitorJSONHasError(result, "DeviceNotActive")) { virReportError(VIR_ERR_OPERATION_INVALID, - _("No active operation on device: %s"), device); + _("No active operation on device: %s"), errdev); } else if (qemuMonitorJSONHasError(result, "NotSupported")) { virReportError(VIR_ERR_OPERATION_INVALID, - _("Operation is not supported for device: %s"), device); + _("Operation is not supported for device: %s"), errdev); } else { virJSONValuePtr error = virJSONValueObjectGet(result, "error"); virReportError(VIR_ERR_INTERNAL_ERROR, diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 0458d81c0d..47635f14b1 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -327,7 +327,8 @@ int qemuMonitorJSONOpenGraphics(qemuMonitorPtr mon, bool skipauth); int qemuMonitorJSONSetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, + const char *drivealias, + const char *qomid, virDomainBlockIoTuneInfoPtr info, bool supportMaxOptions, bool supportGroupNameOption, diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 863fa440a3..01e35cee04 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -2146,7 +2146,7 @@ testQemuMonitorJSONqemuMonitorJSONSetBlockIoThrottle(const void *data) goto cleanup; if (qemuMonitorJSONSetBlockIoThrottle(qemuMonitorTestGetMonitor(test), - "drive-virtio-disk1", &info, true, + "drive-virtio-disk1", NULL, &info, true, true, true) < 0) goto cleanup; -- 2.16.2

The 'device' field reported by 'query-block' is empty when -blockdev is used. Add an argument which will allow matching disk by using the qdev id so we can use this code with -blockdev. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_monitor.c | 8 +++++--- src/qemu/qemu_monitor.h | 3 ++- src/qemu/qemu_monitor_json.c | 21 ++++++++++++++------- src/qemu/qemu_monitor_json.h | 3 ++- tests/qemumonitorjsontest.c | 2 +- 6 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 99fd3bebf5..15ec4931eb 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18617,7 +18617,7 @@ qemuDomainGetBlockIoTune(virDomainPtr dom, if (!(device = qemuAliasDiskDriveFromDisk(disk))) goto endjob; qemuDomainObjEnterMonitor(driver, vm); - ret = qemuMonitorGetBlockIoThrottle(priv->mon, device, &reply); + ret = qemuMonitorGetBlockIoThrottle(priv->mon, device, NULL, &reply); if (qemuDomainObjExitMonitor(driver, vm) < 0) goto endjob; if (ret < 0) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 2902c3b246..758942ffcb 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3465,14 +3465,16 @@ qemuMonitorSetBlockIoThrottle(qemuMonitorPtr mon, int qemuMonitorGetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, + const char *drivealias, + const char *qdevid, virDomainBlockIoTuneInfoPtr reply) { - VIR_DEBUG("device=%p, reply=%p", device, reply); + VIR_DEBUG("drivealias=%s, qdevid=%s, reply=%p", + NULLSTR(drivealias), NULLSTR(qdevid), reply); QEMU_CHECK_MONITOR(mon); - return qemuMonitorJSONGetBlockIoThrottle(mon, device, reply); + return qemuMonitorJSONGetBlockIoThrottle(mon, drivealias, qdevid, reply); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 16fc75819f..60418422e9 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -940,7 +940,8 @@ int qemuMonitorSetBlockIoThrottle(qemuMonitorPtr mon, bool supportMaxLengthOptions); int qemuMonitorGetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, + const char *drivealias, + const char *qdevid, virDomainBlockIoTuneInfoPtr reply); int qemuMonitorSystemWakeup(qemuMonitorPtr mon); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 3a1dfb8563..e43447dc53 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -4818,7 +4818,8 @@ int qemuMonitorJSONOpenGraphics(qemuMonitorPtr mon, } static int qemuMonitorJSONBlockIoThrottleInfo(virJSONValuePtr io_throttle, - const char *device, + const char *drivealias, + const char *qdevid, virDomainBlockIoTuneInfoPtr reply) { int ret = -1; @@ -4828,7 +4829,8 @@ qemuMonitorJSONBlockIoThrottleInfo(virJSONValuePtr io_throttle, for (i = 0; i < virJSONValueArraySize(io_throttle); i++) { virJSONValuePtr temp_dev = virJSONValueArrayGet(io_throttle, i); virJSONValuePtr inserted; - const char *current_dev; + const char *current_drive; + const char *current_qdev; if (!temp_dev || virJSONValueGetType(temp_dev) != VIR_JSON_TYPE_OBJECT) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -4837,14 +4839,18 @@ qemuMonitorJSONBlockIoThrottleInfo(virJSONValuePtr io_throttle, goto cleanup; } - if (!(current_dev = virJSONValueObjectGetString(temp_dev, "device"))) { + current_qdev = virJSONValueObjectGetString(temp_dev, "qdev"); + current_drive = virJSONValueObjectGetString(temp_dev, "device"); + + if (!current_drive && !current_qdev) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("block_io_throttle device entry " "was not in expected format")); goto cleanup; } - if (STRNEQ(current_dev, device)) + if ((drivealias && STRNEQ(current_drive, drivealias)) || + (qdevid && STRNEQ(current_qdev, qdevid))) continue; found = true; @@ -4885,7 +4891,7 @@ qemuMonitorJSONBlockIoThrottleInfo(virJSONValuePtr io_throttle, if (!found) { virReportError(VIR_ERR_INTERNAL_ERROR, _("cannot find throttling info for device '%s'"), - device); + drivealias ? drivealias : qdevid); goto cleanup; } ret = 0; @@ -4996,7 +5002,8 @@ int qemuMonitorJSONSetBlockIoThrottle(qemuMonitorPtr mon, } int qemuMonitorJSONGetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, + const char *drivealias, + const char *qdevid, virDomainBlockIoTuneInfoPtr reply) { int ret = -1; @@ -5005,7 +5012,7 @@ int qemuMonitorJSONGetBlockIoThrottle(qemuMonitorPtr mon, if (!(devices = qemuMonitorJSONQueryBlock(mon))) return -1; - ret = qemuMonitorJSONBlockIoThrottleInfo(devices, device, reply); + ret = qemuMonitorJSONBlockIoThrottleInfo(devices, drivealias, qdevid, reply); virJSONValueFree(devices); return ret; } diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 47635f14b1..4d75e04183 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -335,7 +335,8 @@ int qemuMonitorJSONSetBlockIoThrottle(qemuMonitorPtr mon, bool supportMaxLengthOptions); int qemuMonitorJSONGetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, + const char *drivealias, + const char *qdevid, virDomainBlockIoTuneInfoPtr reply); int qemuMonitorJSONSystemWakeup(qemuMonitorPtr mon); diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 01e35cee04..fd54031e40 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -2139,7 +2139,7 @@ testQemuMonitorJSONqemuMonitorJSONSetBlockIoThrottle(const void *data) goto cleanup; if (qemuMonitorJSONGetBlockIoThrottle(qemuMonitorTestGetMonitor(test), - "drive-virtio-disk0", &info) < 0) + "drive-virtio-disk0", NULL, &info) < 0) goto cleanup; if (testValidateGetBlockIoThrottle(&info, &expectedInfo) < 0) -- 2.16.2

Allow referring to individual node name to rezise. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_monitor.c | 12 ++++++++++-- src/qemu/qemu_monitor.h | 3 ++- src/qemu/qemu_monitor_json.c | 4 +++- src/qemu/qemu_monitor_json.h | 3 ++- tests/qemumonitorjsontest.c | 2 +- 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 15ec4931eb..9ee8d33f8d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11005,7 +11005,7 @@ qemuDomainBlockResize(virDomainPtr dom, goto endjob; qemuDomainObjEnterMonitor(driver, vm); - if (qemuMonitorBlockResize(priv->mon, device, size) < 0) { + if (qemuMonitorBlockResize(priv->mon, device, NULL, size) < 0) { ignore_value(qemuDomainObjExitMonitor(driver, vm)); goto endjob; } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 758942ffcb..4dcbd69dce 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2312,13 +2312,21 @@ qemuMonitorBlockStatsUpdateCapacity(qemuMonitorPtr mon, int qemuMonitorBlockResize(qemuMonitorPtr mon, const char *device, + const char *nodename, unsigned long long size) { - VIR_DEBUG("device=%s size=%llu", device, size); + VIR_DEBUG("device=%s nodename=%s size=%llu", + NULLSTR(device), NULLSTR(nodename), size); QEMU_CHECK_MONITOR(mon); - return qemuMonitorJSONBlockResize(mon, device, size); + if ((!device && !nodename) || (device && nodename)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("exactly one of 'device' and 'nodename' need to be specified")); + return -1; + } + + return qemuMonitorJSONBlockResize(mon, device, nodename, size); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 60418422e9..f8f6969ddb 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -596,7 +596,8 @@ int qemuMonitorBlockStatsUpdateCapacity(qemuMonitorPtr mon, ATTRIBUTE_NONNULL(2); int qemuMonitorBlockResize(qemuMonitorPtr mon, - const char *dev_name, + const char *device, + const char *nodename, unsigned long long size); int qemuMonitorSetVNCPassword(qemuMonitorPtr mon, const char *password); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index e43447dc53..de3fcd83d8 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2542,6 +2542,7 @@ qemuMonitorJSONBlockStatsUpdateCapacity(qemuMonitorPtr mon, int qemuMonitorJSONBlockResize(qemuMonitorPtr mon, const char *device, + const char *nodename, unsigned long long size) { int ret = -1; @@ -2549,7 +2550,8 @@ int qemuMonitorJSONBlockResize(qemuMonitorPtr mon, virJSONValuePtr reply = NULL; cmd = qemuMonitorJSONMakeCommand("block_resize", - "s:device", device, + "S:device", device, + "S:node-name", nodename, "U:size", size, NULL); if (!cmd) diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 4d75e04183..19aebef5fb 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -94,7 +94,8 @@ int qemuMonitorJSONBlockStatsUpdateCapacity(qemuMonitorPtr mon, virHashTablePtr stats, bool backingChain); int qemuMonitorJSONBlockResize(qemuMonitorPtr mon, - const char *devce, + const char *device, + const char *nodename, unsigned long long size); int qemuMonitorJSONSetVNCPassword(qemuMonitorPtr mon, diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index fd54031e40..b048c40d7d 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -1320,7 +1320,7 @@ cleanup: \ } GEN_TEST_FUNC(qemuMonitorJSONSetLink, "vnet0", VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DOWN) -GEN_TEST_FUNC(qemuMonitorJSONBlockResize, "vda", 123456) +GEN_TEST_FUNC(qemuMonitorJSONBlockResize, "vda", "asdf", 123456) GEN_TEST_FUNC(qemuMonitorJSONSetVNCPassword, "secret_password") GEN_TEST_FUNC(qemuMonitorJSONSetPassword, "spice", "secret_password", "disconnect") GEN_TEST_FUNC(qemuMonitorJSONExpirePassword, "spice", "123456") -- 2.16.2

The disk is not necessary to test the mdevs. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tests/qemuxml2argvdata/hostdev-mdev-display-missing-graphics.xml | 6 ------ .../hostdev-mdev-display-spice-egl-headless.x86_64-latest.args | 2 -- tests/qemuxml2argvdata/hostdev-mdev-display-spice-egl-headless.xml | 6 ------ .../hostdev-mdev-display-spice-opengl.x86_64-latest.args | 2 -- tests/qemuxml2argvdata/hostdev-mdev-display-spice-opengl.xml | 6 ------ .../hostdev-mdev-display-vnc-egl-headless.x86_64-latest.args | 2 -- tests/qemuxml2argvdata/hostdev-mdev-display-vnc-egl-headless.xml | 6 ------ tests/qemuxml2argvdata/hostdev-mdev-display-vnc.x86_64-latest.args | 2 -- tests/qemuxml2argvdata/hostdev-mdev-display-vnc.xml | 6 ------ tests/qemuxml2argvdata/hostdev-mdev-display.xml | 6 ------ tests/qemuxml2argvdata/hostdev-mdev-invalid-target-address.xml | 5 ----- tests/qemuxml2argvdata/hostdev-mdev-precreated.args | 2 -- tests/qemuxml2argvdata/hostdev-mdev-precreated.xml | 6 ------ tests/qemuxml2argvdata/hostdev-mdev-src-address-invalid.xml | 6 ------ tests/qemuxml2xmloutdata/hostdev-mdev-display.xml | 6 ------ tests/qemuxml2xmloutdata/hostdev-mdev-precreated.xml | 6 ------ 16 files changed, 75 deletions(-) diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-missing-graphics.xml b/tests/qemuxml2argvdata/hostdev-mdev-display-missing-graphics.xml index ea559a6444..55b60ba133 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-display-missing-graphics.xml +++ b/tests/qemuxml2argvdata/hostdev-mdev-display-missing-graphics.xml @@ -14,12 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-i686</emulator> - <disk type='block' device='disk'> - <driver name='qemu' type='raw'/> - <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> <controller type='usb' index='0'> </controller> <controller type='pci' index='0' model='pci-root'/> diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-spice-egl-headless.x86_64-latest.args b/tests/qemuxml2argvdata/hostdev-mdev-display-spice-egl-headless.x86_64-latest.args index 0ac90c81d2..b84869264e 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-display-spice-egl-headless.x86_64-latest.args +++ b/tests/qemuxml2argvdata/hostdev-mdev-display-spice-egl-headless.x86_64-latest.args @@ -23,8 +23,6 @@ file=/tmp/lib/domain--1-QEMUGuest2/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,id=drive-ide0-0-0 \ --device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ -spice port=0,seamless-migration=on \ -display egl-headless \ -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,\ diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-spice-egl-headless.xml b/tests/qemuxml2argvdata/hostdev-mdev-display-spice-egl-headless.xml index c8f10c2f3a..3a686ad2bf 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-display-spice-egl-headless.xml +++ b/tests/qemuxml2argvdata/hostdev-mdev-display-spice-egl-headless.xml @@ -14,12 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-i686</emulator> - <disk type='block' device='disk'> - <driver name='qemu' type='raw'/> - <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> <controller type='usb' index='0'> </controller> <controller type='pci' index='0' model='pci-root'/> diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-spice-opengl.x86_64-latest.args b/tests/qemuxml2argvdata/hostdev-mdev-display-spice-opengl.x86_64-latest.args index 1fd9fdaa16..80c56abfb9 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-display-spice-opengl.x86_64-latest.args +++ b/tests/qemuxml2argvdata/hostdev-mdev-display-spice-opengl.x86_64-latest.args @@ -23,8 +23,6 @@ file=/tmp/lib/domain--1-QEMUGuest2/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,id=drive-ide0-0-0 \ --device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ -spice port=0,gl=on,rendernode=/dev/dri/foo,seamless-migration=on \ -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,\ vram64_size_mb=0,vgamem_mb=16,max_outputs=1,bus=pci.0,addr=0x2 \ diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-spice-opengl.xml b/tests/qemuxml2argvdata/hostdev-mdev-display-spice-opengl.xml index 18c9817608..a632e58a41 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-display-spice-opengl.xml +++ b/tests/qemuxml2argvdata/hostdev-mdev-display-spice-opengl.xml @@ -14,12 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-i686</emulator> - <disk type='block' device='disk'> - <driver name='qemu' type='raw'/> - <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> <controller type='usb' index='0'> </controller> <controller type='pci' index='0' model='pci-root'/> diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-vnc-egl-headless.x86_64-latest.args b/tests/qemuxml2argvdata/hostdev-mdev-display-vnc-egl-headless.x86_64-latest.args index cdf545d0e0..91708d7663 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-display-vnc-egl-headless.x86_64-latest.args +++ b/tests/qemuxml2argvdata/hostdev-mdev-display-vnc-egl-headless.x86_64-latest.args @@ -23,8 +23,6 @@ file=/tmp/lib/domain--1-QEMUGuest2/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,id=drive-ide0-0-0 \ --device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ -vnc 127.0.0.1:0 \ -display egl-headless \ -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,\ diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-vnc-egl-headless.xml b/tests/qemuxml2argvdata/hostdev-mdev-display-vnc-egl-headless.xml index b3eaeeef13..ddcf617692 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-display-vnc-egl-headless.xml +++ b/tests/qemuxml2argvdata/hostdev-mdev-display-vnc-egl-headless.xml @@ -14,12 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-i686</emulator> - <disk type='block' device='disk'> - <driver name='qemu' type='raw'/> - <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> <controller type='usb' index='0'> </controller> <controller type='pci' index='0' model='pci-root'/> diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-vnc.x86_64-latest.args b/tests/qemuxml2argvdata/hostdev-mdev-display-vnc.x86_64-latest.args index 19439afda9..dd84b74183 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-display-vnc.x86_64-latest.args +++ b/tests/qemuxml2argvdata/hostdev-mdev-display-vnc.x86_64-latest.args @@ -23,8 +23,6 @@ file=/tmp/lib/domain--1-QEMUGuest2/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,id=drive-ide0-0-0 \ --device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ -vnc 127.0.0.1:0 \ -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,\ vram64_size_mb=0,vgamem_mb=16,max_outputs=1,bus=pci.0,addr=0x2 \ diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-vnc.xml b/tests/qemuxml2argvdata/hostdev-mdev-display-vnc.xml index f5b3575c04..a70f506865 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-display-vnc.xml +++ b/tests/qemuxml2argvdata/hostdev-mdev-display-vnc.xml @@ -14,12 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-i686</emulator> - <disk type='block' device='disk'> - <driver name='qemu' type='raw'/> - <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> <controller type='usb' index='0'> </controller> <controller type='pci' index='0' model='pci-root'/> diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display.xml b/tests/qemuxml2argvdata/hostdev-mdev-display.xml index f37e08e1b9..ac4e9a7eaa 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-display.xml +++ b/tests/qemuxml2argvdata/hostdev-mdev-display.xml @@ -14,12 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-i686</emulator> - <disk type='block' device='disk'> - <driver name='qemu' type='raw'/> - <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> <controller type='usb' index='0'> </controller> <controller type='pci' index='0' model='pci-root'/> diff --git a/tests/qemuxml2argvdata/hostdev-mdev-invalid-target-address.xml b/tests/qemuxml2argvdata/hostdev-mdev-invalid-target-address.xml index 7251a304a5..a5c10b8401 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-invalid-target-address.xml +++ b/tests/qemuxml2argvdata/hostdev-mdev-invalid-target-address.xml @@ -14,11 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-i686</emulator> - <disk type='block' device='disk'> - <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> <controller type='pci' index='0' model='pci-root'/> diff --git a/tests/qemuxml2argvdata/hostdev-mdev-precreated.args b/tests/qemuxml2argvdata/hostdev-mdev-precreated.args index d523d69406..1b6731f849 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-precreated.args +++ b/tests/qemuxml2argvdata/hostdev-mdev-precreated.args @@ -22,8 +22,6 @@ server,nowait \ -no-acpi \ -boot c \ -usb \ --drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,id=drive-ide0-0-0 \ --device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ -device vfio-pci,id=hostdev0,\ sysfsdev=/sys/bus/mdev/devices/53764d0e-85a0-42b4-af5c-2046b460b1dc,bus=pci.0,\ addr=0x3 diff --git a/tests/qemuxml2argvdata/hostdev-mdev-precreated.xml b/tests/qemuxml2argvdata/hostdev-mdev-precreated.xml index 5b5028f202..a525b23550 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-precreated.xml +++ b/tests/qemuxml2argvdata/hostdev-mdev-precreated.xml @@ -14,12 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-i686</emulator> - <disk type='block' device='disk'> - <driver name='qemu' type='raw'/> - <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> <controller type='usb' index='0'> </controller> <controller type='pci' index='0' model='pci-root'/> diff --git a/tests/qemuxml2argvdata/hostdev-mdev-src-address-invalid.xml b/tests/qemuxml2argvdata/hostdev-mdev-src-address-invalid.xml index 9ec043827f..6a321c8a42 100644 --- a/tests/qemuxml2argvdata/hostdev-mdev-src-address-invalid.xml +++ b/tests/qemuxml2argvdata/hostdev-mdev-src-address-invalid.xml @@ -14,12 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-i686</emulator> - <disk type='block' device='disk'> - <driver name='qemu' type='raw'/> - <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> <controller type='usb' index='0'> </controller> <controller type='pci' index='0' model='pci-root'/> diff --git a/tests/qemuxml2xmloutdata/hostdev-mdev-display.xml b/tests/qemuxml2xmloutdata/hostdev-mdev-display.xml index 94c11b1199..d0a85913ac 100644 --- a/tests/qemuxml2xmloutdata/hostdev-mdev-display.xml +++ b/tests/qemuxml2xmloutdata/hostdev-mdev-display.xml @@ -14,12 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-i686</emulator> - <disk type='block' device='disk'> - <driver name='qemu' type='raw'/> - <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> <controller type='usb' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> </controller> diff --git a/tests/qemuxml2xmloutdata/hostdev-mdev-precreated.xml b/tests/qemuxml2xmloutdata/hostdev-mdev-precreated.xml index 2ee24dec2d..9d35fac366 100644 --- a/tests/qemuxml2xmloutdata/hostdev-mdev-precreated.xml +++ b/tests/qemuxml2xmloutdata/hostdev-mdev-precreated.xml @@ -14,12 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-i686</emulator> - <disk type='block' device='disk'> - <driver name='qemu' type='raw'/> - <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> <controller type='usb' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> </controller> -- 2.16.2

The blockdev support will change existing approach to add disks to VMs so all tests using the DO_TEST_CAPS_LATEST approach which have any disks need to be forked so that the changes can be applied. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tests/qemuxml2argvdata/disk-aio.x86_64-2.12.0.args | 37 +++++++++++++ .../qemuxml2argvdata/disk-cache.x86_64-2.12.0.args | 50 +++++++++++++++++ .../disk-cdrom-network.x86_64-2.12.0.args | 41 ++++++++++++++ .../disk-cdrom-tray.x86_64-2.12.0.args | 39 ++++++++++++++ .../qemuxml2argvdata/disk-cdrom.x86_64-2.12.0.args | 35 ++++++++++++ .../disk-copy_on_read.x86_64-2.12.0.args | 41 ++++++++++++++ .../disk-detect-zeroes.x86_64-2.12.0.args | 37 +++++++++++++ .../disk-error-policy.x86_64-2.12.0.args | 41 ++++++++++++++ .../disk-floppy.x86_64-2.12.0.args | 35 ++++++++++++ .../disk-network-gluster.x86_64-2.12.0.args | 44 +++++++++++++++ .../disk-network-iscsi.x86_64-2.12.0.args | 63 ++++++++++++++++++++++ .../disk-network-nbd.x86_64-2.12.0.args | 46 ++++++++++++++++ .../disk-network-rbd.x86_64-2.12.0.args | 61 +++++++++++++++++++++ .../disk-network-sheepdog.x86_64-2.12.0.args | 35 ++++++++++++ .../disk-network-source-auth.x86_64-2.12.0.args | 47 ++++++++++++++++ .../disk-network-tlsx509.x86_64-2.12.0.args | 59 ++++++++++++++++++++ .../disk-readonly-disk.x86_64-2.12.0.args | 34 ++++++++++++ .../disk-shared.x86_64-2.12.0.args | 37 +++++++++++++ ...isk-virtio-scsi-reservations.x86_64-2.12.0.args | 43 +++++++++++++++ .../floppy-drive-fat.x86_64-2.12.0.args | 33 ++++++++++++ tests/qemuxml2argvtest.c | 20 +++++++ 21 files changed, 878 insertions(+) create mode 100644 tests/qemuxml2argvdata/disk-aio.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-cache.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-cdrom-network.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-cdrom.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-copy_on_read.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-error-policy.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-floppy.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-gluster.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-iscsi.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-nbd.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-rbd.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-sheepdog.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-source-auth.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-readonly-disk.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-shared.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/floppy-drive-fat.x86_64-2.12.0.args diff --git a/tests/qemuxml2argvdata/disk-aio.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-aio.x86_64-2.12.0.args new file mode 100644 index 0000000000..1dfade0882 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-aio.x86_64-2.12.0.args @@ -0,0 +1,37 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-ide0-0-0,\ +cache=none,aio=native \ +-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1,\ +write-cache=on \ +-drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,id=drive-ide0-1-0,\ +readonly=on,aio=threads \ +-device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-cache.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-cache.x86_64-2.12.0.args new file mode 100644 index 0000000000..9220e6bee9 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-cache.x86_64-2.12.0.args @@ -0,0 +1,50 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.6,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-device lsi,id=scsi0,bus=pci.0,addr=0x2 \ +-drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-ide0-0-0,\ +cache=writeback \ +-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1,\ +write-cache=on \ +-drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-ide0-0-1,\ +cache=unsafe \ +-device ide-hd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,\ +write-cache=on \ +-drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-scsi0-0-0,\ +cache=none \ +-device scsi-hd,bus=scsi0.0,scsi-id=0,drive=drive-scsi0-0-0,id=scsi0-0-0,\ +write-cache=on \ +-drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-virtio-disk0,\ +cache=writethrough \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,\ +id=virtio-disk0,write-cache=off \ +-drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-usb-disk1,\ +cache=directsync \ +-device usb-storage,bus=usb.0,port=1,drive=drive-usb-disk1,id=usb-disk1,\ +removable=off,write-cache=off \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-cdrom-network.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-cdrom-network.x86_64-2.12.0.args new file mode 100644 index 0000000000..0ce8497840 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-cdrom-network.x86_64-2.12.0.args @@ -0,0 +1,41 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-1.2,accel=kvm,usb=off,dump-guest-core=off \ +-m 1024 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=ftp://host.name:21/url/path/file.iso,format=raw,if=none,\ +id=drive-ide0-0-0,readonly=on \ +-device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ +-drive file=ftps://host.name:990/url/path/file.iso,format=raw,if=none,\ +id=drive-ide0-0-1,readonly=on \ +-device ide-cd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1 \ +-drive file=https://host.name:443/url/path/file.iso,format=raw,if=none,\ +id=drive-ide0-1-0,readonly=on \ +-device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-drive file=tftp://host.name:69/url/path/file.iso,format=raw,if=none,\ +id=drive-ide0-1-1,readonly=on \ +-device ide-cd,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-2.12.0.args new file mode 100644 index 0000000000..79863e456d --- /dev/null +++ b/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-2.12.0.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name guest=test,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-test/master-key.aes \ +-machine pc-0.13,accel=tcg,usb=off,dump-guest-core=off \ +-m 1024 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 3fa02811-7832-34bd-004d-1ff56a9286ff \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot menu=on,strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=/var/lib/libvirt/images/f14.img,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=2 \ +-drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,format=raw,if=none,\ +id=drive-ide0-1-0,readonly=on \ +-device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=1 \ +-drive if=none,id=drive-ide0-1-1,readonly=on \ +-device ide-cd,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-cdrom.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-cdrom.x86_64-2.12.0.args new file mode 100644 index 0000000000..59607258eb --- /dev/null +++ b/tests/qemuxml2argvdata/disk-cdrom.x86_64-2.12.0.args @@ -0,0 +1,35 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \ +-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ +-drive file=/root/boot.iso,format=raw,if=none,id=drive-ide0-1-0,readonly=on \ +-device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-drive if=none,id=drive-ide0-1-1,readonly=on \ +-device ide-cd,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-2.12.0.args new file mode 100644 index 0000000000..f2b5dbe050 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-2.12.0.args @@ -0,0 +1,41 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name guest=test,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-test/master-key.aes \ +-machine pc-0.13,accel=tcg,usb=off,dump-guest-core=off \ +-m 1024 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 468404ad-d49c-40f2-9e14-02294f9c1be3 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot menu=on,strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x6 \ +-drive file=/var/lib/libvirt/images/f14.img,format=qcow2,if=none,\ +id=drive-virtio-disk0,copy-on-read=on \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=2 \ +-drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,format=raw,if=none,\ +id=drive-ide0-1-0,readonly=on \ +-device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=1 \ +-netdev user,id=hostnet0 \ +-device virtio-net-pci,tx=bh,netdev=hostnet0,id=net0,mac=52:54:00:e5:48:58,\ +bus=pci.0,addr=0x2 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-2.12.0.args new file mode 100644 index 0000000000..101c0f2e65 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-2.12.0.args @@ -0,0 +1,37 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name guest=test,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-test/master-key.aes \ +-machine pc-0.13,accel=tcg,usb=off,dump-guest-core=off \ +-m 1024 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 92d7a226-cfae-425b-a6d3-00bbf9ec5c9e \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot menu=on,strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=/var/lib/libvirt/images/f14.img,format=qcow2,if=none,\ +id=drive-virtio-disk0,discard=unmap,detect-zeroes=unmap \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=2 \ +-drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,format=raw,if=none,\ +id=drive-ide0-1-0,readonly=on,discard=ignore,detect-zeroes=on \ +-device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=1 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-error-policy.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-error-policy.x86_64-2.12.0.args new file mode 100644 index 0000000000..ebdddfd43a --- /dev/null +++ b/tests/qemuxml2argvdata/disk-error-policy.x86_64-2.12.0.args @@ -0,0 +1,41 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-ide0-0-0,\ +werror=stop,rerror=stop,cache=none \ +-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1,\ +write-cache=on \ +-drive file=/dev/HostVG/QEMUGuest2,format=qcow2,if=none,id=drive-ide0-0-1,\ +werror=enospc,cache=none \ +-device ide-hd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,\ +write-cache=on \ +-drive file=/dev/HostVG/QEMUGuest3,format=qcow2,if=none,id=drive-ide0-1-0,\ +werror=report,rerror=ignore,cache=none \ +-device ide-hd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,\ +write-cache=on \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-floppy.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-floppy.x86_64-2.12.0.args new file mode 100644 index 0000000000..38b04040bc --- /dev/null +++ b/tests/qemuxml2argvdata/disk-floppy.x86_64-2.12.0.args @@ -0,0 +1,35 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \ +-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ +-drive file=/dev/fd0,format=raw,if=none,id=drive-fdc0-0-0 \ +-global isa-fdc.driveA=drive-fdc0-0-0 \ +-drive file=/tmp/firmware.img,format=raw,if=none,id=drive-fdc0-0-1 \ +-global isa-fdc.driveB=drive-fdc0-0-1 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-network-gluster.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-network-gluster.x86_64-2.12.0.args new file mode 100644 index 0000000000..c463db0ed5 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-network-gluster.x86_64-2.12.0.args @@ -0,0 +1,44 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=gluster://example.org:6000/Volume1/Image,file.debug=4,format=raw,\ +if=none,id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-drive 'file=gluster+unix:///Volume2/Image?socket=/path/to/sock,file.debug=4,\ +format=raw,if=none,id=drive-virtio-disk1' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk1,\ +id=virtio-disk1 \ +-drive file.driver=gluster,file.volume=Volume3,file.path=Image.qcow2,\ +file.server.0.type=tcp,file.server.0.host=example.org,file.server.0.port=6000,\ +file.server.1.type=tcp,file.server.1.host=example.org,file.server.1.port=24007,\ +file.server.2.type=unix,file.server.2.socket=/path/to/sock,file.debug=4,\ +format=qcow2,if=none,id=drive-virtio-disk2 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk2,\ +id=virtio-disk2 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-network-iscsi.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-network-iscsi.x86_64-2.12.0.args new file mode 100644 index 0000000000..4b648a985d --- /dev/null +++ b/tests/qemuxml2argvdata/disk-network-iscsi.x86_64-2.12.0.args @@ -0,0 +1,63 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x2 \ +-drive file.driver=iscsi,file.portal=example.org:6000,\ +file.target=iqn.1992-01.com.example,file.lun=0,file.transport=tcp,format=raw,\ +if=none,id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-drive file.driver=iscsi,file.portal=example.org:6000,\ +file.target=iqn.1992-01.com.example,file.lun=1,file.transport=tcp,format=raw,\ +if=none,id=drive-virtio-disk1 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk1,\ +id=virtio-disk1 \ +-object secret,id=virtio-disk2-secret0,\ +data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ +keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ +-drive file.driver=iscsi,file.portal=example.org:6000,\ +file.target=iqn.1992-01.com.example:storage,file.lun=1,file.transport=tcp,\ +file.user=myname,file.password-secret=virtio-disk2-secret0,format=raw,if=none,\ +id=drive-virtio-disk2 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk2,\ +id=virtio-disk2 \ +-object secret,id=virtio-disk3-secret0,\ +data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ +keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ +-drive file.driver=iscsi,file.portal=example.org:6000,\ +file.target=iqn.1992-01.com.example:storage,file.lun=2,file.transport=tcp,\ +file.user=myname,file.password-secret=virtio-disk3-secret0,format=raw,if=none,\ +id=drive-virtio-disk3 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk3,\ +id=virtio-disk3 \ +-drive file.driver=iscsi,file.portal=example.org:3260,\ +file.target=iqn.1992-01.com.example,file.lun=0,file.transport=tcp,format=raw,\ +if=none,id=drive-scsi0-0-0-0 \ +-device scsi-block,bus=scsi0.0,channel=0,scsi-id=0,lun=0,\ +drive=drive-scsi0-0-0-0,id=scsi0-0-0-0 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-network-nbd.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-network-nbd.x86_64-2.12.0.args new file mode 100644 index 0000000000..86bde153ee --- /dev/null +++ b/tests/qemuxml2argvdata/disk-network-nbd.x86_64-2.12.0.args @@ -0,0 +1,46 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=nbd:example.org:6000,format=raw,if=none,id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-drive file=nbd:example.org:6000:exportname=bar,format=raw,if=none,\ +id=drive-virtio-disk1 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk1,\ +id=virtio-disk1 \ +-drive 'file=nbd://[::1]:6000,format=raw,if=none,id=drive-virtio-disk2' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk2,\ +id=virtio-disk2 \ +-drive 'file=nbd://[::1]:6000/bar,format=raw,if=none,id=drive-virtio-disk3' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk3,\ +id=virtio-disk3 \ +-drive file=nbd:unix:/var/run/nbdsock:exportname=bar,format=raw,if=none,\ +id=drive-virtio-disk4 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk4,\ +id=virtio-disk4 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-network-rbd.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-network-rbd.x86_64-2.12.0.args new file mode 100644 index 0000000000..aa562b7afc --- /dev/null +++ b/tests/qemuxml2argvdata/disk-network-rbd.x86_64-2.12.0.args @@ -0,0 +1,61 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive 'file=rbd:pool/image:auth_supported=none:mon_host=mon1.example.org\:\ +6321\;mon2.example.org\:6322\;mon3.example.org\:6322,format=raw,if=none,\ +id=drive-virtio-disk0' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-drive file=rbd:pool/image@asdf:auth_supported=none,format=raw,if=none,\ +id=drive-virtio-disk1 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk1,\ +id=virtio-disk1 \ +-drive 'file=rbd:pool/image@foo:auth_supported=none:mon_host=mon1.example.org\:\ +6321\;mon2.example.org\:6322\;mon3.example.org\:6322,format=raw,if=none,\ +id=drive-virtio-disk2' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk2,\ +id=virtio-disk2 \ +-drive file=rbd:pool/image@foo:auth_supported=none:conf=/blah/test.conf,\ +format=raw,if=none,id=drive-virtio-disk3 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk3,\ +id=virtio-disk3 \ +-object secret,id=virtio-disk4-secret0,\ +data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ +keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ +-drive 'file=rbd:pool/image:id=myname:auth_supported=cephx\;none:\ +mon_host=mon1.example.org\:6321\;mon2.example.org\:6322\;mon3.example.org\:\ +6322,file.password-secret=virtio-disk4-secret0,format=raw,if=none,\ +id=drive-virtio-disk4' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk4,\ +id=virtio-disk4 \ +-drive 'file=rbd:pool/image:auth_supported=none:mon_host=[\:\:1]\:\ +6321\;example.org\:6789\;[ffff\:1234\:567\:abc\:\:0f]\:6322\;[2001\:db8\:\:\ +ff00\:42\:8329]\:6322,format=raw,if=none,id=drive-virtio-disk5' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk5,\ +id=virtio-disk5 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-network-sheepdog.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-network-sheepdog.x86_64-2.12.0.args new file mode 100644 index 0000000000..9ade05b3ba --- /dev/null +++ b/tests/qemuxml2argvdata/disk-network-sheepdog.x86_64-2.12.0.args @@ -0,0 +1,35 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=/dev/HostVG/QEMU,,Guest,,,,1,format=raw,if=none,id=drive-ide0-0-0 \ +-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ +-drive file=sheepdog:example.org:6000:image,,with,,commas,format=raw,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-network-source-auth.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-network-source-auth.x86_64-2.12.0.args new file mode 100644 index 0000000000..a585b0350d --- /dev/null +++ b/tests/qemuxml2argvdata/disk-network-source-auth.x86_64-2.12.0.args @@ -0,0 +1,47 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-object secret,id=virtio-disk0-secret0,\ +data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ +keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ +-drive file.driver=iscsi,file.portal=example.org:6000,\ +file.target=iqn.1992-01.com.example:storage,file.lun=1,file.transport=tcp,\ +file.user=myname,file.password-secret=virtio-disk0-secret0,format=raw,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-object secret,id=virtio-disk1-secret0,\ +data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ +keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ +-drive 'file=rbd:pool/image:id=myname:auth_supported=cephx\;none:\ +mon_host=mon1.example.org\:6321\;mon2.example.org\:6322\;mon3.example.org\:\ +6322,file.password-secret=virtio-disk1-secret0,format=raw,if=none,\ +id=drive-virtio-disk1' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk1,\ +id=virtio-disk1 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-2.12.0.args new file mode 100644 index 0000000000..5752685514 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-2.12.0.args @@ -0,0 +1,59 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu32 \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/libvirt-vxhs/dummy,\ +,path,endpoint=client,verify-peer=yes \ +-drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ +file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ +file.server.host=192.168.0.1,file.server.port=9999,format=raw,if=none,\ +id=drive-virtio-disk0,cache=none \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1,write-cache=on,\ +serial=eb90327c-8302-4725-9e1b-4e85ed4dc251 \ +-object tls-creds-x509,id=objvirtio-disk1_tls0,dir=/etc/pki/libvirt-vxhs/dummy,\ +,path,endpoint=client,verify-peer=yes \ +-drive file.driver=vxhs,file.tls-creds=objvirtio-disk1_tls0,\ +file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc252,\ +file.server.host=192.168.0.2,file.server.port=9999,format=raw,if=none,\ +id=drive-virtio-disk1,cache=none \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk1,\ +id=virtio-disk1,write-cache=on,serial=eb90327c-8302-4725-9e1b-4e85ed4dc252 \ +-drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc253,\ +file.server.host=192.168.0.3,file.server.port=9999,format=raw,if=none,\ +id=drive-virtio-disk2,cache=none \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk2,\ +id=virtio-disk2,write-cache=on,serial=eb90327c-8302-4725-9e1b-4e85ed4dc252 \ +-object tls-creds-x509,id=objvirtio-disk3_tls0,dir=/etc/pki/libvirt-nbd/dummy,,\ +path,endpoint=client,verify-peer=yes \ +-drive file.driver=nbd,file.server.type=inet,file.server.host=example.com,\ +file.server.port=1234,file.tls-creds=objvirtio-disk3_tls0,format=raw,if=none,\ +id=drive-virtio-disk3,cache=none \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk3,\ +id=virtio-disk3,write-cache=on \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-readonly-disk.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-readonly-disk.x86_64-2.12.0.args new file mode 100644 index 0000000000..5c33067c83 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-readonly-disk.x86_64-2.12.0.args @@ -0,0 +1,34 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \ +-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ +-drive file=/dev/sr0,format=raw,if=none,id=drive-ide0-1-0,readonly=on \ +-device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-shared.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-shared.x86_64-2.12.0.args new file mode 100644 index 0000000000..96d8063abb --- /dev/null +++ b/tests/qemuxml2argvdata/disk-shared.x86_64-2.12.0.args @@ -0,0 +1,37 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0,\ +cache=none \ +-device ide-hd,bus=ide.0,unit=0,share-rw=on,drive=drive-ide0-0-0,id=ide0-0-0,\ +bootindex=1,write-cache=on,serial=XYZXYZXYZYXXYZYZYXYZY \ +-drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,id=drive-ide0-1-0,\ +readonly=on \ +-device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-2.12.0.args new file mode 100644 index 0000000000..1173dac674 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-2.12.0.args @@ -0,0 +1,43 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-object pr-manager-helper,id=pr-helper0,\ +path=/tmp/lib/domain--1-QEMUGuest1/pr-helper0.sock \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 8,sockets=8,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-device virtio-scsi-pci,id=scsi0,num_queues=8,bus=pci.0,addr=0x3 \ +-drive file=/dev/HostVG/QEMUGuest1,file.pr-manager=pr-helper0,format=raw,\ +if=none,id=drive-scsi0-0-0-0 \ +-device scsi-block,bus=scsi0.0,channel=0,scsi-id=0,lun=0,\ +drive=drive-scsi0-0-0-0,id=scsi0-0-0-0,bootindex=1 \ +-object pr-manager-helper,id=pr-helper-scsi0-0-0-1,\ +path=/path/to/qemu-pr-helper.sock \ +-drive file=/dev/HostVG/QEMUGuest2,file.pr-manager=pr-helper-scsi0-0-0-1,\ +format=raw,if=none,id=drive-scsi0-0-0-1 \ +-device scsi-block,bus=scsi0.0,channel=0,scsi-id=0,lun=1,\ +drive=drive-scsi0-0-0-1,id=scsi0-0-0-1 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/floppy-drive-fat.x86_64-2.12.0.args b/tests/qemuxml2argvdata/floppy-drive-fat.x86_64-2.12.0.args new file mode 100644 index 0000000000..70b373c016 --- /dev/null +++ b/tests/qemuxml2argvdata/floppy-drive-fat.x86_64-2.12.0.args @@ -0,0 +1,33 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=fat:floppy:/var/somefiles,if=none,id=drive-fdc0-0-0,readonly=on \ +-global isa-fdc.driveA=drive-fdc0-0-0 \ +-global isa-fdc.bootindexA=1 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 84117a3e63..1b09fe608c 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -989,14 +989,18 @@ mymain(void) QEMU_CAPS_VIRTIO_SCSI); DO_TEST("nosharepages", QEMU_CAPS_MEM_MERGE); DO_TEST("disk-cdrom", NONE); + DO_TEST_CAPS_VER("disk-cdrom", "2.12.0"); DO_TEST_CAPS_LATEST("disk-cdrom"); DO_TEST("disk-iscsi", NONE); DO_TEST("disk-cdrom-network", QEMU_CAPS_KVM); + DO_TEST_CAPS_VER("disk-cdrom-network", "2.12.0"); DO_TEST_CAPS_LATEST("disk-cdrom-network"); DO_TEST("disk-cdrom-tray", QEMU_CAPS_VIRTIO_TX_ALG); + DO_TEST_CAPS_VER("disk-cdrom-tray", "2.12.0"); DO_TEST_CAPS_LATEST("disk-cdrom-tray"); DO_TEST("disk-floppy", NONE); + DO_TEST_CAPS_VER("disk-floppy", "2.12.0"); DO_TEST_CAPS_LATEST("disk-floppy"); DO_TEST_FAILURE("disk-floppy-pseries", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE); @@ -1020,8 +1024,10 @@ mymain(void) QEMU_CAPS_DRIVE_BOOT); DO_TEST("floppy-drive-fat", QEMU_CAPS_DRIVE_BOOT); + DO_TEST_CAPS_VER("floppy-drive-fat", "2.12.0"); DO_TEST_CAPS_LATEST("floppy-drive-fat"); DO_TEST("disk-readonly-disk", NONE); + DO_TEST_CAPS_VER("disk-readonly-disk", "2.12.0"); DO_TEST_CAPS_LATEST("disk-readonly-disk"); DO_TEST("disk-fmt-qcow", QEMU_CAPS_DRIVE_BOOT); @@ -1029,37 +1035,47 @@ mymain(void) DO_TEST_PARSE_ERROR("disk-fmt-dir", QEMU_CAPS_DRIVE_BOOT); DO_TEST_PARSE_ERROR("disk-fmt-iso", QEMU_CAPS_DRIVE_BOOT); DO_TEST("disk-shared", NONE); + DO_TEST_CAPS_VER("disk-shared", "2.12.0"); DO_TEST_CAPS_LATEST("disk-shared"); DO_TEST_PARSE_ERROR("disk-shared-qcow", NONE); DO_TEST("disk-shared-locking", QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_DISK_SHARE_RW); DO_TEST("disk-error-policy", NONE); + DO_TEST_CAPS_VER("disk-error-policy", "2.12.0"); DO_TEST_CAPS_LATEST("disk-error-policy"); DO_TEST("disk-cache", QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_USB_STORAGE); DO_TEST_CAPS_VER("disk-cache", "2.6.0"); DO_TEST_CAPS_VER("disk-cache", "2.7.0"); + DO_TEST_CAPS_VER("disk-cache", "2.12.0"); DO_TEST_CAPS_LATEST("disk-cache"); DO_TEST("disk-network-nbd", NONE); + DO_TEST_CAPS_VER("disk-network-nbd", "2.12.0"); DO_TEST_CAPS_LATEST("disk-network-nbd"); DO_TEST("disk-network-iscsi", QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_BLOCK); + DO_TEST_CAPS_VER("disk-network-iscsi", "2.12.0"); DO_TEST_CAPS_LATEST("disk-network-iscsi"); DO_TEST_PARSE_ERROR("disk-network-iscsi-auth-secrettype-invalid", NONE); DO_TEST_PARSE_ERROR("disk-network-iscsi-auth-wrong-secrettype", NONE); DO_TEST_PARSE_ERROR("disk-network-source-auth-both", NONE); DO_TEST("disk-network-gluster", QEMU_CAPS_GLUSTER_DEBUG_LEVEL); + DO_TEST_CAPS_VER("disk-network-gluster", "2.12.0"); DO_TEST_CAPS_LATEST("disk-network-gluster"); DO_TEST_CAPS_VER("disk-network-rbd", "2.5.0"); + DO_TEST_CAPS_VER("disk-network-rbd", "2.12.0"); DO_TEST_CAPS_LATEST("disk-network-rbd"); DO_TEST_FAILURE("disk-network-rbd-no-colon", NONE); DO_TEST("disk-network-sheepdog", NONE); + DO_TEST_CAPS_VER("disk-network-sheepdog", "2.12.0"); DO_TEST_CAPS_LATEST("disk-network-sheepdog"); DO_TEST("disk-network-source-auth", NONE); + DO_TEST_CAPS_VER("disk-network-source-auth", "2.12.0"); DO_TEST_CAPS_LATEST("disk-network-source-auth"); DO_TEST("disk-network-vxhs", QEMU_CAPS_VXHS); driver.config->vxhsTLS = 1; DO_TEST("disk-network-tlsx509", QEMU_CAPS_VXHS, QEMU_CAPS_OBJECT_TLS_CREDS_X509, QEMU_CAPS_NBD_TLS); + DO_TEST_CAPS_VER("disk-network-tlsx509", "2.12.0"); DO_TEST_CAPS_LATEST("disk-network-tlsx509"); driver.config->vxhsTLS = 0; VIR_FREE(driver.config->vxhsTLSx509certdir); @@ -1109,6 +1125,7 @@ mymain(void) DO_TEST("disk-sata-device", QEMU_CAPS_ICH9_AHCI); DO_TEST("disk-aio", NONE); + DO_TEST_CAPS_VER("disk-aio", "2.12.0"); DO_TEST_CAPS_LATEST("disk-aio"); DO_TEST("disk-source-pool", NONE); DO_TEST("disk-source-pool-mode", NONE); @@ -1119,12 +1136,14 @@ mymain(void) DO_TEST("disk-copy_on_read", QEMU_CAPS_VIRTIO_TX_ALG, QEMU_CAPS_VIRTIO_BLK_SCSI); + DO_TEST_CAPS_VER("disk-copy_on_read", "2.12.0"); DO_TEST_CAPS_LATEST("disk-copy_on_read"); DO_TEST("disk-discard", QEMU_CAPS_DRIVE_DISCARD); DO_TEST("disk-detect-zeroes", QEMU_CAPS_DRIVE_DISCARD, QEMU_CAPS_DRIVE_DETECT_ZEROES); + DO_TEST_CAPS_VER("disk-detect-zeroes", "2.12.0"); DO_TEST_CAPS_LATEST("disk-detect-zeroes"); DO_TEST("disk-snapshot", NONE); DO_TEST_PARSE_ERROR("disk-same-targets", @@ -2893,6 +2912,7 @@ mymain(void) QEMU_CAPS_PIIX_DISABLE_S3, QEMU_CAPS_PIIX_DISABLE_S4, QEMU_CAPS_ICH9_USB_EHCI1); + DO_TEST_CAPS_VER("disk-virtio-scsi-reservations", "2.12.0"); DO_TEST_CAPS_LATEST("disk-virtio-scsi-reservations"); DO_TEST_CAPS_LATEST("tseg-explicit-size"); -- 2.16.2

Add test data for nested backing chains with/without indexes (used in status XMLs) which will excercise blockdev and the related work. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- .../disk-backing-chains-index.x86_64-2.12.0.args | 1 + .../disk-backing-chains-index.x86_64-latest.args | 1 + .../qemuxml2argvdata/disk-backing-chains-index.xml | 145 +++++++++++++++++++++ .../disk-backing-chains-noindex.x86_64-2.12.0.args | 58 +++++++++ .../disk-backing-chains-noindex.x86_64-latest.args | 58 +++++++++ .../disk-backing-chains-noindex.xml | 145 +++++++++++++++++++++ tests/qemuxml2argvtest.c | 4 + .../disk-backing-chains-index-active.xml | 76 +++++++++++ .../disk-backing-chains-index-inactive.xml | 76 +++++++++++ .../disk-backing-chains-noindex-active.xml | 76 +++++++++++ .../disk-backing-chains-noindex-inactive.xml | 76 +++++++++++ tests/qemuxml2xmltest.c | 2 + 12 files changed, 718 insertions(+) create mode 120000 tests/qemuxml2argvdata/disk-backing-chains-index.x86_64-2.12.0.args create mode 120000 tests/qemuxml2argvdata/disk-backing-chains-index.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/disk-backing-chains-index.xml create mode 100644 tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-2.12.0.args create mode 100644 tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/disk-backing-chains-noindex.xml create mode 100644 tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml create mode 100644 tests/qemuxml2xmloutdata/disk-backing-chains-index-inactive.xml create mode 100644 tests/qemuxml2xmloutdata/disk-backing-chains-noindex-active.xml create mode 100644 tests/qemuxml2xmloutdata/disk-backing-chains-noindex-inactive.xml diff --git a/tests/qemuxml2argvdata/disk-backing-chains-index.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-backing-chains-index.x86_64-2.12.0.args new file mode 120000 index 0000000000..3f4cd9040d --- /dev/null +++ b/tests/qemuxml2argvdata/disk-backing-chains-index.x86_64-2.12.0.args @@ -0,0 +1 @@ +disk-backing-chains-noindex.x86_64-2.12.0.args \ No newline at end of file diff --git a/tests/qemuxml2argvdata/disk-backing-chains-index.x86_64-latest.args b/tests/qemuxml2argvdata/disk-backing-chains-index.x86_64-latest.args new file mode 120000 index 0000000000..549eb65512 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-backing-chains-index.x86_64-latest.args @@ -0,0 +1 @@ +disk-backing-chains-noindex.x86_64-latest.args \ No newline at end of file diff --git a/tests/qemuxml2argvdata/disk-backing-chains-index.xml b/tests/qemuxml2argvdata/disk-backing-chains-index.xml new file mode 100644 index 0000000000..95b8a64cf8 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-backing-chains-index.xml @@ -0,0 +1,145 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i686</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='gluster' name='Volume2/Image'> + <host transport='unix' socket='/path/to/sock'/> + </source> + <backingStore type='file' index='1'> + <format type='qcow2'/> + <source file='/tmp/missing-backing-store.qcow'/> + </backingStore> + <target dev='vda' bus='virtio'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='nbd' name='bar'> + <host transport='unix' socket='/var/run/nbdsock'/> + </source> + <backingStore type='block' index='8'> + <format type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + <backingStore type='file' index='7'> + <format type='vmdk'/> + <source file='/tmp/image2'/> + <backingStore type='file' index='6'> + <format type='qcow2'/> + <source file='/tmp/image3.qcow'/> + <backingStore type='file' index='5'> + <format type='qcow2'/> + <source file='/tmp/image4.qcow'> + </source> + <backingStore type='file' index='4'> + <source file='/tmp/image5.qcow'/> + <format type='qcow2'/> + <backingStore type='file' index='3'> + <format type='raw'/> + <source file='/tmp/Fedora-17-x86_64-Live-KDE.iso'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + <target dev='vdb' bus='virtio'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <backingStore/> + <source protocol='gluster' name='Volume1/Image'> + <host name='example.org' port='6000'/> + </source> + <target dev='vdc' bus='virtio'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <auth username='myname'> + <secret type='ceph' usage='mycluster_myname'/> + </auth> + <source protocol='rbd' name='pool/image'> + <host name='mon1.example.org' port='6321'/> + <host name='mon2.example.org' port='6322'/> + <host name='mon3.example.org' port='6322'/> + </source> + <backingStore type='file' index='11'> + <source file='/tmp/image.qcow'/> + <backingStore/> + <format type='qcow2'/> + </backingStore> + <target dev='vdd' bus='virtio'/> + </disk> + <disk type='block' device='disk'> + <driver name='qemu' type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest11'/> + <target dev='vde' bus='virtio'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <backingStore type='file' index='24'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071877'/> + <backingStore type='file' index='23'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071876'/> + <backingStore type='file' index='22'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071872'/> + <backingStore type='file' index='21'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483615252'/> + <backingStore type='file' index='20'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605924'/> + <backingStore type='file' index='19'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605920'/> + <backingStore type='file' index='18'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483546244'/> + <backingStore type='file' index='17'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545901'/> + <backingStore type='file' index='16'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545313'/> + <backingStore type='file' index='15'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483536402'/> + <backingStore type='file' index='14'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.qcow2'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + <target dev='vdf' bus='virtio'/> + </disk> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-2.12.0.args b/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-2.12.0.args new file mode 100644 index 0000000000..dea109b13a --- /dev/null +++ b/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-2.12.0.args @@ -0,0 +1,58 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive 'file=gluster+unix:///Volume2/Image?socket=/path/to/sock,file.debug=4,\ +format=qcow2,if=none,id=drive-virtio-disk0' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-drive file=nbd:unix:/var/run/nbdsock:exportname=bar,format=qcow2,if=none,\ +id=drive-virtio-disk1 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk1,\ +id=virtio-disk1 \ +-drive file=gluster://example.org:6000/Volume1/Image,file.debug=4,format=raw,\ +if=none,id=drive-virtio-disk2 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk2,\ +id=virtio-disk2 \ +-object secret,id=virtio-disk3-secret0,\ +data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ +keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ +-drive 'file=rbd:pool/image:id=myname:auth_supported=cephx\;none:\ +mon_host=mon1.example.org\:6321\;mon2.example.org\:6322\;mon3.example.org\:\ +6322,file.password-secret=virtio-disk3-secret0,format=qcow2,if=none,\ +id=drive-virtio-disk3' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk3,\ +id=virtio-disk3 \ +-drive file=/dev/HostVG/QEMUGuest11,format=qcow2,if=none,id=drive-virtio-disk4 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk4,\ +id=virtio-disk4 \ +-drive file=/var/lib/libvirt/images/rhel7.1484071880,format=qcow2,if=none,\ +id=drive-virtio-disk5 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk5,\ +id=virtio-disk5 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args b/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args new file mode 100644 index 0000000000..afe078adcc --- /dev/null +++ b/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args @@ -0,0 +1,58 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-realtime mlock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive 'file=gluster+unix:///Volume2/Image?socket=/path/to/sock,file.debug=4,\ +format=qcow2,if=none,id=drive-virtio-disk0' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-drive file=nbd:unix:/var/run/nbdsock:exportname=bar,format=qcow2,if=none,\ +id=drive-virtio-disk1 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk1,\ +id=virtio-disk1 \ +-drive file=gluster://example.org:6000/Volume1/Image,file.debug=4,format=raw,\ +if=none,id=drive-virtio-disk2 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk2,\ +id=virtio-disk2 \ +-object secret,id=virtio-disk3-secret0,\ +data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ +keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ +-drive 'file=rbd:pool/image:id=myname:auth_supported=cephx\;none:\ +mon_host=mon1.example.org\:6321\;mon2.example.org\:6322\;mon3.example.org\:\ +6322,file.password-secret=virtio-disk3-secret0,format=qcow2,if=none,\ +id=drive-virtio-disk3' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk3,\ +id=virtio-disk3 \ +-drive file=/dev/HostVG/QEMUGuest11,format=qcow2,if=none,id=drive-virtio-disk4 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk4,\ +id=virtio-disk4 \ +-drive file=/var/lib/libvirt/images/rhel7.1484071880,format=qcow2,if=none,\ +id=drive-virtio-disk5 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk5,\ +id=virtio-disk5 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-backing-chains-noindex.xml b/tests/qemuxml2argvdata/disk-backing-chains-noindex.xml new file mode 100644 index 0000000000..1336d0fdd6 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-backing-chains-noindex.xml @@ -0,0 +1,145 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i686</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='gluster' name='Volume2/Image'> + <host transport='unix' socket='/path/to/sock'/> + </source> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/missing-backing-store.qcow'/> + </backingStore> + <target dev='vda' bus='virtio'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='nbd' name='bar'> + <host transport='unix' socket='/var/run/nbdsock'/> + </source> + <backingStore type='block'> + <format type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + <backingStore type='file'> + <format type='vmdk'/> + <source file='/tmp/image2'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image3.qcow'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image4.qcow'> + </source> + <backingStore type='file'> + <source file='/tmp/image5.qcow'/> + <format type='qcow2'/> + <backingStore type='file'> + <format type='raw'/> + <source file='/tmp/Fedora-17-x86_64-Live-KDE.iso'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + <target dev='vdb' bus='virtio'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <backingStore/> + <source protocol='gluster' name='Volume1/Image'> + <host name='example.org' port='6000'/> + </source> + <target dev='vdc' bus='virtio'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <auth username='myname'> + <secret type='ceph' usage='mycluster_myname'/> + </auth> + <source protocol='rbd' name='pool/image'> + <host name='mon1.example.org' port='6321'/> + <host name='mon2.example.org' port='6322'/> + <host name='mon3.example.org' port='6322'/> + </source> + <backingStore type='file'> + <source file='/tmp/image.qcow'/> + <backingStore/> + <format type='qcow2'/> + </backingStore> + <target dev='vdd' bus='virtio'/> + </disk> + <disk type='block' device='disk'> + <driver name='qemu' type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest11'/> + <target dev='vde' bus='virtio'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071877'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071876'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071872'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483615252'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605924'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605920'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483546244'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545901'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545313'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483536402'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.qcow2'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + <target dev='vdf' bus='virtio'/> + </disk> + <controller type='usb'/> + <controller type='pci' model='pci-root'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 1b09fe608c..02dceaf957 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1176,6 +1176,10 @@ mymain(void) QEMU_CAPS_ICH9_AHCI); DO_TEST_PARSE_ERROR("disk-scsi-incompatible-address", QEMU_CAPS_VIRTIO_SCSI); + DO_TEST_CAPS_VER("disk-backing-chains-index", "2.12.0"); + DO_TEST_CAPS_LATEST("disk-backing-chains-index"); + DO_TEST_CAPS_VER("disk-backing-chains-noindex", "2.12.0"); + DO_TEST_CAPS_LATEST("disk-backing-chains-noindex"); DO_TEST("graphics-egl-headless", QEMU_CAPS_EGL_HEADLESS, diff --git a/tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml b/tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml new file mode 100644 index 0000000000..db70ae2b53 --- /dev/null +++ b/tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml @@ -0,0 +1,76 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i686</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='gluster' name='Volume2/Image'> + <host transport='unix' socket='/path/to/sock'/> + </source> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='nbd' name='bar'> + <host transport='unix' socket='/var/run/nbdsock'/> + </source> + <target dev='vdb' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='gluster' name='Volume1/Image'> + <host name='example.org' port='6000'/> + </source> + <target dev='vdc' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <auth username='myname'> + <secret type='ceph' usage='mycluster_myname'/> + </auth> + <source protocol='rbd' name='pool/image'> + <host name='mon1.example.org' port='6321'/> + <host name='mon2.example.org' port='6322'/> + <host name='mon3.example.org' port='6322'/> + </source> + <target dev='vdd' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + </disk> + <disk type='block' device='disk'> + <driver name='qemu' type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest11'/> + <target dev='vde' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <target dev='vdf' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/disk-backing-chains-index-inactive.xml b/tests/qemuxml2xmloutdata/disk-backing-chains-index-inactive.xml new file mode 100644 index 0000000000..db70ae2b53 --- /dev/null +++ b/tests/qemuxml2xmloutdata/disk-backing-chains-index-inactive.xml @@ -0,0 +1,76 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i686</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='gluster' name='Volume2/Image'> + <host transport='unix' socket='/path/to/sock'/> + </source> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='nbd' name='bar'> + <host transport='unix' socket='/var/run/nbdsock'/> + </source> + <target dev='vdb' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='gluster' name='Volume1/Image'> + <host name='example.org' port='6000'/> + </source> + <target dev='vdc' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <auth username='myname'> + <secret type='ceph' usage='mycluster_myname'/> + </auth> + <source protocol='rbd' name='pool/image'> + <host name='mon1.example.org' port='6321'/> + <host name='mon2.example.org' port='6322'/> + <host name='mon3.example.org' port='6322'/> + </source> + <target dev='vdd' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + </disk> + <disk type='block' device='disk'> + <driver name='qemu' type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest11'/> + <target dev='vde' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <target dev='vdf' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-active.xml b/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-active.xml new file mode 100644 index 0000000000..db70ae2b53 --- /dev/null +++ b/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-active.xml @@ -0,0 +1,76 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i686</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='gluster' name='Volume2/Image'> + <host transport='unix' socket='/path/to/sock'/> + </source> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='nbd' name='bar'> + <host transport='unix' socket='/var/run/nbdsock'/> + </source> + <target dev='vdb' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='gluster' name='Volume1/Image'> + <host name='example.org' port='6000'/> + </source> + <target dev='vdc' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <auth username='myname'> + <secret type='ceph' usage='mycluster_myname'/> + </auth> + <source protocol='rbd' name='pool/image'> + <host name='mon1.example.org' port='6321'/> + <host name='mon2.example.org' port='6322'/> + <host name='mon3.example.org' port='6322'/> + </source> + <target dev='vdd' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + </disk> + <disk type='block' device='disk'> + <driver name='qemu' type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest11'/> + <target dev='vde' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <target dev='vdf' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-inactive.xml b/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-inactive.xml new file mode 100644 index 0000000000..db70ae2b53 --- /dev/null +++ b/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-inactive.xml @@ -0,0 +1,76 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i686</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='gluster' name='Volume2/Image'> + <host transport='unix' socket='/path/to/sock'/> + </source> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='nbd' name='bar'> + <host transport='unix' socket='/var/run/nbdsock'/> + </source> + <target dev='vdb' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='gluster' name='Volume1/Image'> + <host name='example.org' port='6000'/> + </source> + <target dev='vdc' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <auth username='myname'> + <secret type='ceph' usage='mycluster_myname'/> + </auth> + <source protocol='rbd' name='pool/image'> + <host name='mon1.example.org' port='6321'/> + <host name='mon2.example.org' port='6322'/> + <host name='mon3.example.org' port='6322'/> + </source> + <target dev='vdd' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + </disk> + <disk type='block' device='disk'> + <driver name='qemu' type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest11'/> + <target dev='vde' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <target dev='vdf' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index c6cb2dda0c..1966cf131a 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -990,6 +990,8 @@ mymain(void) DO_TEST("panic-no-address", NONE); DO_TEST("disk-backing-chains", NONE); + DO_TEST("disk-backing-chains-index", NONE); + DO_TEST("disk-backing-chains-noindex", NONE); DO_TEST("chardev-label", NONE); -- 2.16.2

It should be impossible to lack an alias in the domain definition. Other disk types don't generate it so remove it here as well. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_hotplug.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 1488f0a7c2..1538abf155 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -4902,11 +4902,6 @@ qemuDomainDetachVirtioDiskDevice(virQEMUDriverPtr driver, goto cleanup; } - if (!detach->info.alias) { - if (qemuAssignDeviceDiskAlias(vm->def, detach) < 0) - goto cleanup; - } - if (!async) qemuDomainMarkDeviceForRemoval(vm, &detach->info); -- 2.16.2

Print the values so it's simpler to debug. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/util/virqemu.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/util/virqemu.c b/src/util/virqemu.c index 30b8dc18d4..7ffa9f780e 100644 --- a/src/util/virqemu.c +++ b/src/util/virqemu.c @@ -248,8 +248,9 @@ virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf, virJSONValuePtr props) { if (!type || !alias) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("missing 'type' or 'alias' field of QOM 'object'")); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("missing 'type'(%s) or 'alias'(%s) field of QOM 'object'"), + NULLSTR(type), NULLSTR(alias)); return -1; } -- 2.16.2

The capability currently is not enabled so that we can add individual bits first. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_capabilities.c | 1 + src/qemu/qemu_capabilities.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 0fb800589a..6b4c14ac50 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -507,6 +507,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, /* 315 */ "vfio-pci.display", + "blockdev", ); diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 9e8ad5f5c3..452761e672 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -491,6 +491,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ /* 315 */ QEMU_CAPS_VFIO_PCI_DISPLAY, /* -device vfio-pci.display */ + QEMU_CAPS_BLOCKDEV, /* -blockdev and blockdev-add are supported */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; -- 2.16.2

SD cards are currently passed by using -drive only which would not be compatible with using -blockdev fully. Floppies at least in the case of the i440 machine type don't have a reasonable qdev ID if -drive is not used and thus would not allow queries and other operations. Since floppy drives are obsolete anyways clear blockdev when using them. Clear QEMU_CAPS_BLOCKDEV if the VM has such devices. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_process.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index c4e33723d1..6b59dbc1c3 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5884,6 +5884,16 @@ qemuProcessPrepareDomain(virQEMUDriverPtr driver, qemuProcessPrepareAllowReboot(vm); + /* clear the 'blockdev' capability for VMs which have disks that need + * -drive or which have floppies where we can't reliably get the QOM path */ + for (i = 0; i < vm->def->ndisks; i++) { + if (qemuDiskBusNeedsDriveArg(vm->def->disks[i]->bus) || + vm->def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_FDC) { + virQEMUCapsClear(priv->qemuCaps, QEMU_CAPS_BLOCKDEV); + break; + } + } + /* * Normally PCI addresses are assigned in the virDomainCreate * or virDomainDefine methods. We might still need to assign -- 2.16.2

We need to load the backing chain from the XML when using -blockdev. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_process.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 6b59dbc1c3..b01bb4fb5c 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6027,8 +6027,10 @@ qemuProcessPrepareHostStorage(virQEMUDriverPtr driver, virDomainObjPtr vm, unsigned int flags) { + qemuDomainObjPrivatePtr priv = vm->privateData; size_t i; bool cold_boot = flags & VIR_QEMU_PROCESS_START_COLD; + bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV); for (i = vm->def->ndisks; i > 0; i--) { size_t idx = i - 1; @@ -6037,7 +6039,9 @@ qemuProcessPrepareHostStorage(virQEMUDriverPtr driver, if (virStorageSourceIsEmpty(disk->src)) continue; - virStorageSourceBackingStoreClear(disk->src); + /* backing chain needs to be redetected if we aren't using blockdev */ + if (!blockdev) + virStorageSourceBackingStoreClear(disk->src); if (qemuDomainDetermineDiskChain(driver, vm, disk, true) >= 0) continue; @@ -7713,7 +7717,8 @@ qemuProcessReconnect(void *opaque) goto error; /* backing chains need to be refreshed only if they could change */ - if (priv->reconnectBlockjobs != VIR_TRISTATE_BOOL_NO) { + if (priv->reconnectBlockjobs != VIR_TRISTATE_BOOL_NO && + !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) { /* This should be the only place that calls * qemuDomainDetermineDiskChain with @report_broken == false * to guarantee best-effort domain reconnect */ -- 2.16.2

We'll specify them ourselves so it's pointless to attempt to redetect them. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_process.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index b01bb4fb5c..0a072c990d 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7807,7 +7807,8 @@ qemuProcessReconnect(void *opaque) if (qemuProcessRefreshDisks(driver, obj, QEMU_ASYNC_JOB_NONE) < 0) goto error; - if (qemuBlockNodeNamesDetect(driver, obj, QEMU_ASYNC_JOB_NONE) < 0) + if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV) && + qemuBlockNodeNamesDetect(driver, obj, QEMU_ASYNC_JOB_NONE) < 0) goto error; if (qemuRefreshVirtioChannelState(driver, obj, QEMU_ASYNC_JOB_NONE) < 0) -- 2.16.2

If a user configures the backing chain in the XML we should not ignore it. We already do parse it but don't format it out. As a safety-precaution don't attempt to format detected chain into the inactive XML. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 8 ++- .../disk-backing-chains-inactive.xml | 35 ++++++++++ .../disk-backing-chains-index-active.xml | 80 ++++++++++++++++++++++ .../disk-backing-chains-index-inactive.xml | 80 ++++++++++++++++++++++ .../disk-backing-chains-noindex-active.xml | 80 ++++++++++++++++++++++ .../disk-backing-chains-noindex-inactive.xml | 80 ++++++++++++++++++++++ tests/qemuxml2xmloutdata/disk-mirror-inactive.xml | 4 ++ .../disk-mirror-old-inactive.xml | 4 ++ 8 files changed, 369 insertions(+), 2 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 7dcbe8a20b..82e47464f2 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -23702,10 +23702,15 @@ virDomainDiskBackingStoreFormat(virBufferPtr buf, unsigned int flags) { const char *format; + bool inactive = flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE; if (!backingStore) return 0; + /* don't write detected backing chain members to inactive xml */ + if (inactive && backingStore->detected) + return 0; + if (backingStore->type == VIR_STORAGE_TYPE_NONE) { virBufferAddLit(buf, "<backingStore/>\n"); return 0; @@ -23971,8 +23976,7 @@ virDomainDiskDefFormat(virBufferPtr buf, /* Don't format backingStore to inactive XMLs until the code for * persistent storage of backing chains is ready. */ - if (!(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE) && - virDomainDiskBackingStoreFormat(buf, def->src->backingStore, + if (virDomainDiskBackingStoreFormat(buf, def->src->backingStore, xmlopt, flags) < 0) return -1; diff --git a/tests/qemuxml2xmloutdata/disk-backing-chains-inactive.xml b/tests/qemuxml2xmloutdata/disk-backing-chains-inactive.xml index a9db12ba4d..c1af58ff6f 100644 --- a/tests/qemuxml2xmloutdata/disk-backing-chains-inactive.xml +++ b/tests/qemuxml2xmloutdata/disk-backing-chains-inactive.xml @@ -19,6 +19,10 @@ <source protocol='gluster' name='Volume2/Image'> <host transport='unix' socket='/path/to/sock'/> </source> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/missing-backing-store.qcow'/> + </backingStore> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </disk> @@ -27,6 +31,31 @@ <source protocol='nbd' name='bar'> <host transport='unix' socket='/var/run/nbdsock'/> </source> + <backingStore type='block'> + <format type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image2.qcow'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image3.qcow'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image4.qcow'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image5.qcow'/> + <backingStore type='file'> + <format type='raw'/> + <source file='/tmp/Fedora-17-x86_64-Live-KDE.iso'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> @@ -35,6 +64,7 @@ <source protocol='gluster' name='Volume1/Image'> <host name='example.org' port='6000'/> </source> + <backingStore/> <target dev='vdc' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> @@ -48,6 +78,11 @@ <host name='mon2.example.org' port='6322'/> <host name='mon3.example.org' port='6322'/> </source> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image.qcow'/> + <backingStore/> + </backingStore> <target dev='vdd' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk> diff --git a/tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml b/tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml index db70ae2b53..724afa4e83 100644 --- a/tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml +++ b/tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml @@ -19,6 +19,10 @@ <source protocol='gluster' name='Volume2/Image'> <host transport='unix' socket='/path/to/sock'/> </source> + <backingStore type='file' index='1'> + <format type='qcow2'/> + <source file='/tmp/missing-backing-store.qcow'/> + </backingStore> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </disk> @@ -27,6 +31,31 @@ <source protocol='nbd' name='bar'> <host transport='unix' socket='/var/run/nbdsock'/> </source> + <backingStore type='block' index='8'> + <format type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + <backingStore type='file' index='7'> + <format type='vmdk'/> + <source file='/tmp/image2'/> + <backingStore type='file' index='6'> + <format type='qcow2'/> + <source file='/tmp/image3.qcow'/> + <backingStore type='file' index='5'> + <format type='qcow2'/> + <source file='/tmp/image4.qcow'/> + <backingStore type='file' index='4'> + <format type='qcow2'/> + <source file='/tmp/image5.qcow'/> + <backingStore type='file' index='3'> + <format type='raw'/> + <source file='/tmp/Fedora-17-x86_64-Live-KDE.iso'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> @@ -35,6 +64,7 @@ <source protocol='gluster' name='Volume1/Image'> <host name='example.org' port='6000'/> </source> + <backingStore/> <target dev='vdc' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> @@ -48,6 +78,11 @@ <host name='mon2.example.org' port='6322'/> <host name='mon3.example.org' port='6322'/> </source> + <backingStore type='file' index='11'> + <format type='qcow2'/> + <source file='/tmp/image.qcow'/> + <backingStore/> + </backingStore> <target dev='vdd' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk> @@ -60,6 +95,51 @@ <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <backingStore type='file' index='24'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071877'/> + <backingStore type='file' index='23'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071876'/> + <backingStore type='file' index='22'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071872'/> + <backingStore type='file' index='21'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483615252'/> + <backingStore type='file' index='20'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605924'/> + <backingStore type='file' index='19'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605920'/> + <backingStore type='file' index='18'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483546244'/> + <backingStore type='file' index='17'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545901'/> + <backingStore type='file' index='16'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545313'/> + <backingStore type='file' index='15'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483536402'/> + <backingStore type='file' index='14'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.qcow2'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> <target dev='vdf' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </disk> diff --git a/tests/qemuxml2xmloutdata/disk-backing-chains-index-inactive.xml b/tests/qemuxml2xmloutdata/disk-backing-chains-index-inactive.xml index db70ae2b53..29d1ad002d 100644 --- a/tests/qemuxml2xmloutdata/disk-backing-chains-index-inactive.xml +++ b/tests/qemuxml2xmloutdata/disk-backing-chains-index-inactive.xml @@ -19,6 +19,10 @@ <source protocol='gluster' name='Volume2/Image'> <host transport='unix' socket='/path/to/sock'/> </source> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/missing-backing-store.qcow'/> + </backingStore> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </disk> @@ -27,6 +31,31 @@ <source protocol='nbd' name='bar'> <host transport='unix' socket='/var/run/nbdsock'/> </source> + <backingStore type='block'> + <format type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + <backingStore type='file'> + <format type='vmdk'/> + <source file='/tmp/image2'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image3.qcow'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image4.qcow'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image5.qcow'/> + <backingStore type='file'> + <format type='raw'/> + <source file='/tmp/Fedora-17-x86_64-Live-KDE.iso'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> @@ -35,6 +64,7 @@ <source protocol='gluster' name='Volume1/Image'> <host name='example.org' port='6000'/> </source> + <backingStore/> <target dev='vdc' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> @@ -48,6 +78,11 @@ <host name='mon2.example.org' port='6322'/> <host name='mon3.example.org' port='6322'/> </source> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image.qcow'/> + <backingStore/> + </backingStore> <target dev='vdd' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk> @@ -60,6 +95,51 @@ <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071877'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071876'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071872'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483615252'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605924'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605920'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483546244'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545901'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545313'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483536402'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.qcow2'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> <target dev='vdf' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </disk> diff --git a/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-active.xml b/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-active.xml index db70ae2b53..29d1ad002d 100644 --- a/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-active.xml +++ b/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-active.xml @@ -19,6 +19,10 @@ <source protocol='gluster' name='Volume2/Image'> <host transport='unix' socket='/path/to/sock'/> </source> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/missing-backing-store.qcow'/> + </backingStore> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </disk> @@ -27,6 +31,31 @@ <source protocol='nbd' name='bar'> <host transport='unix' socket='/var/run/nbdsock'/> </source> + <backingStore type='block'> + <format type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + <backingStore type='file'> + <format type='vmdk'/> + <source file='/tmp/image2'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image3.qcow'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image4.qcow'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image5.qcow'/> + <backingStore type='file'> + <format type='raw'/> + <source file='/tmp/Fedora-17-x86_64-Live-KDE.iso'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> @@ -35,6 +64,7 @@ <source protocol='gluster' name='Volume1/Image'> <host name='example.org' port='6000'/> </source> + <backingStore/> <target dev='vdc' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> @@ -48,6 +78,11 @@ <host name='mon2.example.org' port='6322'/> <host name='mon3.example.org' port='6322'/> </source> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image.qcow'/> + <backingStore/> + </backingStore> <target dev='vdd' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk> @@ -60,6 +95,51 @@ <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071877'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071876'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071872'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483615252'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605924'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605920'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483546244'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545901'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545313'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483536402'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.qcow2'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> <target dev='vdf' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </disk> diff --git a/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-inactive.xml b/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-inactive.xml index db70ae2b53..29d1ad002d 100644 --- a/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-inactive.xml +++ b/tests/qemuxml2xmloutdata/disk-backing-chains-noindex-inactive.xml @@ -19,6 +19,10 @@ <source protocol='gluster' name='Volume2/Image'> <host transport='unix' socket='/path/to/sock'/> </source> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/missing-backing-store.qcow'/> + </backingStore> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </disk> @@ -27,6 +31,31 @@ <source protocol='nbd' name='bar'> <host transport='unix' socket='/var/run/nbdsock'/> </source> + <backingStore type='block'> + <format type='qcow2'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + <backingStore type='file'> + <format type='vmdk'/> + <source file='/tmp/image2'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image3.qcow'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image4.qcow'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image5.qcow'/> + <backingStore type='file'> + <format type='raw'/> + <source file='/tmp/Fedora-17-x86_64-Live-KDE.iso'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> @@ -35,6 +64,7 @@ <source protocol='gluster' name='Volume1/Image'> <host name='example.org' port='6000'/> </source> + <backingStore/> <target dev='vdc' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> @@ -48,6 +78,11 @@ <host name='mon2.example.org' port='6322'/> <host name='mon3.example.org' port='6322'/> </source> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/tmp/image.qcow'/> + <backingStore/> + </backingStore> <target dev='vdd' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk> @@ -60,6 +95,51 @@ <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071877'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071876'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071872'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483615252'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605924'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483605920'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483546244'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545901'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483545313'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1483536402'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.qcow2'/> + <backingStore/> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> + </backingStore> <target dev='vdf' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </disk> diff --git a/tests/qemuxml2xmloutdata/disk-mirror-inactive.xml b/tests/qemuxml2xmloutdata/disk-mirror-inactive.xml index cc7aed0873..5c9b72738d 100644 --- a/tests/qemuxml2xmloutdata/disk-mirror-inactive.xml +++ b/tests/qemuxml2xmloutdata/disk-mirror-inactive.xml @@ -17,12 +17,14 @@ <disk type='block' device='disk'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest1'/> + <backingStore/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> + <backingStore/> <target dev='hdc' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> @@ -30,12 +32,14 @@ <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/tmp/data.img'/> + <backingStore/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </disk> <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/tmp/logs.img'/> + <backingStore/> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> diff --git a/tests/qemuxml2xmloutdata/disk-mirror-old-inactive.xml b/tests/qemuxml2xmloutdata/disk-mirror-old-inactive.xml index cc7aed0873..5c9b72738d 100644 --- a/tests/qemuxml2xmloutdata/disk-mirror-old-inactive.xml +++ b/tests/qemuxml2xmloutdata/disk-mirror-old-inactive.xml @@ -17,12 +17,14 @@ <disk type='block' device='disk'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest1'/> + <backingStore/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> + <backingStore/> <target dev='hdc' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> @@ -30,12 +32,14 @@ <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/tmp/data.img'/> + <backingStore/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </disk> <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/tmp/logs.img'/> + <backingStore/> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> -- 2.16.2

Node names for block objects in qemu need to be unique for an instance of the qemu process. Add a counter to generate objects sequentially and store it in the status XML so that we can restore it. The helpers added allow to create new node names and reset the counter after the VM process terminates. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 38 ++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 6 ++++++ src/qemu/qemu_process.c | 3 +++ 3 files changed, 47 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index de056272e8..6103b86478 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2438,6 +2438,9 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, qemuDomainObjPrivateXMLFormatPR(buf, priv); + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) + virBufferAsprintf(buf, "<nodename next='%llu'/>\n", priv->nodenameindex); + if (qemuDomainObjPrivateXMLFormatBlockjobs(buf, vm) < 0) return -1; @@ -2933,6 +2936,14 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, if (qemuDomainObjPrivateXMLParseBlockjobs(priv, ctxt) < 0) goto error; + qemuDomainStorageIdReset(priv); + if (virXPathULongLong("string(./nodename/@next)", ctxt, + &priv->nodenameindex) == -2) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("failed to parse node name index")); + goto error; + } + return 0; error: @@ -13161,3 +13172,30 @@ qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv) return ret; } + + +/** + * qemuDomainStorageIdNew: + * @priv: qemu VM private data object. + * + * Generate a new unique id for a storage object. Useful for node name generation. + */ +unsigned int +qemuDomainStorageIdNew(qemuDomainObjPrivatePtr priv) +{ + return ++priv->nodenameindex; +} + + +/** + * qemuDomainStorageIdReset: + * @priv: qemu VM private data object. + * + * Resets the data for the node name generator. The node names need to be unique + * for a single instance, so can be reset on VM shutdown. + */ +void +qemuDomainStorageIdReset(qemuDomainObjPrivatePtr priv) +{ + priv->nodenameindex = 0; +} diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 7b79d77257..5dcbdfbbe1 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -363,6 +363,9 @@ struct _qemuDomainObjPrivate { /* true if qemu-pr-helper process is running for the domain */ bool prDaemonRunning; + + /* counter for generating node names for qemu disks */ + unsigned long long nodenameindex; }; # define QEMU_DOMAIN_PRIVATE(vm) \ @@ -1063,4 +1066,7 @@ qemuDomainDiskCachemodeFlags(int cachemode, char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv); +unsigned int qemuDomainStorageIdNew(qemuDomainObjPrivatePtr priv); +void qemuDomainStorageIdReset(qemuDomainObjPrivatePtr priv); + #endif /* __QEMU_DOMAIN_H__ */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 0a072c990d..334044f479 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7157,6 +7157,9 @@ void qemuProcessStop(virQEMUDriverPtr driver, /* clear all private data entries which are no longer needed */ qemuDomainObjPrivateDataClear(priv); + /* reset node name allocator */ + qemuDomainStorageIdReset(priv); + /* The "release" hook cleans up additional resources */ if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { char *xml = qemuDomainDefFormatXML(driver, vm->def, 0); -- 2.16.2

Allow storing of private data in the status XML for disks. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 7 ++++++ 2 files changed, 67 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 82e47464f2..a9db7cd380 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9548,6 +9548,30 @@ virDomainDiskDefDriverParseXML(virDomainDiskDefPtr def, } +static int +virDomainDiskDefParsePrivateData(xmlXPathContextPtr ctxt, + virDomainDiskDefPtr disk, + virDomainXMLOptionPtr xmlopt) +{ + xmlNodePtr save_node = ctxt->node; + int ret = 0; + + if (!xmlopt || + !xmlopt->privateData.diskParse) + return 0; + + if (!(ctxt->node = virXPathNode("./privateData", ctxt))) + goto cleanup; + + if (xmlopt->privateData.diskParse(ctxt, disk) < 0) + ret = -1; + + cleanup: + ctxt->node = save_node; + return ret; +} + + #define VENDOR_LEN 8 #define PRODUCT_LEN 16 @@ -9963,6 +9987,10 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; } + if (flags & VIR_DOMAIN_DEF_PARSE_STATUS && + virDomainDiskDefParsePrivateData(ctxt, def, xmlopt) < 0) + goto error; + if (virDomainDiskDefParseValidate(def, vmSeclabels, nvmSeclabels) < 0) goto error; @@ -23911,6 +23939,35 @@ virDomainDiskDefFormatMirror(virBufferPtr buf, } +static int +virDomainDiskDefFormatPrivateData(virBufferPtr buf, + virDomainDiskDefPtr disk, + unsigned int flags, + virDomainXMLOptionPtr xmlopt) +{ + virBuffer childBuf = VIR_BUFFER_INITIALIZER; + + if (!(flags & VIR_DOMAIN_DEF_FORMAT_STATUS) || + !xmlopt || + !xmlopt->privateData.diskFormat) + return 0; + + virBufferSetChildIndent(&childBuf, buf); + + if (xmlopt->privateData.diskFormat(disk, &childBuf) < 0) + goto error; + + if (virXMLFormatElement(buf, "privateData", NULL, &childBuf) < 0) + goto error; + + return 0; + + error: + virBufferFreeAndReset(&childBuf); + return -1; +} + + static int virDomainDiskDefFormat(virBufferPtr buf, virDomainDiskDefPtr def, @@ -24024,6 +24081,9 @@ virDomainDiskDefFormat(virBufferPtr buf, virDomainDeviceInfoFormat(buf, &def->info, flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT); + if (virDomainDiskDefFormatPrivateData(buf, def, flags, xmlopt) < 0) + return -1; + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</disk>\n"); return 0; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index c1dfa37fdf..50d2ead607 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2735,6 +2735,11 @@ typedef int (*virDomainXMLPrivateDataParseFunc)(xmlXPathContextPtr, typedef void *(*virDomainXMLPrivateDataGetParseOpaqueFunc)(virDomainObjPtr vm); +typedef int (*virDomainXMLPrivateDataDiskParseFunc)(xmlXPathContextPtr ctxt, + virDomainDiskDefPtr disk); +typedef int (*virDomainXMLPrivateDataDiskFormatFunc)(virDomainDiskDefPtr disk, + virBufferPtr buf); + typedef int (*virDomainXMLPrivateDataStorageSourceParseFunc)(xmlXPathContextPtr ctxt, virStorageSourcePtr src); typedef int (*virDomainXMLPrivateDataStorageSourceFormatFunc)(virStorageSourcePtr src, @@ -2749,6 +2754,8 @@ struct _virDomainXMLPrivateDataCallbacks { /* note that private data for devices are not copied when using * virDomainDefCopy and similar functions */ virDomainXMLPrivateDataNewFunc diskNew; + virDomainXMLPrivateDataDiskParseFunc diskParse; + virDomainXMLPrivateDataDiskFormatFunc diskFormat; virDomainXMLPrivateDataNewFunc vcpuNew; virDomainXMLPrivateDataNewFunc chrSourceNew; virDomainXMLPrivateDataNewFunc vsockNew; -- 2.16.2

Similarly to backing store indexes which will become stable eventually we need also to be able to format and store in the status XML for later use the index for the top level of the backing chain. Add XML formatter, parser, schema and docs. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- docs/formatdomain.html.in | 7 ++++++- docs/schemas/domaincommon.rng | 19 +++++++++++++++++++ src/conf/domain_conf.c | 21 +++++++++++++++++---- .../qemuxml2argvdata/disk-backing-chains-index.xml | 12 ++++++------ .../disk-backing-chains-index-active.xml | 12 ++++++------ 5 files changed, 54 insertions(+), 17 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index b63467bd91..f175d931ec 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2951,6 +2951,11 @@ is only valid when the specified storage volume is of 'file' or 'block' type). <p> + The <code>source</code> element may also have the <code>index</code> + attribute with same semantics the <a href='#elementsDiskBackingStoreIndex'> + <code>index</code></a> attribute of <code>backingStore</code> + </p> + <p> The <code>source</code> element may contain the following sub elements: </p> @@ -3150,7 +3155,7 @@ by the backing store, see disk type attribute above for more details and possible values. </dd> - <dt><code>index</code></dt> + <dt><code><a id="elementsDiskBackingStoreIndex">index</a></code></dt> <dd> This attribute is only valid in output (and ignored on input) and it can be used to refer to a specific part of the disk chain when diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index ac04af51a1..7c4e848685 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1528,6 +1528,14 @@ </optional> </define> + <define name="diskSourceCommon"> + <optional> + <attribute name="index"> + <ref name="positiveInteger"/> + </attribute> + </optional> + </define> + <define name="diskSource"> <choice> <ref name="diskSourceFile"/> @@ -1551,6 +1559,7 @@ <ref name="absFilePath"/> </attribute> </optional> + <ref name="diskSourceCommon"/> <optional> <ref name="storageStartupPolicy"/> </optional> @@ -1575,6 +1584,7 @@ <ref name="absFilePath"/> </attribute> </optional> + <ref name="diskSourceCommon"/> <optional> <ref name="storageStartupPolicy"/> </optional> @@ -1600,6 +1610,7 @@ <attribute name="dir"> <ref name="absFilePath"/> </attribute> + <ref name="diskSourceCommon"/> <optional> <ref name="storageStartupPolicy"/> </optional> @@ -1653,6 +1664,7 @@ <attribute name="protocol"> <value>rbd</value> </attribute> + <ref name="diskSourceCommon"/> <optional> <attribute name="name"/> </optional> @@ -1692,6 +1704,7 @@ <value>iscsi</value> </attribute> <attribute name="name"/> + <ref name="diskSourceCommon"/> <ref name="diskSourceNetworkHost"/> <optional> <ref name="diskAuth"/> @@ -1711,6 +1724,7 @@ </choice> </attribute> <attribute name="name"/> + <ref name="diskSourceCommon"/> <ref name="diskSourceNetworkHost"/> <optional> <ref name="encryption"/> @@ -1729,6 +1743,7 @@ </choice> </attribute> <attribute name="name"/> + <ref name="diskSourceCommon"/> <ref name="diskSourceNetworkHost"/> <optional> <ref name="encryption"/> @@ -1749,6 +1764,7 @@ <ref name="virYesNo"/> </attribute> </optional> + <ref name="diskSourceCommon"/> <ref name="diskSourceNetworkHost"/> <optional> <ref name="encryption"/> @@ -1762,6 +1778,7 @@ <value>gluster</value> </attribute> <attribute name="name"/> + <ref name="diskSourceCommon"/> <oneOrMore> <ref name="diskSourceNetworkHost"/> </oneOrMore> @@ -1779,6 +1796,7 @@ </choice> </attribute> <attribute name="name"/> + <ref name="diskSourceCommon"/> <optional> <attribute name="tls"> <ref name="virYesNo"/> @@ -1823,6 +1841,7 @@ </choice> </attribute> </optional> + <ref name="diskSourceCommon"/> <optional> <ref name="storageStartupPolicy"/> </optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a9db7cd380..720b418920 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9677,6 +9677,13 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, startupPolicy = virXMLPropString(cur, "startupPolicy"); + if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) && + (tmp = virXMLPropString(cur, "index")) && + virStrToLong_uip(tmp, NULL, 10, &def->src->id) < 0) { + virReportError(VIR_ERR_XML_ERROR, _("invalid disk index '%s'"), tmp); + goto error; + } + VIR_FREE(tmp); } else if (!target && virXMLNodeNameEqual(cur, "target")) { target = virXMLPropString(cur, "dev"); @@ -23681,6 +23688,7 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf, int policy, unsigned int flags, bool skipSeclabels, + bool attrIndex, virDomainXMLOptionPtr xmlopt) { virBuffer attrBuf = VIR_BUFFER_INITIALIZER; @@ -23697,6 +23705,9 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf, virBufferEscapeString(&attrBuf, " startupPolicy='%s'", virDomainStartupPolicyTypeToString(policy)); + if (attrIndex && src->id != 0) + virBufferAsprintf(&attrBuf, " index='%u'", src->id); + if (virDomainDiskSourceFormatPrivateData(&childBuf, src, flags, xmlopt) < 0) goto cleanup; @@ -23719,7 +23730,8 @@ virDomainDiskSourceFormat(virBufferPtr buf, unsigned int flags, virDomainXMLOptionPtr xmlopt) { - return virDomainDiskSourceFormatInternal(buf, src, policy, flags, false, xmlopt); + return virDomainDiskSourceFormatInternal(buf, src, policy, flags, false, + false, xmlopt); } @@ -23761,7 +23773,8 @@ virDomainDiskBackingStoreFormat(virBufferPtr buf, virBufferAsprintf(buf, "<format type='%s'/>\n", format); /* We currently don't output seclabels for backing chain element */ - if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, flags, true, xmlopt) < 0 || + if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, flags, true, + false, xmlopt) < 0 || virDomainDiskBackingStoreFormat(buf, backingStore->backingStore, xmlopt, flags) < 0) return -1; @@ -24027,8 +24040,8 @@ virDomainDiskDefFormat(virBufferPtr buf, if (def->src->auth && !def->src->authInherited) virStorageAuthDefFormat(buf, def->src->auth); - if (virDomainDiskSourceFormat(buf, def->src, def->startupPolicy, - flags, xmlopt) < 0) + if (virDomainDiskSourceFormatInternal(buf, def->src, def->startupPolicy, + flags, false, true, xmlopt) < 0) return -1; /* Don't format backingStore to inactive XMLs until the code for diff --git a/tests/qemuxml2argvdata/disk-backing-chains-index.xml b/tests/qemuxml2argvdata/disk-backing-chains-index.xml index 95b8a64cf8..5e0a03fbc4 100644 --- a/tests/qemuxml2argvdata/disk-backing-chains-index.xml +++ b/tests/qemuxml2argvdata/disk-backing-chains-index.xml @@ -16,7 +16,7 @@ <emulator>/usr/bin/qemu-system-i686</emulator> <disk type='network' device='disk'> <driver name='qemu' type='qcow2'/> - <source protocol='gluster' name='Volume2/Image'> + <source protocol='gluster' name='Volume2/Image' index='2'> <host transport='unix' socket='/path/to/sock'/> </source> <backingStore type='file' index='1'> @@ -27,7 +27,7 @@ </disk> <disk type='network' device='disk'> <driver name='qemu' type='qcow2'/> - <source protocol='nbd' name='bar'> + <source protocol='nbd' name='bar' index='9'> <host transport='unix' socket='/var/run/nbdsock'/> </source> <backingStore type='block' index='8'> @@ -61,7 +61,7 @@ <disk type='network' device='disk'> <driver name='qemu' type='raw'/> <backingStore/> - <source protocol='gluster' name='Volume1/Image'> + <source protocol='gluster' name='Volume1/Image' index='10'> <host name='example.org' port='6000'/> </source> <target dev='vdc' bus='virtio'/> @@ -71,7 +71,7 @@ <auth username='myname'> <secret type='ceph' usage='mycluster_myname'/> </auth> - <source protocol='rbd' name='pool/image'> + <source protocol='rbd' name='pool/image' index='12'> <host name='mon1.example.org' port='6321'/> <host name='mon2.example.org' port='6322'/> <host name='mon3.example.org' port='6322'/> @@ -85,12 +85,12 @@ </disk> <disk type='block' device='disk'> <driver name='qemu' type='qcow2'/> - <source dev='/dev/HostVG/QEMUGuest11'/> + <source dev='/dev/HostVG/QEMUGuest11' index='13'/> <target dev='vde' bus='virtio'/> </disk> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> - <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <source file='/var/lib/libvirt/images/rhel7.1484071880' index='25'/> <backingStore type='file' index='24'> <format type='qcow2'/> <source file='/var/lib/libvirt/images/rhel7.1484071877'/> diff --git a/tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml b/tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml index 724afa4e83..2b5bc9e1b4 100644 --- a/tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml +++ b/tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml @@ -16,7 +16,7 @@ <emulator>/usr/bin/qemu-system-i686</emulator> <disk type='network' device='disk'> <driver name='qemu' type='qcow2'/> - <source protocol='gluster' name='Volume2/Image'> + <source protocol='gluster' name='Volume2/Image' index='2'> <host transport='unix' socket='/path/to/sock'/> </source> <backingStore type='file' index='1'> @@ -28,7 +28,7 @@ </disk> <disk type='network' device='disk'> <driver name='qemu' type='qcow2'/> - <source protocol='nbd' name='bar'> + <source protocol='nbd' name='bar' index='9'> <host transport='unix' socket='/var/run/nbdsock'/> </source> <backingStore type='block' index='8'> @@ -61,7 +61,7 @@ </disk> <disk type='network' device='disk'> <driver name='qemu' type='raw'/> - <source protocol='gluster' name='Volume1/Image'> + <source protocol='gluster' name='Volume1/Image' index='10'> <host name='example.org' port='6000'/> </source> <backingStore/> @@ -73,7 +73,7 @@ <auth username='myname'> <secret type='ceph' usage='mycluster_myname'/> </auth> - <source protocol='rbd' name='pool/image'> + <source protocol='rbd' name='pool/image' index='12'> <host name='mon1.example.org' port='6321'/> <host name='mon2.example.org' port='6322'/> <host name='mon3.example.org' port='6322'/> @@ -88,13 +88,13 @@ </disk> <disk type='block' device='disk'> <driver name='qemu' type='qcow2'/> - <source dev='/dev/HostVG/QEMUGuest11'/> + <source dev='/dev/HostVG/QEMUGuest11' index='13'/> <target dev='vde' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> </disk> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> - <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <source file='/var/lib/libvirt/images/rhel7.1484071880' index='25'/> <backingStore type='file' index='24'> <format type='qcow2'/> <source file='/var/lib/libvirt/images/rhel7.1484071877'/> -- 2.16.2

Use the index stored in virStorageSource struct rather than recalculating it. Currently we'd report proper numbers but that will change with blockdev. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 9ee8d33f8d..8e941d7a60 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20047,7 +20047,6 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, virDomainDiskDefPtr disk, virStorageSourcePtr src, size_t block_idx, - unsigned int backing_idx, virHashTablePtr stats, virHashTablePtr nodedata) { @@ -20056,16 +20055,16 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, char *alias = NULL; if (disk->info.alias) - alias = qemuDomainStorageAlias(disk->info.alias, backing_idx); + alias = qemuDomainStorageAlias(disk->info.alias, src->id); QEMU_ADD_NAME_PARAM(record, maxparams, "block", "name", block_idx, disk->dst); if (virStorageSourceIsLocalStorage(src) && src->path) QEMU_ADD_NAME_PARAM(record, maxparams, "block", "path", block_idx, src->path); - if (backing_idx) + if (src->id) QEMU_ADD_BLOCK_PARAM_UI(record, maxparams, block_idx, "backingIndex", - backing_idx); + src->id); /* the VM is offline so we have to go and load the stast from the disk by * ourselves */ @@ -20182,16 +20181,14 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver, for (i = 0; i < dom->def->ndisks; i++) { virDomainDiskDefPtr disk = dom->def->disks[i]; virStorageSourcePtr src = disk->src; - unsigned int backing_idx = 0; while (virStorageSourceIsBacking(src) && - (backing_idx == 0 || visitBacking)) { + (src == disk->src || visitBacking)) { if (qemuDomainGetStatsOneBlock(driver, cfg, dom, record, maxparams, - disk, src, visited, backing_idx, + disk, src, visited, stats, nodestats) < 0) goto cleanup; visited++; - backing_idx++; src = src->backingStore; } } -- 2.16.2

When using -blockdev you need to use the qdev path to refer to the disk fronends. Add means for storing the path and getting it after restart. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 27 +++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 2 ++ tests/qemustatusxml2xmldata/modern-in.xml | 3 +++ 3 files changed, 32 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 6103b86478..9c1a2c6053 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1065,6 +1065,7 @@ qemuDomainDiskPrivateDispose(void *obj) VIR_FREE(priv->blockJobError); virStorageSourceFree(priv->migrSource); + VIR_FREE(priv->backendQomName); } static virClassPtr qemuDomainStorageSourcePrivateClass; @@ -2123,6 +2124,30 @@ qemuStorageSourcePrivateDataFormat(virStorageSourcePtr src, } +static int +qemuDomainDiskPrivateParse(xmlXPathContextPtr ctxt, + virDomainDiskDefPtr disk) +{ + qemuDomainDiskPrivatePtr priv = QEMU_DOMAIN_DISK_PRIVATE(disk); + + priv->backendQomName = virXPathString("string(./qom/@backend)", ctxt); + + return 0; +} + + +static int +qemuDomainDiskPrivateFormat(virDomainDiskDefPtr disk, + virBufferPtr buf) +{ + qemuDomainDiskPrivatePtr priv = QEMU_DOMAIN_DISK_PRIVATE(disk); + + virBufferEscapeString(buf, "<qom backend='%s'/>\n", priv->backendQomName); + + return 0; +} + + static void qemuDomainObjPrivateXMLFormatVcpus(virBufferPtr buf, virDomainDefPtr def) @@ -2973,6 +2998,8 @@ virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks = { .alloc = qemuDomainObjPrivateAlloc, .free = qemuDomainObjPrivateFree, .diskNew = qemuDomainDiskPrivateNew, + .diskParse = qemuDomainDiskPrivateParse, + .diskFormat = qemuDomainDiskPrivateFormat, .vcpuNew = qemuDomainVcpuPrivateNew, .chrSourceNew = qemuDomainChrSourcePrivateNew, .vsockNew = qemuDomainVsockPrivateNew, diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 5dcbdfbbe1..7d0b304727 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -396,6 +396,8 @@ struct _qemuDomainDiskPrivate { /* information about the device */ bool tray; /* device has tray */ bool removable; /* device media can be removed/changed */ + + char *backendQomName; /* QOM path to the eligible block backend */ }; # define QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src) \ diff --git a/tests/qemustatusxml2xmldata/modern-in.xml b/tests/qemustatusxml2xmldata/modern-in.xml index 4fb5f326c2..21d4faca66 100644 --- a/tests/qemustatusxml2xmldata/modern-in.xml +++ b/tests/qemustatusxml2xmldata/modern-in.xml @@ -331,6 +331,9 @@ <target dev='vdb' bus='virtio'/> <alias name='virtio-disk1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/> + <privateData> + <qom backend='virtio-disk1/virtio-backend'/> + </privateData> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> -- 2.16.2

When we stop using -drive qemu stops reporting it in some of the monitor commands. To allow referring the disk frontends and the corresponding block backends we need to know these names. Unfortunately different buses require different names. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_alias.c | 86 +++++++++++++++++++++++++++++++++++-------------- src/qemu/qemu_alias.h | 3 +- src/qemu/qemu_hotplug.c | 2 +- 3 files changed, 65 insertions(+), 26 deletions(-) diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index 80d9b6cf46..be3663f8d2 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -175,44 +175,82 @@ qemuAssignDeviceControllerAlias(virDomainDefPtr domainDef, } -/* Our custom -drive naming scheme used with id= */ int qemuAssignDeviceDiskAlias(virDomainDefPtr def, - virDomainDiskDefPtr disk) + virDomainDiskDefPtr disk, + virQEMUCapsPtr qemuCaps) { + qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); const char *prefix = virDomainDiskBusTypeToString(disk->bus); int controllerModel = -1; if (disk->info.alias) return 0; - if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) { - if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) { - controllerModel = qemuDomainFindSCSIControllerModel(def, - &disk->info); - if (controllerModel < 0) + if (!disk->info.alias) { + if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) { + if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) { + controllerModel = qemuDomainFindSCSIControllerModel(def, + &disk->info); + if (controllerModel < 0) + return -1; + } + + if (disk->bus != VIR_DOMAIN_DISK_BUS_SCSI || + controllerModel == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC) { + if (virAsprintf(&disk->info.alias, "%s%d-%d-%d", prefix, + disk->info.addr.drive.controller, + disk->info.addr.drive.bus, + disk->info.addr.drive.unit) < 0) + return -1; + } else { + if (virAsprintf(&disk->info.alias, "%s%d-%d-%d-%d", prefix, + disk->info.addr.drive.controller, + disk->info.addr.drive.bus, + disk->info.addr.drive.target, + disk->info.addr.drive.unit) < 0) + return -1; + } + } else { + int idx = virDiskNameToIndex(disk->dst); + if (virAsprintf(&disk->info.alias, "%s-disk%d", prefix, idx) < 0) return -1; } + } - if (disk->bus != VIR_DOMAIN_DISK_BUS_SCSI || - controllerModel == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC) { - if (virAsprintf(&disk->info.alias, "%s%d-%d-%d", prefix, - disk->info.addr.drive.controller, - disk->info.addr.drive.bus, - disk->info.addr.drive.unit) < 0) + /* For -blockdev we need to know the QDEV ids of the block backend of the + * disk. The QDEV id used by qemu is based on the alias so we generate them + * here. */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) { + switch ((virDomainDiskBus) disk->bus) { + case VIR_DOMAIN_DISK_BUS_IDE: + case VIR_DOMAIN_DISK_BUS_SATA: + case VIR_DOMAIN_DISK_BUS_SCSI: + if (VIR_STRDUP(diskPriv->backendQomName, disk->info.alias) < 0) return -1; - } else { - if (virAsprintf(&disk->info.alias, "%s%d-%d-%d-%d", prefix, - disk->info.addr.drive.controller, - disk->info.addr.drive.bus, - disk->info.addr.drive.target, - disk->info.addr.drive.unit) < 0) + break; + + case VIR_DOMAIN_DISK_BUS_VIRTIO: + if (virAsprintf(&diskPriv->backendQomName, + "/machine/peripheral/%s/virtio-backend", + disk->info.alias) < 0) return -1; + break; + + case VIR_DOMAIN_DISK_BUS_USB: + if (virAsprintf(&diskPriv->backendQomName, + "/machine/peripheral/%s/%s.0/legacy[0]", + disk->info.alias, disk->info.alias) < 0) + return -1; + break; + + case VIR_DOMAIN_DISK_BUS_FDC: + case VIR_DOMAIN_DISK_BUS_XEN: + case VIR_DOMAIN_DISK_BUS_UML: + case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_LAST: + break; } - } else { - int idx = virDiskNameToIndex(disk->dst); - if (virAsprintf(&disk->info.alias, "%s-disk%d", prefix, idx) < 0) - return -1; } return 0; @@ -551,7 +589,7 @@ qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) size_t i; for (i = 0; i < def->ndisks; i++) { - if (qemuAssignDeviceDiskAlias(def, def->disks[i]) < 0) + if (qemuAssignDeviceDiskAlias(def, def->disks[i], qemuCaps) < 0) return -1; } for (i = 0; i < def->nnets; i++) { diff --git a/src/qemu/qemu_alias.h b/src/qemu/qemu_alias.h index 7bfebff968..33b9937ea4 100644 --- a/src/qemu/qemu_alias.h +++ b/src/qemu/qemu_alias.h @@ -39,7 +39,8 @@ int qemuAssignDeviceControllerAlias(virDomainDefPtr domainDef, virDomainControllerDefPtr controller); int qemuAssignDeviceDiskAlias(virDomainDefPtr def, - virDomainDiskDefPtr disk); + virDomainDiskDefPtr disk, + virQEMUCapsPtr qemuCaps); int qemuAssignDeviceHostdevAlias(virDomainDefPtr def, char **alias, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 1538abf155..87efd3b411 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -646,7 +646,7 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, if (qemuHotplugPrepareDiskAccess(driver, vm, disk, NULL, false) < 0) goto cleanup; - if (qemuAssignDeviceDiskAlias(vm->def, disk) < 0) + if (qemuAssignDeviceDiskAlias(vm->def, disk, priv->qemuCaps) < 0) goto error; if (qemuDomainPrepareDiskSource(disk, priv, cfg) < 0) -- 2.16.2

The copy-on-read feature is expressed by adding a new node layer in qemu when using -blockdev. Since we will keep these per-disk (as opposed to per storage source) we need to store the appropriate node names in the disk definition. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 11 +++++++++++ src/qemu/qemu_domain.h | 1 + tests/qemustatusxml2xmldata/modern-in.xml | 3 +++ 3 files changed, 15 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9c1a2c6053..c98be208f1 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1066,6 +1066,7 @@ qemuDomainDiskPrivateDispose(void *obj) VIR_FREE(priv->blockJobError); virStorageSourceFree(priv->migrSource); VIR_FREE(priv->backendQomName); + VIR_FREE(priv->nodeCopyOnRead); } static virClassPtr qemuDomainStorageSourcePrivateClass; @@ -2131,6 +2132,7 @@ qemuDomainDiskPrivateParse(xmlXPathContextPtr ctxt, qemuDomainDiskPrivatePtr priv = QEMU_DOMAIN_DISK_PRIVATE(disk); priv->backendQomName = virXPathString("string(./qom/@backend)", ctxt); + priv->nodeCopyOnRead = virXPathString("string(./nodenames/nodename[@type='copyOnRead']/@name)", ctxt); return 0; } @@ -2144,6 +2146,15 @@ qemuDomainDiskPrivateFormat(virDomainDiskDefPtr disk, virBufferEscapeString(buf, "<qom backend='%s'/>\n", priv->backendQomName); + if (priv->nodeCopyOnRead) { + virBufferAddLit(buf, "<nodenames>\n"); + virBufferAdjustIndent(buf, 2); + virBufferEscapeString(buf, "<nodename type='copyOnRead' name='%s'/>\n", + priv->nodeCopyOnRead); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</nodenames>\n"); + } + return 0; } diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 7d0b304727..d3147cb69a 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -398,6 +398,7 @@ struct _qemuDomainDiskPrivate { bool removable; /* device media can be removed/changed */ char *backendQomName; /* QOM path to the eligible block backend */ + char *nodeCopyOnRead; /* nodename of the disk-wide copy-on-read blockdev layer */ }; # define QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src) \ diff --git a/tests/qemustatusxml2xmldata/modern-in.xml b/tests/qemustatusxml2xmldata/modern-in.xml index 21d4faca66..612090786a 100644 --- a/tests/qemustatusxml2xmldata/modern-in.xml +++ b/tests/qemustatusxml2xmldata/modern-in.xml @@ -333,6 +333,9 @@ <address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/> <privateData> <qom backend='virtio-disk1/virtio-backend'/> + <nodenames> + <nodename type='copyOnRead' name='cor-node'/> + </nodenames> </privateData> </disk> <disk type='file' device='cdrom'> -- 2.16.2

Prepare the full backing chain by instantiating authentication and TLS transport secrets and other necessary objects so that we can add the full backing chain explicitly to qemu. This also includes allocation of nodenames for the individual backing chain members. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index c98be208f1..526634d819 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -137,6 +137,14 @@ static virClassPtr qemuDomainSaveCookieClass; static void qemuDomainLogContextDispose(void *obj); static void qemuDomainSaveCookieDispose(void *obj); + +static int +qemuDomainPrepareStorageSourceBlockdev(virDomainDiskDefPtr disk, + virStorageSourcePtr src, + qemuDomainObjPrivatePtr priv, + virQEMUDriverConfigPtr cfg); + + static int qemuDomainOnceInit(void) { @@ -8638,6 +8646,10 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, if (qemuDomainPrepareDiskSourceData(disk, n, cfg, priv->qemuCaps) < 0) goto cleanup; + + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV) && + qemuDomainPrepareStorageSourceBlockdev(disk, n, priv, cfg) < 0) + goto cleanup; } ret = 0; @@ -13085,6 +13097,61 @@ qemuDomainPrepareDiskSourceLegacy(virDomainDiskDefPtr disk, } +static int +qemuDomainPrepareStorageSourceBlockdev(virDomainDiskDefPtr disk, + virStorageSourcePtr src, + qemuDomainObjPrivatePtr priv, + virQEMUDriverConfigPtr cfg) +{ + src->id = qemuDomainStorageIdNew(priv); + + if (virAsprintf(&src->nodestorage, "libvirt-%u-storage", src->id) < 0 || + virAsprintf(&src->nodeformat, "libvirt-%u-format", src->id) < 0) + return -1; + + if (qemuDomainValidateStorageSource(src, priv->qemuCaps) < 0) + return -1; + + if (qemuDomainPrepareDiskSourceData(disk, src, cfg, priv->qemuCaps) < 0) + return -1; + + if (qemuDomainSecretStorageSourcePrepare(priv, src, + src->nodestorage, + src->nodeformat) < 0) + return -1; + + if (qemuDomainPrepareStorageSourcePR(disk->src, priv, src->nodestorage) < 0) + return -1; + + if (qemuDomainPrepareStorageSourceTLS(disk->src, cfg, src->nodestorage, + priv->qemuCaps) < 0) + return -1; + + return 0; +} + + +static int +qemuDomainPrepareDiskSourceBlockdev(virDomainDiskDefPtr disk, + qemuDomainObjPrivatePtr priv, + virQEMUDriverConfigPtr cfg) +{ + qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); + virStorageSourcePtr n; + + if (disk->copy_on_read == VIR_TRISTATE_SWITCH_ON && + virAsprintf(&diskPriv->nodeCopyOnRead, "libvirt-CoR-%s", disk->dst) < 0) + return -1; + + for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) { + if (qemuDomainPrepareStorageSourceBlockdev(disk, n, priv, cfg) < 0) + return -1; + } + + return 0; +} + + int qemuDomainPrepareDiskSource(virDomainDiskDefPtr disk, qemuDomainObjPrivatePtr priv, @@ -13092,8 +13159,13 @@ qemuDomainPrepareDiskSource(virDomainDiskDefPtr disk, { qemuDomainPrepareDiskCachemode(disk); - if (qemuDomainPrepareDiskSourceLegacy(disk, priv, cfg) < 0) - return -1; + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) { + if (qemuDomainPrepareDiskSourceBlockdev(disk, priv, cfg) < 0) + return -1; + } else { + if (qemuDomainPrepareDiskSourceLegacy(disk, priv, cfg) < 0) + return -1; + } return 0; } -- 2.16.2

The copy on read functionality is done using a separate layer in the backing chain. Add function to generate properties for it. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_block.c | 22 ++++++++++++++++++++++ src/qemu/qemu_block.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 509b0a5210..d8020eecbe 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -1743,3 +1743,25 @@ qemuBlockSnapshotAddLegacy(virJSONValuePtr actions, VIR_FREE(source); return ret; } + + +/** + * qemuBlockStorageGetCopyOnReadProps: + * @disk: disk with copy-on-read enabled + * + * Creates blockdev properties for a disk copy-on-read layer. + */ +virJSONValuePtr +qemuBlockStorageGetCopyOnReadProps(virDomainDiskDefPtr disk) +{ + qemuDomainDiskPrivatePtr priv = QEMU_DOMAIN_DISK_PRIVATE(disk); + virJSONValuePtr ret = NULL; + + ignore_value(virJSONValueObjectCreate(&ret, + "s:driver", "copy-on-read", + "s:node-name", priv->nodeCopyOnRead, + "s:file", disk->src->nodeformat, + NULL)); + + return ret; +} diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h index fd8984e60b..62ed5027cb 100644 --- a/src/qemu/qemu_block.h +++ b/src/qemu/qemu_block.h @@ -67,6 +67,8 @@ qemuBlockStorageSourceGetURI(virStorageSourcePtr src); virJSONValuePtr qemuBlockStorageSourceGetBlockdevProps(virStorageSourcePtr src); +virJSONValuePtr +qemuBlockStorageGetCopyOnReadProps(virDomainDiskDefPtr disk); typedef struct qemuBlockStorageSourceAttachData qemuBlockStorageSourceAttachData; typedef qemuBlockStorageSourceAttachData *qemuBlockStorageSourceAttachDataPtr; -- 2.16.2

Pass in the node name as the backend alias when -blockdev is used. As copy-on-read is expressed by a separate -blockdev backing chain member we need to decide which node name to use here. For empty cdroms when using -blockdev there is no backend at all so NULL is returned. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 526634d819..ea3929ce7e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8676,12 +8676,29 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, */ int qemuDomainDiskGetBackendAlias(virDomainDiskDefPtr disk, - virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSED, + virQEMUCapsPtr qemuCaps, char **backendAlias) { + qemuDomainDiskPrivatePtr priv = QEMU_DOMAIN_DISK_PRIVATE(disk); + const char *nodename = NULL; *backendAlias = NULL; - if (!(*backendAlias = qemuAliasDiskDriveFromDisk(disk))) + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) { + if (!(*backendAlias = qemuAliasDiskDriveFromDisk(disk))) + return -1; + + return 0; + } + + if (virStorageSourceIsEmpty(disk->src)) + return 0; + + if (disk->copy_on_read == VIR_TRISTATE_SWITCH_ON) + nodename = priv->nodeCopyOnRead; + else + nodename = disk->src->nodeformat; + + if (VIR_STRDUP(*backendAlias, nodename) < 0) return -1; return 0; -- 2.16.2

Format the backing chain onto the commandline using the 'json' syntax with -blockdev. The command line formatter needs only minor tweaks to add the new entries but we now need to initialize the strucutres that are used for every layer of the backing chain. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 84 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 76 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index d148db90fa..3cce1bb05e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2237,6 +2237,8 @@ static int qemuBuildBlockStorageSourceAttachDataCommandline(virCommandPtr cmd, qemuBlockStorageSourceAttachDataPtr data) { + char *tmp; + if (qemuBuildObjectCommandline(cmd, data->prmgrProps) < 0 || qemuBuildObjectCommandline(cmd, data->authsecretProps) < 0 || qemuBuildObjectCommandline(cmd, data->encryptsecretProps) < 0 || @@ -2246,6 +2248,22 @@ qemuBuildBlockStorageSourceAttachDataCommandline(virCommandPtr cmd, if (data->driveCmd) virCommandAddArgList(cmd, "-drive", data->driveCmd, NULL); + if (data->storageProps) { + if (!(tmp = virJSONValueToString(data->storageProps, false))) + return -1; + + virCommandAddArgList(cmd, "-blockdev", tmp, NULL); + VIR_FREE(tmp); + } + + if (data->formatProps) { + if (!(tmp = virJSONValueToString(data->formatProps, false))) + return -1; + + virCommandAddArgList(cmd, "-blockdev", tmp, NULL); + VIR_FREE(tmp); + } + return 0; } @@ -2256,21 +2274,71 @@ qemuBuildDiskSourceCommandLine(virCommandPtr cmd, virQEMUCapsPtr qemuCaps, bool driveBoot) { - qemuBlockStorageSourceAttachDataPtr data = NULL; + qemuBlockStorageSourceAttachDataPtr *data = NULL; + size_t ndata = 0; + qemuBlockStorageSourceAttachDataPtr tmp = NULL; + virJSONValuePtr copyOnReadProps = NULL; + virStorageSourcePtr n; + char *str = NULL; + size_t i; int ret = -1; - if (!(data = qemuBuildStorageSourceAttachPrepareDrive(disk, qemuCaps, - driveBoot))) - return -1; + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) { + if (virStorageSourceIsEmpty(disk->src)) { + ret = 0; + goto cleanup; + } - if (qemuBuildStorageSourceAttachPrepareCommon(disk->src, data, qemuCaps) < 0 || - qemuBuildBlockStorageSourceAttachDataCommandline(cmd, data) < 0) - goto cleanup; + for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) { + if (!(tmp = qemuBlockStorageSourceAttachPrepareBlockdev(n))) + goto cleanup; + + if (qemuBuildStorageSourceAttachPrepareCommon(n, tmp, qemuCaps) < 0) + goto cleanup; + + if (VIR_APPEND_ELEMENT(data, ndata, tmp) < 0) + goto cleanup; + } + + if (disk->copy_on_read == VIR_TRISTATE_SWITCH_ON && + !(copyOnReadProps = qemuBlockStorageGetCopyOnReadProps(disk))) + goto cleanup; + } else { + if (!(tmp = qemuBuildStorageSourceAttachPrepareDrive(disk, qemuCaps, + driveBoot))) + goto cleanup; + + if (qemuBuildStorageSourceAttachPrepareCommon(disk->src, tmp, + qemuCaps) < 0) + goto cleanup; + + if (VIR_APPEND_ELEMENT(data, ndata, tmp) < 0) + goto cleanup; + } + + for (i = ndata; i > 0; i--) { + if (qemuBuildBlockStorageSourceAttachDataCommandline(cmd, + data[i - 1]) < 0) + goto cleanup; + } + + if (copyOnReadProps) { + if (!(str = virJSONValueToString(copyOnReadProps, false))) + goto cleanup; + + virCommandAddArgList(cmd, "-blockdev", str, NULL); + VIR_FREE(str); + } ret = 0; cleanup: - qemuBlockStorageSourceAttachDataFree(data); + for (i = 0; i < ndata; i++) + qemuBlockStorageSourceAttachDataFree(data[i]); + VIR_FREE(data); + qemuBlockStorageSourceAttachDataFree(tmp); + virJSONValueFree(copyOnReadProps); + VIR_FREE(str); return ret; } -- 2.16.2

Add a helper which will use a collection of other helpers to determine whether a disk requires throttling to be enabled. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 10 ++++++++++ src/qemu/qemu_command.h | 3 +++ 2 files changed, 13 insertions(+) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 3cce1bb05e..35cef61720 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1031,6 +1031,16 @@ qemuDiskConfigBlkdeviotuneHasMaxLength(virDomainDiskDefPtr disk) } +bool +qemuDiskConfigBlkdeviotuneEnabled(virDomainDiskDefPtr disk) +{ + return !!disk->blkdeviotune.group_name || + qemuDiskConfigBlkdeviotuneHasBasic(disk) || + qemuDiskConfigBlkdeviotuneHasMax(disk) || + qemuDiskConfigBlkdeviotuneHasMaxLength(disk); +} + + /** * qemuCheckDiskConfigBlkdeviotune: * @disk: disk configuration diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index cf17dc1ede..b8fbbbb92a 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -181,6 +181,9 @@ int qemuGetDriveSourceString(virStorageSourcePtr src, qemuDomainSecretInfoPtr secinfo, char **source); +bool +qemuDiskConfigBlkdeviotuneEnabled(virDomainDiskDefPtr disk); + int qemuCheckDiskConfig(virDomainDiskDefPtr disk, virQEMUCapsPtr qemuCaps); -- 2.16.2

The proper way to do this would be to use the 'throttle' driver but unfortunately it can't change the 'throttle_group' so we can't provide feature parity. This hack uses the block_set_io_throttle command to do so until we can properly replace it. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_process.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 334044f479..2183127133 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6233,6 +6233,53 @@ qemuProcessGenID(virDomainObjPtr vm, } +/** + * qemuProcessSetupDiskThrottlingBlockdev: + * + * Sets up disk trottling for -blockdev via block_set_io_throttle monitor + * command. This hack should be replaced by proper use of the 'throttle' + * blockdev driver in qemu once it will support changing of the throttle group. + */ +static int +qemuProcessSetupDiskThrottlingBlockdev(virQEMUDriverPtr driver, + virDomainObjPtr vm, + qemuDomainAsyncJob asyncJob) +{ + qemuDomainObjPrivatePtr priv = vm->privateData; + size_t i; + int ret = -1; + + if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) + return 0; + + VIR_DEBUG("Setting up disk throttling for -blockdev via block_set_io_throttle"); + + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) + return -1; + + for (i = 0; i < vm->def->ndisks; i++) { + virDomainDiskDefPtr disk = vm->def->disks[i]; + qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); + + if (!qemuDiskConfigBlkdeviotuneEnabled(disk)) + continue; + + if (qemuMonitorSetBlockIoThrottle(qemuDomainGetMonitor(vm), NULL, + diskPriv->backendQomName, + &disk->blkdeviotune, + true, true, true) < 0) + goto cleanup; + } + + ret = 0; + + cleanup: + if (qemuDomainObjExitMonitor(driver, vm) < 0) + ret = -1; + return ret; +} + + /** * qemuProcessLaunch: * @@ -6551,6 +6598,9 @@ qemuProcessLaunch(virConnectPtr conn, if (qemuProcessSetupBalloon(driver, vm, asyncJob) < 0) goto cleanup; + if (qemuProcessSetupDiskThrottlingBlockdev(driver, vm, asyncJob) < 0) + goto cleanup; + /* Since CPUs were not started yet, the balloon could not return the memory * to the host and thus cur_balloon needs to be updated so that GetXMLdesc * and friends return the correct size in case they can't grab the job */ -- 2.16.2

With -blockdev the drive alias can't be used any more so we need to switch to the QOM name. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8e941d7a60..f994eb1538 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18216,7 +18216,8 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, virDomainDefPtr def = NULL; virDomainDefPtr persistentDef = NULL; virDomainBlockIoTuneInfo info; - char *device = NULL; + char *drivealias = NULL; + const char *qdevid = NULL; int ret = -1; size_t i; virDomainDiskDefPtr conf_disk = NULL; @@ -18441,8 +18442,12 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, if (!(disk = qemuDomainDiskByName(def, path))) goto endjob; - if (!(device = qemuAliasDiskDriveFromDisk(disk))) - goto endjob; + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) { + qdevid = QEMU_DOMAIN_DISK_PRIVATE(disk)->backendQomName; + } else { + if (!(drivealias = qemuAliasDiskDriveFromDisk(disk))) + goto endjob; + } if (qemuDomainSetBlockIoTuneDefaults(&info, &disk->blkdeviotune, set_fields) < 0) @@ -18488,7 +18493,7 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, * via the JSON error code from the block_set_io_throttle call */ qemuDomainObjEnterMonitor(driver, vm); - ret = qemuMonitorSetBlockIoThrottle(priv->mon, device, NULL, + ret = qemuMonitorSetBlockIoThrottle(priv->mon, drivealias, qdevid, &info, supportMaxOptions, set_fields & QEMU_BLOCK_IOTUNE_SET_GROUP_NAME, supportMaxLengthOptions); @@ -18538,7 +18543,7 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, cleanup: VIR_FREE(info.group_name); - VIR_FREE(device); + VIR_FREE(drivealias); virDomainObjEndAPI(&vm); if (eventNparams) virTypedParamsFree(eventParams, eventNparams); @@ -18560,7 +18565,8 @@ qemuDomainGetBlockIoTune(virDomainPtr dom, virDomainDefPtr def = NULL; virDomainDefPtr persistentDef = NULL; virDomainBlockIoTuneInfo reply = {0}; - char *device = NULL; + char *drivealias = NULL; + const char *qdevid = NULL; int ret = -1; int maxparams; @@ -18614,10 +18620,14 @@ qemuDomainGetBlockIoTune(virDomainPtr dom, if (!(disk = qemuDomainDiskByName(def, path))) goto endjob; - if (!(device = qemuAliasDiskDriveFromDisk(disk))) - goto endjob; + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) { + qdevid = QEMU_DOMAIN_DISK_PRIVATE(disk)->backendQomName; + } else { + if (!(drivealias = qemuAliasDiskDriveFromDisk(disk))) + goto endjob; + } qemuDomainObjEnterMonitor(driver, vm); - ret = qemuMonitorGetBlockIoThrottle(priv->mon, device, NULL, &reply); + ret = qemuMonitorGetBlockIoThrottle(priv->mon, drivealias, qdevid, &reply); if (qemuDomainObjExitMonitor(driver, vm) < 0) goto endjob; if (ret < 0) @@ -18692,7 +18702,7 @@ qemuDomainGetBlockIoTune(virDomainPtr dom, cleanup: VIR_FREE(reply.group_name); - VIR_FREE(device); + VIR_FREE(drivealias); virDomainObjEndAPI(&vm); return ret; } -- 2.16.2

Use the nodename to resize the device rather than the drive alias. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f994eb1538..7541beb718 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -10959,6 +10959,7 @@ qemuDomainBlockResize(virDomainPtr dom, qemuDomainObjPrivatePtr priv; int ret = -1; char *device = NULL; + const char *nodename = NULL; virDomainDiskDefPtr disk = NULL; virCheckFlags(VIR_DOMAIN_BLOCK_RESIZE_BYTES, -1); @@ -11001,11 +11002,22 @@ qemuDomainBlockResize(virDomainPtr dom, disk->src->format == VIR_STORAGE_FILE_QED) size = VIR_ROUND_UP(size, 512); - if (!(device = qemuAliasDiskDriveFromDisk(disk))) - goto endjob; + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) { + if (virStorageSourceIsEmpty(disk->src) || disk->src->readonly) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("can't resize empty or readonly disk '%s'"), + disk->dst); + goto endjob; + } + + nodename = disk->src->nodeformat; + } else { + if (!(device = qemuAliasDiskDriveFromDisk(disk))) + goto endjob; + } qemuDomainObjEnterMonitor(driver, vm); - if (qemuMonitorBlockResize(priv->mon, device, NULL, size) < 0) { + if (qemuMonitorBlockResize(priv->mon, device, nodename, size) < 0) { ignore_value(qemuDomainObjExitMonitor(driver, vm)); goto endjob; } -- 2.16.2

Initialize data for the whole backing chain when plugging in or removing disks when a machine supports -blockdev. Similarly to startup we need to prepare the structures for the whole backing chain and take care of the copy-on-read feature. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_hotplug.c | 75 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 87efd3b411..3eddb0043e 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -380,6 +380,10 @@ qemuHotplugRemoveManagedPR(virQEMUDriverPtr driver, struct _qemuHotplugDiskSourceData { qemuBlockStorageSourceAttachDataPtr *backends; size_t nbackends; + + /* disk copy-on-read object */ + virJSONValuePtr corProps; + char *corAlias; }; typedef struct _qemuHotplugDiskSourceData qemuHotplugDiskSourceData; typedef qemuHotplugDiskSourceData *qemuHotplugDiskSourceDataPtr; @@ -393,6 +397,9 @@ qemuHotplugDiskSourceDataFree(qemuHotplugDiskSourceDataPtr data) if (!data) return; + virJSONValueFree(data->corProps); + VIR_FREE(data->corAlias); + for (i = 0; i < data->nbackends; i++) qemuBlockStorageSourceAttachDataFree(data->backends[i]); @@ -461,25 +468,40 @@ qemuHotplugRemoveStorageSourcePrepareData(virStorageSourcePtr src, static qemuHotplugDiskSourceDataPtr qemuHotplugDiskSourceRemovePrepare(virDomainDiskDefPtr disk, - virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSED) + virQEMUCapsPtr qemuCaps) { + qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); qemuBlockStorageSourceAttachDataPtr backend = NULL; qemuHotplugDiskSourceDataPtr data = NULL; qemuHotplugDiskSourceDataPtr ret = NULL; char *drivealias = NULL; + virStorageSourcePtr n; if (VIR_ALLOC(data) < 0) return NULL; - if (!(drivealias = qemuAliasDiskDriveFromDisk(disk))) - goto cleanup; + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) { + if (VIR_STRDUP(data->corAlias, diskPriv->nodeCopyOnRead) < 0) + goto cleanup; - if (!(backend = qemuHotplugRemoveStorageSourcePrepareData(disk->src, - drivealias))) - goto cleanup; + for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) { + if (!(backend = qemuHotplugRemoveStorageSourcePrepareData(n, NULL))) + goto cleanup; - if (VIR_APPEND_ELEMENT(data->backends, data->nbackends, backend) < 0) - goto cleanup; + if (VIR_APPEND_ELEMENT(data->backends, data->nbackends, backend) < 0) + goto cleanup; + } + } else { + if (!(drivealias = qemuAliasDiskDriveFromDisk(disk))) + goto cleanup; + + if (!(backend = qemuHotplugRemoveStorageSourcePrepareData(disk->src, + drivealias))) + goto cleanup; + + if (VIR_APPEND_ELEMENT(data->backends, data->nbackends, backend) < 0) + goto cleanup; + } VIR_STEAL_PTR(ret, data); @@ -505,18 +527,36 @@ qemuHotplugDiskSourceAttachPrepare(virDomainDiskDefPtr disk, qemuBlockStorageSourceAttachDataPtr backend; qemuHotplugDiskSourceDataPtr data; qemuHotplugDiskSourceDataPtr ret = NULL; + virStorageSourcePtr n; if (VIR_ALLOC(data) < 0) return NULL; - if (!(backend = qemuBuildStorageSourceAttachPrepareDrive(disk, qemuCaps, false))) - goto cleanup; + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) { + if (disk->copy_on_read == VIR_TRISTATE_SWITCH_ON && + !(data->corProps = qemuBlockStorageGetCopyOnReadProps(disk))) + goto cleanup; - if (qemuBuildStorageSourceAttachPrepareCommon(disk->src, backend, qemuCaps) < 0) - goto cleanup; + for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) { + if (!(backend = qemuBlockStorageSourceAttachPrepareBlockdev(n))) + goto cleanup; - if (VIR_APPEND_ELEMENT(data->backends, data->nbackends, backend) < 0) - goto cleanup; + if (qemuBuildStorageSourceAttachPrepareCommon(n, backend, qemuCaps) < 0) + goto cleanup; + + if (VIR_APPEND_ELEMENT(data->backends, data->nbackends, backend) < 0) + goto cleanup; + } + } else { + if (!(backend = qemuBuildStorageSourceAttachPrepareDrive(disk, qemuCaps, false))) + goto cleanup; + + if (qemuBuildStorageSourceAttachPrepareCommon(disk->src, backend, qemuCaps) < 0) + goto cleanup; + + if (VIR_APPEND_ELEMENT(data->backends, data->nbackends, backend) < 0) + goto cleanup; + } VIR_STEAL_PTR(ret, data); @@ -546,6 +586,10 @@ qemuHotplugDiskSourceAttach(qemuMonitorPtr mon, return -1; } + if (data->corProps && + qemuMonitorAddObject(mon, &data->corProps, &data->corAlias) < 0) + return -1; + return 0; } @@ -566,6 +610,9 @@ qemuHotplugDiskSourceRemove(qemuMonitorPtr mon, { size_t i; + if (data->corAlias) + ignore_value(qemuMonitorDelObject(mon, data->corAlias)); + for (i = 0; i < data->nbackends; i++) qemuBlockStorageSourceAttachRollback(mon, data->backends[i]); } -- 2.16.2

With blockdev we can use the full range of commands to manipulate the tray and the medium separately. Implement monitor code for this. Schema testing done in the qemumonitorjsontest allows us to verify that we generate the commands correctly. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 51 +++++++++++++++++++ src/qemu/qemu_monitor.h | 14 ++++++ src/qemu/qemu_monitor_json.c | 114 +++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 18 +++++++ tests/qemumonitorjsontest.c | 8 +++ 5 files changed, 205 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 4dcbd69dce..d665f33d81 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4334,6 +4334,57 @@ qemuMonitorBlockdevDel(qemuMonitorPtr mon, return qemuMonitorJSONBlockdevDel(mon, nodename); } +int +qemuMonitorBlockdevTrayOpen(qemuMonitorPtr mon, + const char *id, + bool force) +{ + VIR_DEBUG("id=%s force=%d", id, force); + + QEMU_CHECK_MONITOR(mon); + + return qemuMonitorJSONBlockdevTrayOpen(mon, id, force); +} + + +int +qemuMonitorBlockdevTrayClose(qemuMonitorPtr mon, + const char *id) +{ + VIR_DEBUG("id=%s", id); + + QEMU_CHECK_MONITOR(mon); + + return qemuMonitorJSONBlockdevTrayClose(mon, id); +} + + +int +qemuMonitorBlockdevMediumRemove(qemuMonitorPtr mon, + const char *id) +{ + VIR_DEBUG("id=%s", id); + + QEMU_CHECK_MONITOR(mon); + + return qemuMonitorJSONBlockdevMediumRemove(mon, id); +} + + + +int +qemuMonitorBlockdevMediumInsert(qemuMonitorPtr mon, + const char *id, + const char *nodename) +{ + VIR_DEBUG("id=%s nodename=%s", id, nodename); + + QEMU_CHECK_MONITOR(mon); + + return qemuMonitorJSONBlockdevMediumInsert(mon, id, nodename); +} + + char * qemuMonitorGetSEVMeasurement(qemuMonitorPtr mon) { diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index f8f6969ddb..0734588f66 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1151,6 +1151,20 @@ int qemuMonitorBlockdevAdd(qemuMonitorPtr mon, int qemuMonitorBlockdevDel(qemuMonitorPtr mon, const char *nodename); +int qemuMonitorBlockdevTrayOpen(qemuMonitorPtr mon, + const char *id, + bool force); + +int qemuMonitorBlockdevTrayClose(qemuMonitorPtr mon, + const char *id); + +int qemuMonitorBlockdevMediumRemove(qemuMonitorPtr mon, + const char *id); + +int qemuMonitorBlockdevMediumInsert(qemuMonitorPtr mon, + const char *id, + const char *nodename); + char * qemuMonitorGetSEVMeasurement(qemuMonitorPtr mon); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index de3fcd83d8..105f6f78ac 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -8004,6 +8004,120 @@ qemuMonitorJSONBlockdevDel(qemuMonitorPtr mon, return ret; } + +int +qemuMonitorJSONBlockdevTrayOpen(qemuMonitorPtr mon, + const char *id, + bool force) +{ + virJSONValuePtr cmd; + virJSONValuePtr reply = NULL; + int ret = -1; + + if (!(cmd = qemuMonitorJSONMakeCommand("blockdev-open-tray", + "s:id", id, + "b:force", force, NULL))) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + goto cleanup; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + goto cleanup; + + ret = 0; + + cleanup: + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} + + +int +qemuMonitorJSONBlockdevTrayClose(qemuMonitorPtr mon, + const char *id) +{ + virJSONValuePtr cmd; + virJSONValuePtr reply = NULL; + int ret = -1; + + if (!(cmd = qemuMonitorJSONMakeCommand("blockdev-close-tray", + "s:id", id, NULL))) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + goto cleanup; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + goto cleanup; + + ret = 0; + + cleanup: + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} + + +int +qemuMonitorJSONBlockdevMediumRemove(qemuMonitorPtr mon, + const char *id) +{ + virJSONValuePtr cmd; + virJSONValuePtr reply = NULL; + int ret = -1; + + if (!(cmd = qemuMonitorJSONMakeCommand("blockdev-remove-medium", + "s:id", id, NULL))) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + goto cleanup; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + goto cleanup; + + ret = 0; + + cleanup: + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} + + +int +qemuMonitorJSONBlockdevMediumInsert(qemuMonitorPtr mon, + const char *id, + const char *nodename) +{ + virJSONValuePtr cmd; + virJSONValuePtr reply = NULL; + int ret = -1; + + if (!(cmd = qemuMonitorJSONMakeCommand("blockdev-insert-medium", + "s:id", id, + "s:node-name", nodename, + NULL))) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + goto cleanup; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + goto cleanup; + + ret = 0; + + cleanup: + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} + + /** * The function is used to retrieve the measurement of a SEV guest. * The measurement is signature of the memory contents that was encrypted diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 19aebef5fb..3c5839db38 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -549,6 +549,24 @@ int qemuMonitorJSONBlockdevDel(qemuMonitorPtr mon, const char *nodename) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +int qemuMonitorJSONBlockdevTrayOpen(qemuMonitorPtr mon, + const char *id, + bool force) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + +int qemuMonitorJSONBlockdevTrayClose(qemuMonitorPtr mon, + const char *id) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + +int qemuMonitorJSONBlockdevMediumRemove(qemuMonitorPtr mon, + const char *id) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + +int qemuMonitorJSONBlockdevMediumInsert(qemuMonitorPtr mon, + const char *id, + const char *nodename) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); + int qemuMonitorJSONGetPRManagerInfo(qemuMonitorPtr mon, virHashTablePtr info) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index b048c40d7d..7c4947374f 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -1352,6 +1352,10 @@ GEN_TEST_FUNC(qemuMonitorJSONOpenGraphics, "spice", "spicefd", false) GEN_TEST_FUNC(qemuMonitorJSONNBDServerStart, "localhost", 12345, "test-alias") GEN_TEST_FUNC(qemuMonitorJSONNBDServerAdd, "vda", true) GEN_TEST_FUNC(qemuMonitorJSONDetachCharDev, "serial1") +GEN_TEST_FUNC(qemuMonitorJSONBlockdevTrayOpen, "foodev", true) +GEN_TEST_FUNC(qemuMonitorJSONBlockdevTrayClose, "foodev") +GEN_TEST_FUNC(qemuMonitorJSONBlockdevMediumRemove, "foodev") +GEN_TEST_FUNC(qemuMonitorJSONBlockdevMediumInsert, "foodev", "newnode") static bool testQemuMonitorJSONqemuMonitorJSONQueryCPUsEqual(struct qemuMonitorQueryCpusEntry *a, @@ -2997,6 +3001,10 @@ mymain(void) DO_TEST_GEN(qemuMonitorJSONNBDServerStart); DO_TEST_GEN(qemuMonitorJSONNBDServerAdd); DO_TEST_GEN(qemuMonitorJSONDetachCharDev); + DO_TEST_GEN(qemuMonitorJSONBlockdevTrayOpen); + DO_TEST_GEN(qemuMonitorJSONBlockdevTrayClose); + DO_TEST_GEN(qemuMonitorJSONBlockdevMediumRemove); + DO_TEST_GEN(qemuMonitorJSONBlockdevMediumInsert); DO_TEST(qemuMonitorJSONGetBalloonInfo); DO_TEST(qemuMonitorJSONGetBlockInfo); DO_TEST(qemuMonitorJSONGetAllBlockStatsInfo); -- 2.16.2

Use the new APIs which allow to manipulate the tray and media separately and also allow using a nodename to refer to a media to implement media changing. With the new approach we don't have to call eject twice as the media is removed by calling qemuMonitorBlockdevMediumRemove. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_hotplug.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 3eddb0043e..97a486f2ea 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -618,6 +618,93 @@ qemuHotplugDiskSourceRemove(qemuMonitorPtr mon, } +/** + * qemuDomainChangeMediaBlockdev: + * @driver: qemu driver structure + * @vm: domain definition + * @disk: disk definition to change the source of + * @newsrc: new disk source to change to + * @force: force the change of media + * + * Change the media in an ejectable device to the one described by + * @newsrc. This function also removes the old source from the + * shared device table if appropriate. Note that newsrc is consumed + * on success and the old source is freed on success. + * + * Returns 0 on success, -1 on error and reports libvirt error + */ +static int +qemuDomainChangeMediaBlockdev(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainDiskDefPtr disk, + virStorageSourcePtr newsrc, + bool force) +{ + qemuDomainObjPrivatePtr priv = vm->privateData; + qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); + qemuHotplugDiskSourceDataPtr newbackend = NULL; + qemuHotplugDiskSourceDataPtr oldbackend = NULL; + virStorageSourcePtr oldsrc = disk->src; + char *nodename = NULL; + int rc; + int ret = -1; + + if (!virStorageSourceIsEmpty(disk->src) && + !(oldbackend = qemuHotplugDiskSourceRemovePrepare(disk, priv->qemuCaps))) + goto cleanup; + + disk->src = newsrc; + if (!virStorageSourceIsEmpty(disk->src)) { + if (!(newbackend = qemuHotplugDiskSourceAttachPrepare(disk, + priv->qemuCaps))) + goto cleanup; + + if (qemuDomainDiskGetBackendAlias(disk, priv->qemuCaps, &nodename) < 0) + goto cleanup; + } + + if (diskPriv->tray && disk->tray_status != VIR_DOMAIN_DISK_TRAY_OPEN) { + qemuDomainObjEnterMonitor(driver, vm); + rc = qemuMonitorBlockdevTrayOpen(priv->mon, diskPriv->backendQomName, force); + if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) + goto cleanup; + + if (!force && qemuHotplugWaitForTrayEject(vm, disk) < 0) + goto cleanup; + } + + qemuDomainObjEnterMonitor(driver, vm); + + rc = qemuMonitorBlockdevMediumRemove(priv->mon, diskPriv->backendQomName); + + if (rc == 0 && oldbackend) + qemuHotplugDiskSourceRemove(priv->mon, oldbackend); + + if (newbackend && nodename) { + if (rc == 0) + rc = qemuHotplugDiskSourceAttach(priv->mon, newbackend); + + if (rc == 0) + rc = qemuMonitorBlockdevMediumInsert(priv->mon, + diskPriv->backendQomName, + nodename); + } + + if (rc == 0) + rc = qemuMonitorBlockdevTrayClose(priv->mon, diskPriv->backendQomName); + + if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) + goto cleanup; + + cleanup: + qemuHotplugDiskSourceDataFree(newbackend); + qemuHotplugDiskSourceDataFree(oldbackend); + /* caller handles correct exchange of sources */ + disk->src = oldsrc; + return ret; +} + + /** * qemuDomainChangeEjectableMedia: * @driver: qemu driver structure @@ -640,6 +727,7 @@ qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, virStorageSourcePtr newsrc, bool force) { + qemuDomainObjPrivatePtr priv = vm->privateData; int ret = -1; int rc; @@ -649,7 +737,10 @@ qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, if (qemuHotplugAttachManagedPR(driver, vm, newsrc, QEMU_ASYNC_JOB_NONE) < 0) goto cleanup; - rc = qemuDomainChangeMediaLegacy(driver, vm, disk, newsrc, force); + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) + rc = qemuDomainChangeMediaBlockdev(driver, vm, disk, newsrc, force); + else + rc = qemuDomainChangeMediaLegacy(driver, vm, disk, newsrc, force); virDomainAuditDisk(vm, disk->src, newsrc, "update", rc >= 0); -- 2.16.2

The string is not modified so it does not make sense to have a copy. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 7541beb718..c941e502e5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11085,7 +11085,7 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, virHashTablePtr blockstats = NULL; qemuBlockStatsPtr stats; int nstats; - char *diskAlias = NULL; + const char *entryname = NULL; int ret = -1; if (*path) { @@ -11100,8 +11100,7 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, goto cleanup; } - if (VIR_STRDUP(diskAlias, disk->info.alias) < 0) - goto cleanup; + entryname = disk->info.alias; } qemuDomainObjEnterMonitor(driver, vm); @@ -11117,10 +11116,10 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, if (VIR_ALLOC(*retstats) < 0) goto cleanup; - if (diskAlias) { - if (!(stats = virHashLookup(blockstats, diskAlias))) { + if (entryname) { + if (!(stats = virHashLookup(blockstats, entryname))) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot find statistics for device '%s'"), diskAlias); + _("cannot find statistics for device '%s'"), entryname); goto cleanup; } @@ -11132,7 +11131,6 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, ret = nstats; cleanup: - VIR_FREE(diskAlias); virHashFree(blockstats); return ret; } -- 2.16.2

Rather than totalling every entry from 'query-block' for stats provided by qemuDomainBlocksStatsGather total only stats for known disks. This will allow to return data for nodenames and qdevs in the same hash so that we can use them with -blockdev. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index c941e502e5..af347c732c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11037,13 +11037,9 @@ qemuDomainBlockResize(virDomainPtr dom, static int -qemuDomainBlockStatsGatherTotals(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *opaque) +qemuDomainBlockStatsGatherTotals(qemuBlockStatsPtr data, + qemuBlockStatsPtr total) { - qemuBlockStatsPtr data = payload; - qemuBlockStatsPtr total = opaque; - #define QEMU_BLOCK_STAT_TOTAL(NAME) \ if (data->NAME > 0) \ total->NAME += data->NAME @@ -11084,6 +11080,7 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, virDomainDiskDefPtr disk; virHashTablePtr blockstats = NULL; qemuBlockStatsPtr stats; + size_t i; int nstats; const char *entryname = NULL; int ret = -1; @@ -11125,7 +11122,21 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, **retstats = *stats; } else { - virHashForEach(blockstats, qemuDomainBlockStatsGatherTotals, *retstats); + for (i = 0; i < vm->def->ndisks; i++) { + disk = vm->def->disks[i]; + entryname = disk->info.alias; + + if (!entryname) + continue; + + if (!(stats = virHashLookup(blockstats, entryname))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot find statistics for device '%s'"), entryname); + goto cleanup; + } + + qemuDomainBlockStatsGatherTotals(stats, *retstats); + } } ret = nstats; -- 2.16.2

For use with -blockdev we need to be able to retrieve the stats by 'qdev' for the frontend device stats since 'device' will be NULL. Additionally so that we can report the highest written offset we need to also be able to access them by node-name for backing chain purposes. In cases when 'device' is empty it does not make sense to gather them. Allow arranging the stats simultaneously in all the above dimensions. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor_json.c | 55 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 105f6f78ac..24e3d61699 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2324,6 +2324,28 @@ qemuMonitorJSONBlockStatsCollectData(virJSONValuePtr dev, } +static int +qemuMonitorJSONAddOneBlockStatsInfo(qemuBlockStatsPtr bstats, + const char *name, + virHashTablePtr stats) +{ + qemuBlockStatsPtr copy = NULL; + + if (VIR_ALLOC(copy) < 0) + return -1; + + if (bstats) + *copy = *bstats; + + if (virHashAddEntry(stats, name, copy) < 0) { + VIR_FREE(copy); + return -1; + } + + return 0; +} + + static int qemuMonitorJSONGetOneBlockStatsInfo(virJSONValuePtr dev, const char *dev_name, @@ -2334,18 +2356,38 @@ qemuMonitorJSONGetOneBlockStatsInfo(virJSONValuePtr dev, qemuBlockStatsPtr bstats = NULL; int ret = -1; int nstats = 0; - char *entry_name = qemuDomainStorageAlias(dev_name, depth); + const char *qdevname = NULL; + const char *nodename = NULL; + char *devicename = NULL; virJSONValuePtr backing; - if (!entry_name) + if (dev_name && + !(devicename = qemuDomainStorageAlias(dev_name, depth))) goto cleanup; + qdevname = virJSONValueObjectGetString(dev, "qdev"); + nodename = virJSONValueObjectGetString(dev, "node-name"); + + if (!devicename && !qdevname && !nodename) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("blockstats device entry was not in expected format")); + goto cleanup; + } + if (!(bstats = qemuMonitorJSONBlockStatsCollectData(dev, &nstats))) goto cleanup; - if (virHashAddEntry(hash, entry_name, bstats) < 0) + if (devicename && + qemuMonitorJSONAddOneBlockStatsInfo(bstats, devicename, hash) < 0) + goto cleanup; + + if (qdevname && + qemuMonitorJSONAddOneBlockStatsInfo(bstats, qdevname, hash) < 0) + goto cleanup; + + if (nodename && + qemuMonitorJSONAddOneBlockStatsInfo(bstats, nodename, hash) < 0) goto cleanup; - bstats = NULL; if (backingChain && (backing = virJSONValueObjectGetObject(dev, "backing")) && @@ -2356,7 +2398,7 @@ qemuMonitorJSONGetOneBlockStatsInfo(virJSONValuePtr dev, ret = nstats; cleanup: VIR_FREE(bstats); - VIR_FREE(entry_name); + VIR_FREE(devicename); return ret; } @@ -2418,6 +2460,9 @@ qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitorPtr mon, goto cleanup; } + if (*dev_name == '\0') + dev_name = NULL; + rc = qemuMonitorJSONGetOneBlockStatsInfo(dev, dev_name, 0, hash, backingChain); -- 2.16.2

Disk image size data are not contained in the reply of query-blockstats but need to be gathered from query-block. For use with -blockdev we really need to call 'query-named-block-nodes' and process it to retrieve the correct data. This patch introduces qemuMonitorBlockStatsUpdateCapacityBlockdev which updates the capacity data by nodename rather than device name. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 11 +++++++++++ src/qemu/qemu_monitor.h | 4 ++++ src/qemu/qemu_monitor_json.c | 46 ++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 3 +++ 4 files changed, 64 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index d665f33d81..ed6a53e3a5 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2309,6 +2309,17 @@ qemuMonitorBlockStatsUpdateCapacity(qemuMonitorPtr mon, } +int +qemuMonitorBlockStatsUpdateCapacityBlockdev(qemuMonitorPtr mon, + virHashTablePtr stats) +{ + VIR_DEBUG("stats=%p", stats); + + QEMU_CHECK_MONITOR(mon); + + return qemuMonitorJSONBlockStatsUpdateCapacityBlockdev(mon, stats); +} + int qemuMonitorBlockResize(qemuMonitorPtr mon, const char *device, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 0734588f66..3e4822c6ec 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -595,6 +595,10 @@ int qemuMonitorBlockStatsUpdateCapacity(qemuMonitorPtr mon, bool backingChain) ATTRIBUTE_NONNULL(2); +int qemuMonitorBlockStatsUpdateCapacityBlockdev(qemuMonitorPtr mon, + virHashTablePtr stats) + ATTRIBUTE_NONNULL(2); + int qemuMonitorBlockResize(qemuMonitorPtr mon, const char *device, const char *nodename, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 24e3d61699..51d6ee2917 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2585,6 +2585,52 @@ qemuMonitorJSONBlockStatsUpdateCapacity(qemuMonitorPtr mon, } +static int +qemuMonitorJSONBlockStatsUpdateCapacityBlockdevWorker(size_t pos ATTRIBUTE_UNUSED, + virJSONValuePtr val, + void *opaque) +{ + virHashTablePtr stats = opaque; + virJSONValuePtr image; + const char *nodename; + + if (!(nodename = virJSONValueObjectGetString(val, "node-name")) || + !(image = virJSONValueObjectGetObject(val, "image"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-named-block-nodes entry was not in expected format")); + return -1; + } + + if (qemuMonitorJSONBlockStatsUpdateCapacityData(image, nodename, stats) < 0) + return -1; + + return 1; /* we don't want to steal the value from the JSON array */ +} + + +int +qemuMonitorJSONBlockStatsUpdateCapacityBlockdev(qemuMonitorPtr mon, + virHashTablePtr stats) +{ + virJSONValuePtr nodes; + int ret = -1; + + if (!(nodes = qemuMonitorJSONQueryNamedBlockNodes(mon))) + return -1; + + if (virJSONValueArrayForeachSteal(nodes, + qemuMonitorJSONBlockStatsUpdateCapacityBlockdevWorker, + stats) < 0) + goto cleanup; + + ret = 0; + + cleanup: + virJSONValueFree(nodes); + return ret; +} + + int qemuMonitorJSONBlockResize(qemuMonitorPtr mon, const char *device, const char *nodename, diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 3c5839db38..51214e3797 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -93,6 +93,9 @@ int qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitorPtr mon, int qemuMonitorJSONBlockStatsUpdateCapacity(qemuMonitorPtr mon, virHashTablePtr stats, bool backingChain); +int qemuMonitorJSONBlockStatsUpdateCapacityBlockdev(qemuMonitorPtr mon, + virHashTablePtr stats); + int qemuMonitorJSONBlockResize(qemuMonitorPtr mon, const char *device, const char *nodename, -- 2.16.2

Allow reuse of qemuDomainGetStatsOneBlock to work with nodenames by removing the code that looks up the stats data to the caller. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index af347c732c..ed0c563c85 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20075,7 +20075,8 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, virDomainObjPtr dom, virDomainStatsRecordPtr record, int *maxparams, - virDomainDiskDefPtr disk, + const char *diskdst, + const char *entryname, virStorageSourcePtr src, size_t block_idx, virHashTablePtr stats, @@ -20083,13 +20084,9 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, { qemuBlockStats *entry; int ret = -1; - char *alias = NULL; - if (disk->info.alias) - alias = qemuDomainStorageAlias(disk->info.alias, src->id); + QEMU_ADD_NAME_PARAM(record, maxparams, "block", "name", block_idx, diskdst); - QEMU_ADD_NAME_PARAM(record, maxparams, "block", "name", block_idx, - disk->dst); if (virStorageSourceIsLocalStorage(src) && src->path) QEMU_ADD_NAME_PARAM(record, maxparams, "block", "path", block_idx, src->path); @@ -20108,7 +20105,7 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, /* In case where qemu didn't provide the stats we stop here rather than * trying to refresh the stats from the disk. Inability to provide stats is * usually caused by blocked storage so this would make libvirtd hang */ - if (!stats || !alias || !(entry = virHashLookup(stats, alias))) { + if (!stats || !entryname || !(entry = virHashLookup(stats, entryname))) { ret = 0; goto cleanup; } @@ -20154,7 +20151,6 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, ret = 0; cleanup: - VIR_FREE(alias); return ret; } @@ -20179,6 +20175,7 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver, int count_index = -1; size_t visited = 0; bool visitBacking = !!(privflags & QEMU_DOMAIN_STATS_BACKING); + char *alias = NULL; if (HAVE_JOB(privflags) && virDomainObjIsActive(dom)) { qemuDomainObjEnterMonitor(driver, dom); @@ -20215,10 +20212,18 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver, while (virStorageSourceIsBacking(src) && (src == disk->src || visitBacking)) { + + /* alias may be NULL if the VM is not running */ + if (disk->info.alias && + !(alias = qemuDomainStorageAlias(disk->info.alias, src->id))) + goto cleanup; + if (qemuDomainGetStatsOneBlock(driver, cfg, dom, record, maxparams, - disk, src, visited, + disk->dst, alias, src, visited, stats, nodestats) < 0) goto cleanup; + + VIR_FREE(alias); visited++; src = src->backingStore; } @@ -20228,6 +20233,7 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver, ret = 0; cleanup: + VIR_FREE(alias); virHashFree(stats); virHashFree(nodestats); virJSONValueFree(nodedata); -- 2.16.2

In cases when -blockdev is used we need to use 'query-named-block-nodes' instead of 'query-block'. This means that we can extract the write-threshold variable right away. To keep compatibility with old VMs modify the code which was extracting the value previously so that it updates the stats structure and a single code path then can be used to extract the data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 57 ++++++++++++++++++++++++++------------------ src/qemu/qemu_monitor.h | 3 +++ src/qemu/qemu_monitor_json.c | 16 ++++++++++--- 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ed0c563c85..b0ac5e536b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20043,29 +20043,39 @@ qemuDomainGetStatsOneBlockFallback(virQEMUDriverPtr driver, } -static int -qemuDomainGetStatsOneBlockNode(virDomainStatsRecordPtr record, - int *maxparams, - virStorageSourcePtr src, - size_t block_idx, - virHashTablePtr nodedata) +/** + * qemuDomainGetStatsOneBlockRefreshNamed: + * @src: disk source structure + * @alias: disk alias + * @stats: hash table containing stats for all disks + * @nodedata: reply containin 'query-named-block-nodes' data + * + * Refresh disk block stats data (qemuBlockStatsPtr) which are present only + * in the reply of 'query-named-block-nodes' in cases when the data was gathered + * by using qem-block originally. + */ +static void +qemuDomainGetStatsOneBlockRefreshNamed(virStorageSourcePtr src, + const char *alias, + virHashTablePtr stats, + virHashTablePtr nodedata) { + qemuBlockStatsPtr entry; + virJSONValuePtr data; unsigned long long tmp; - int ret = -1; - if (src->nodestorage && - (data = virHashLookup(nodedata, src->nodestorage))) { - if (virJSONValueObjectGetNumberUlong(data, "write_threshold", &tmp) == 0 && - tmp > 0) - QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx, - "threshold", tmp); - } + if (!nodedata || !src->nodestorage) + return; - ret = 0; + if (!(entry = virHashLookup(stats, alias))) + return; - cleanup: - return ret; + if (!(data = virHashLookup(nodedata, src->nodestorage))) + return; + + if (virJSONValueObjectGetNumberUlong(data, "write_threshold", &tmp) == 0) + entry->write_threshold = tmp; } @@ -20079,8 +20089,7 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, const char *entryname, virStorageSourcePtr src, size_t block_idx, - virHashTablePtr stats, - virHashTablePtr nodedata) + virHashTablePtr stats) { qemuBlockStats *entry; int ret = -1; @@ -20145,9 +20154,9 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, } } - if (qemuDomainGetStatsOneBlockNode(record, maxparams, src, block_idx, - nodedata) < 0) - goto cleanup; + if (entry->write_threshold) + QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx, "threshold", + entry->write_threshold); ret = 0; cleanup: @@ -20218,9 +20227,11 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver, !(alias = qemuDomainStorageAlias(disk->info.alias, src->id))) goto cleanup; + qemuDomainGetStatsOneBlockRefreshNamed(src, alias, stats, nodestats); + if (qemuDomainGetStatsOneBlock(driver, cfg, dom, record, maxparams, disk->dst, alias, src, visited, - stats, nodestats) < 0) + stats) < 0) goto cleanup; VIR_FREE(alias); diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 3e4822c6ec..431848856a 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -583,6 +583,9 @@ struct _qemuBlockStats { * if wr_highest_offset_valid is true */ unsigned long long wr_highest_offset; bool wr_highest_offset_valid; + + /* write_threshold is valid only if it's non-zero, conforming to qemu semantics */ + unsigned long long write_threshold; }; int qemuMonitorGetAllBlockStatsInfo(qemuMonitorPtr mon, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 51d6ee2917..75f40716ea 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2484,7 +2484,8 @@ qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitorPtr mon, static int qemuMonitorJSONBlockStatsUpdateCapacityData(virJSONValuePtr image, const char *name, - virHashTablePtr stats) + virHashTablePtr stats, + qemuBlockStatsPtr *entry) { qemuBlockStatsPtr bstats; @@ -2498,6 +2499,9 @@ qemuMonitorJSONBlockStatsUpdateCapacityData(virJSONValuePtr image, } } + if (entry) + *entry = bstats; + /* failures can be ignored after this point */ if (virJSONValueObjectGetNumberUlong(image, "virtual-size", &bstats->capacity) < 0) @@ -2523,7 +2527,8 @@ qemuMonitorJSONBlockStatsUpdateCapacityOne(virJSONValuePtr image, char *entry_name = qemuDomainStorageAlias(dev_name, depth); virJSONValuePtr backing; - if (qemuMonitorJSONBlockStatsUpdateCapacityData(image, entry_name, stats) < 0) + if (qemuMonitorJSONBlockStatsUpdateCapacityData(image, entry_name, + stats, NULL) < 0) goto cleanup; if (backingChain && @@ -2593,6 +2598,7 @@ qemuMonitorJSONBlockStatsUpdateCapacityBlockdevWorker(size_t pos ATTRIBUTE_UNUSE virHashTablePtr stats = opaque; virJSONValuePtr image; const char *nodename; + qemuBlockStatsPtr entry; if (!(nodename = virJSONValueObjectGetString(val, "node-name")) || !(image = virJSONValueObjectGetObject(val, "image"))) { @@ -2601,9 +2607,13 @@ qemuMonitorJSONBlockStatsUpdateCapacityBlockdevWorker(size_t pos ATTRIBUTE_UNUSE return -1; } - if (qemuMonitorJSONBlockStatsUpdateCapacityData(image, nodename, stats) < 0) + if (qemuMonitorJSONBlockStatsUpdateCapacityData(image, nodename, stats, &entry) < 0) return -1; + if (entry) + ignore_value(virJSONValueObjectGetNumberUlong(val, "write_threshold", + &entry->write_threshold)); + return 1; /* we don't want to steal the value from the JSON array */ } -- 2.16.2

Split out the code which converts the stats gathered in qemuDomainGetStatsBlock into typed parameters so that it will look less ugly when extending it. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 73 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b0ac5e536b..ddd991546a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20164,6 +20164,51 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, } +static int +qemuDomainGetStatsBlockExportDisk(virDomainDiskDefPtr disk, + virHashTablePtr stats, + virHashTablePtr nodestats, + virDomainStatsRecordPtr records, + int *nrecords, + size_t *recordnr, + bool visitBacking, + virQEMUDriverPtr driver, + virQEMUDriverConfigPtr cfg, + virDomainObjPtr dom) + +{ + char *alias = NULL; + virStorageSourcePtr src = disk->src; + int ret = -1; + + while (virStorageSourceIsBacking(src) && + (src == disk->src || visitBacking)) { + + /* alias may be NULL if the VM is not running */ + if (disk->info.alias && + !(alias = qemuDomainStorageAlias(disk->info.alias, src->id))) + goto cleanup; + + qemuDomainGetStatsOneBlockRefreshNamed(src, alias, stats, nodestats); + + if (qemuDomainGetStatsOneBlock(driver, cfg, dom, records, nrecords, + disk->dst, alias, src, *recordnr, + stats) < 0) + goto cleanup; + + VIR_FREE(alias); + (*recordnr)++; + src = src->backingStore; + } + + ret = 0; + + cleanup: + VIR_FREE(alias); + return ret; +} + + static int qemuDomainGetStatsBlock(virQEMUDriverPtr driver, virDomainObjPtr dom, @@ -20184,7 +20229,6 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver, int count_index = -1; size_t visited = 0; bool visitBacking = !!(privflags & QEMU_DOMAIN_STATS_BACKING); - char *alias = NULL; if (HAVE_JOB(privflags) && virDomainObjIsActive(dom)) { qemuDomainObjEnterMonitor(driver, dom); @@ -20216,35 +20260,16 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver, QEMU_ADD_COUNT_PARAM(record, maxparams, "block", 0); for (i = 0; i < dom->def->ndisks; i++) { - virDomainDiskDefPtr disk = dom->def->disks[i]; - virStorageSourcePtr src = disk->src; - - while (virStorageSourceIsBacking(src) && - (src == disk->src || visitBacking)) { - - /* alias may be NULL if the VM is not running */ - if (disk->info.alias && - !(alias = qemuDomainStorageAlias(disk->info.alias, src->id))) - goto cleanup; - - qemuDomainGetStatsOneBlockRefreshNamed(src, alias, stats, nodestats); - - if (qemuDomainGetStatsOneBlock(driver, cfg, dom, record, maxparams, - disk->dst, alias, src, visited, - stats) < 0) - goto cleanup; - - VIR_FREE(alias); - visited++; - src = src->backingStore; - } + if (qemuDomainGetStatsBlockExportDisk(dom->def->disks[i], stats, nodestats, + record, maxparams, &visited, + visitBacking, driver, cfg, dom) < 0) + goto cleanup; } record->params[count_index].value.ui = visited; ret = 0; cleanup: - VIR_FREE(alias); virHashFree(stats); virHashFree(nodestats); virJSONValueFree(nodedata); -- 2.16.2

Split out the header so that the loop can be refactored later. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ddd991546a..4e9be6ed3d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20085,7 +20085,6 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, virDomainObjPtr dom, virDomainStatsRecordPtr record, int *maxparams, - const char *diskdst, const char *entryname, virStorageSourcePtr src, size_t block_idx, @@ -20094,14 +20093,6 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, qemuBlockStats *entry; int ret = -1; - QEMU_ADD_NAME_PARAM(record, maxparams, "block", "name", block_idx, diskdst); - - if (virStorageSourceIsLocalStorage(src) && src->path) - QEMU_ADD_NAME_PARAM(record, maxparams, "block", "path", - block_idx, src->path); - if (src->id) - QEMU_ADD_BLOCK_PARAM_UI(record, maxparams, block_idx, "backingIndex", - src->id); /* the VM is offline so we have to go and load the stast from the disk by * ourselves */ @@ -20164,6 +20155,29 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, } +static int +qemuDomainGetStatsBlockExportHeader(virDomainDiskDefPtr disk, + virStorageSourcePtr src, + size_t recordnr, + virDomainStatsRecordPtr records, + int *nrecords) +{ + int ret = -1; + + QEMU_ADD_NAME_PARAM(records, nrecords, "block", "name", recordnr, disk->dst); + + if (virStorageSourceIsLocalStorage(src) && src->path) + QEMU_ADD_NAME_PARAM(records, nrecords, "block", "path", recordnr, src->path); + if (src->id) + QEMU_ADD_BLOCK_PARAM_UI(records, nrecords, recordnr, "backingIndex", + src->id); + + ret = 0; + cleanup: + return ret; +} + + static int qemuDomainGetStatsBlockExportDisk(virDomainDiskDefPtr disk, virHashTablePtr stats, @@ -20191,8 +20205,12 @@ qemuDomainGetStatsBlockExportDisk(virDomainDiskDefPtr disk, qemuDomainGetStatsOneBlockRefreshNamed(src, alias, stats, nodestats); + if (qemuDomainGetStatsBlockExportHeader(disk, src, *recordnr, + records, nrecords) < 0) + goto cleanup; + if (qemuDomainGetStatsOneBlock(driver, cfg, dom, records, nrecords, - disk->dst, alias, src, *recordnr, + alias, src, *recordnr, stats) < 0) goto cleanup; -- 2.16.2

While we report the read and written byte stats for every single layer of the backing chain, qemu in fact reports them only for the frontend. Split out the relevant stats into a separate function so that we can later fix this bug and stop reporting it for backing chain entries where they don't make sense. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 54 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4e9be6ed3d..d8a202fa47 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20110,23 +20110,6 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, goto cleanup; } - QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx, - "rd.reqs", entry->rd_req); - QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx, - "rd.bytes", entry->rd_bytes); - QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx, - "rd.times", entry->rd_total_times); - QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx, - "wr.reqs", entry->wr_req); - QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx, - "wr.bytes", entry->wr_bytes); - QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx, - "wr.times", entry->wr_total_times); - QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx, - "fl.reqs", entry->flush_req); - QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx, - "fl.times", entry->flush_total_times); - QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx, "allocation", entry->wr_highest_offset); @@ -20155,6 +20138,39 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, } +static int +qemuDomainGetStatsBlockExportFrontend(const char *frontendname, + virHashTablePtr stats, + size_t recordnr, + virDomainStatsRecordPtr records, + int *nrecords) +{ + qemuBlockStats *entry; + int ret = -1; + + /* In case where qemu didn't provide the stats we stop here rather than + * trying to refresh the stats from the disk. Inability to provide stats is + * usually caused by blocked storage so this would make libvirtd hang */ + if (!stats || !frontendname || !(entry = virHashLookup(stats, frontendname))) { + ret = 0; + goto cleanup; + } + + QEMU_ADD_BLOCK_PARAM_LL(records, nrecords, recordnr, "rd.reqs", entry->rd_req); + QEMU_ADD_BLOCK_PARAM_LL(records, nrecords, recordnr, "rd.bytes", entry->rd_bytes); + QEMU_ADD_BLOCK_PARAM_LL(records, nrecords, recordnr, "rd.times", entry->rd_total_times); + QEMU_ADD_BLOCK_PARAM_LL(records, nrecords, recordnr, "wr.reqs", entry->wr_req); + QEMU_ADD_BLOCK_PARAM_LL(records, nrecords, recordnr, "wr.bytes", entry->wr_bytes); + QEMU_ADD_BLOCK_PARAM_LL(records, nrecords, recordnr, "wr.times", entry->wr_total_times); + QEMU_ADD_BLOCK_PARAM_LL(records, nrecords, recordnr, "fl.reqs", entry->flush_req); + QEMU_ADD_BLOCK_PARAM_LL(records, nrecords, recordnr, "fl.times", entry->flush_total_times); + + ret = 0; + cleanup: + return ret; +} + + static int qemuDomainGetStatsBlockExportHeader(virDomainDiskDefPtr disk, virStorageSourcePtr src, @@ -20209,6 +20225,10 @@ qemuDomainGetStatsBlockExportDisk(virDomainDiskDefPtr disk, records, nrecords) < 0) goto cleanup; + if (qemuDomainGetStatsBlockExportFrontend(alias, stats, *recordnr, + records, nrecords) < 0) + goto cleanup; + if (qemuDomainGetStatsOneBlock(driver, cfg, dom, records, nrecords, alias, src, *recordnr, stats) < 0) -- 2.16.2

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d8a202fa47..d0a680629e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20208,20 +20208,18 @@ qemuDomainGetStatsBlockExportDisk(virDomainDiskDefPtr disk, { char *alias = NULL; - virStorageSourcePtr src = disk->src; + virStorageSourcePtr n; int ret = -1; - while (virStorageSourceIsBacking(src) && - (src == disk->src || visitBacking)) { - + for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) { /* alias may be NULL if the VM is not running */ if (disk->info.alias && - !(alias = qemuDomainStorageAlias(disk->info.alias, src->id))) + !(alias = qemuDomainStorageAlias(disk->info.alias, n->id))) goto cleanup; - qemuDomainGetStatsOneBlockRefreshNamed(src, alias, stats, nodestats); + qemuDomainGetStatsOneBlockRefreshNamed(n, alias, stats, nodestats); - if (qemuDomainGetStatsBlockExportHeader(disk, src, *recordnr, + if (qemuDomainGetStatsBlockExportHeader(disk, n, *recordnr, records, nrecords) < 0) goto cleanup; @@ -20230,13 +20228,15 @@ qemuDomainGetStatsBlockExportDisk(virDomainDiskDefPtr disk, goto cleanup; if (qemuDomainGetStatsOneBlock(driver, cfg, dom, records, nrecords, - alias, src, *recordnr, + alias, n, *recordnr, stats) < 0) goto cleanup; VIR_FREE(alias); (*recordnr)++; - src = src->backingStore; + + if (!visitBacking) + break; } ret = 0; -- 2.16.2

When reporting stats for the backing chain some of them make sense only for the topmost entry as they are actually tied to the frontend device. We unfortunately can't change that fact, but we can stop reporting all zero stats for the backing chain members where they don't make any sense. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d0a680629e..ee401eb702 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20223,9 +20223,12 @@ qemuDomainGetStatsBlockExportDisk(virDomainDiskDefPtr disk, records, nrecords) < 0) goto cleanup; - if (qemuDomainGetStatsBlockExportFrontend(alias, stats, *recordnr, - records, nrecords) < 0) - goto cleanup; + /* The following stats make sense only for the frontend device */ + if (n == disk->src) { + if (qemuDomainGetStatsBlockExportFrontend(alias, stats, *recordnr, + records, nrecords) < 0) + goto cleanup; + } if (qemuDomainGetStatsOneBlock(driver, cfg, dom, records, nrecords, alias, n, *recordnr, -- 2.16.2

Data relevant for the storage of a backing chain member will need to be reported separately when switching to blockdev. Prepare a function that extracts the appropriate data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ee401eb702..63c1a85d5a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20128,8 +20128,29 @@ qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver, } } + ret = 0; + cleanup: + return ret; +} + + +static int +qemuDomainGetStatsBlockExportBackendStorage(const char *entryname, + virHashTablePtr stats, + size_t recordnr, + virDomainStatsRecordPtr records, + int *nrecords) +{ + qemuBlockStats *entry; + int ret = -1; + + if (!stats || !entryname || !(entry = virHashLookup(stats, entryname))) { + ret = 0; + goto cleanup; + } + if (entry->write_threshold) - QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx, "threshold", + QEMU_ADD_BLOCK_PARAM_ULL(records, nrecords, recordnr, "threshold", entry->write_threshold); ret = 0; @@ -20235,6 +20256,11 @@ qemuDomainGetStatsBlockExportDisk(virDomainDiskDefPtr disk, stats) < 0) goto cleanup; + if (qemuDomainGetStatsBlockExportBackendStorage(alias, + stats, *recordnr, + records, nrecords) < 0) + goto cleanup; + VIR_FREE(alias); (*recordnr)++; -- 2.16.2

With -blockdev qemu will not report any useful "device" for the data returned by 'query-block'. We need to start using the 'qdev' field to do so. This patch adds data for the 'qdev' field into the returned data structure. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor_json.c | 69 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 75f40716ea..0579554016 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2201,6 +2201,38 @@ qemuMonitorJSONGetBlockDevDevice(virJSONValuePtr dev) } +static int +qemuMonitorJSONBlockInfoAdd(virHashTablePtr table, + struct qemuDomainDiskInfo *info, + const char *entryname) +{ + struct qemuDomainDiskInfo *tmp = NULL; + int ret = -1; + + if (VIR_ALLOC(tmp) < 0) + goto cleanup; + + *tmp = *info; + tmp->nodename = NULL; + + if (info->nodename && + VIR_STRDUP(tmp->nodename, info->nodename) < 0) + goto cleanup; + + if (virHashAddEntry(table, entryname, tmp) < 0) + goto cleanup; + + tmp = NULL; + ret = 0; + + cleanup: + if (tmp) + VIR_FREE(tmp->nodename); + VIR_FREE(tmp); + return ret; +} + + int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, virHashTablePtr table) { @@ -2215,10 +2247,10 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, for (i = 0; i < virJSONValueArraySize(devices); i++) { virJSONValuePtr dev; virJSONValuePtr image; - struct qemuDomainDiskInfo *info; + struct qemuDomainDiskInfo info = { false }; const char *thisdev; const char *status; - const char *nodename; + const char *qdev; if (!(dev = qemuMonitorJSONGetBlockDev(devices, i))) goto cleanup; @@ -2227,16 +2259,18 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, goto cleanup; thisdev = qemuAliasDiskDriveSkipPrefix(thisdev); + qdev = virJSONValueObjectGetString(dev, "qdev"); - if (VIR_ALLOC(info) < 0) - goto cleanup; + if (*thisdev == '\0') + thisdev = NULL; - if (virHashAddEntry(table, thisdev, info) < 0) { - VIR_FREE(info); + if (!qdev && !thisdev) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-block device entry was not in expected format")); goto cleanup; } - if (virJSONValueObjectGetBoolean(dev, "removable", &info->removable) < 0) { + if (virJSONValueObjectGetBoolean(dev, "removable", &info.removable) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("cannot read %s value"), "removable"); @@ -2244,23 +2278,30 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, } /* 'tray_open' is present only if the device has a tray */ - if (virJSONValueObjectGetBoolean(dev, "tray_open", &info->tray_open) == 0) - info->tray = true; + if (virJSONValueObjectGetBoolean(dev, "tray_open", &info.tray_open) == 0) + info.tray = true; /* presence of 'inserted' notifies that a medium is in the device */ if ((image = virJSONValueObjectGetObject(dev, "inserted"))) { - if ((nodename = virJSONValueObjectGetString(image, "node-name"))) - ignore_value(VIR_STRDUP(info->nodename, nodename)); + info.nodename = (char *) virJSONValueObjectGetString(image, "node-name"); } else { - info->empty = true; + info.empty = true; } /* Missing io-status indicates no error */ if ((status = virJSONValueObjectGetString(dev, "io-status"))) { - info->io_status = qemuMonitorBlockIOStatusToError(status); - if (info->io_status < 0) + info.io_status = qemuMonitorBlockIOStatusToError(status); + if (info.io_status < 0) goto cleanup; } + + if (thisdev && + qemuMonitorJSONBlockInfoAdd(table, &info, thisdev) < 0) + goto cleanup; + + if (qdev && + qemuMonitorJSONBlockInfoAdd(table, &info, qdev) < 0) + goto cleanup; } ret = 0; -- 2.16.2

Switch to using the QOM/qdev handles in all calls to qemuMonitorGetBlockInfo when using -blockdev. The callers also need to make sure to use the correct handle afterwards to extract the data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 9 ++++++++- src/qemu/qemu_process.c | 7 ++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 63c1a85d5a..6ee826029b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18738,6 +18738,7 @@ qemuDomainGetDiskErrors(virDomainPtr dom, virDomainObjPtr vm = NULL; qemuDomainObjPrivatePtr priv; virHashTablePtr table = NULL; + bool blockdev = false; int ret = -1; size_t i; int n = 0; @@ -18748,6 +18749,7 @@ qemuDomainGetDiskErrors(virDomainPtr dom, goto cleanup; priv = vm->privateData; + blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV); if (virDomainGetDiskErrorsEnsureACL(dom->conn, vm->def) < 0) goto cleanup; @@ -18773,8 +18775,13 @@ qemuDomainGetDiskErrors(virDomainPtr dom, for (i = n = 0; i < vm->def->ndisks; i++) { struct qemuDomainDiskInfo *info; virDomainDiskDefPtr disk = vm->def->disks[i]; + qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); + const char *entryname = disk->info.alias; + + if (blockdev) + entryname = diskPriv->backendQomName; - if ((info = virHashLookup(table, disk->info.alias)) && + if ((info = virHashLookup(table, entryname)) && info->io_status != VIR_DOMAIN_DISK_ERROR_NONE) { if (n == nerrors) break; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 2183127133..fceaf95fab 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7561,6 +7561,7 @@ qemuProcessRefreshDisks(virQEMUDriverPtr driver, qemuDomainAsyncJob asyncJob) { qemuDomainObjPrivatePtr priv = vm->privateData; + bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV); virHashTablePtr table = NULL; int ret = -1; size_t i; @@ -7578,8 +7579,12 @@ qemuProcessRefreshDisks(virQEMUDriverPtr driver, virDomainDiskDefPtr disk = vm->def->disks[i]; qemuDomainDiskPrivatePtr diskpriv = QEMU_DOMAIN_DISK_PRIVATE(disk); struct qemuDomainDiskInfo *info; + const char *entryname = disk->info.alias; + + if (blockdev) + entryname = diskpriv->backendQomName; - if (!(info = virHashLookup(table, disk->info.alias))) + if (!(info = virHashLookup(table, entryname))) continue; if (info->removable) { -- 2.16.2

Use the 'qdev' instead of the disk alias to lookup the stats and transfer the capacity from the appropriate node name so that the function works with -blockdev. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 6ee826029b..7309ce92e4 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11077,11 +11077,13 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, qemuBlockStatsPtr *retstats) { qemuDomainObjPrivatePtr priv = vm->privateData; + bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV); virDomainDiskDefPtr disk; virHashTablePtr blockstats = NULL; qemuBlockStatsPtr stats; size_t i; int nstats; + int rc = 0; const char *entryname = NULL; int ret = -1; @@ -11091,23 +11093,30 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, goto cleanup; } - if (!disk->info.alias) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("missing disk device alias name for %s"), disk->dst); - goto cleanup; - } + if (blockdev) { + entryname = QEMU_DOMAIN_DISK_PRIVATE(disk)->backendQomName; + } else { + if (!disk->info.alias) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("missing disk device alias name for %s"), disk->dst); + goto cleanup; + } - entryname = disk->info.alias; + entryname = disk->info.alias; + } } qemuDomainObjEnterMonitor(driver, vm); nstats = qemuMonitorGetAllBlockStatsInfo(priv->mon, &blockstats, false); - if (capacity && nstats >= 0 && - qemuMonitorBlockStatsUpdateCapacity(priv->mon, blockstats, false) < 0) - nstats = -1; + if (capacity && nstats >= 0) { + if (blockdev) + rc = qemuMonitorBlockStatsUpdateCapacityBlockdev(priv->mon, blockstats); + else + rc = qemuMonitorBlockStatsUpdateCapacity(priv->mon, blockstats, false); + } - if (qemuDomainObjExitMonitor(driver, vm) < 0 || nstats < 0) + if (qemuDomainObjExitMonitor(driver, vm) < 0 || nstats < 0 || rc < 0) goto cleanup; if (VIR_ALLOC(*retstats) < 0) @@ -11120,12 +11129,28 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, goto cleanup; } + if (blockdev) { + /* capacity are reported only per node-name so we need to transfer them */ + qemuBlockStatsPtr capstats; + + if ((capstats = virHashLookup(blockstats, disk->src->nodeformat))) { + (*retstats)->capacity = capstats->capacity; + (*retstats)->physical = capstats->physical; + (*retstats)->wr_highest_offset = capstats->wr_highest_offset; + (*retstats)->wr_highest_offset_valid = capstats->wr_highest_offset_valid; + (*retstats)->write_threshold = capstats->write_threshold; + } + } + **retstats = *stats; } else { for (i = 0; i < vm->def->ndisks; i++) { disk = vm->def->disks[i]; entryname = disk->info.alias; + if (blockdev) + entryname = QEMU_DOMAIN_DISK_PRIVATE(disk)->backendQomName; + if (!entryname) continue; -- 2.16.2

Add code paths which call into the new functions to gather the data on a per-node-name basis and tweak the aliases used for extracting the data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 54 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 7309ce92e4..2a5a7d70ed 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20257,20 +20257,34 @@ qemuDomainGetStatsBlockExportDisk(virDomainDiskDefPtr disk, bool visitBacking, virQEMUDriverPtr driver, virQEMUDriverConfigPtr cfg, - virDomainObjPtr dom) + virDomainObjPtr dom, + bool blockdev) { char *alias = NULL; virStorageSourcePtr n; + const char *frontendalias; + const char *backendalias; + const char *backendstoragealias; int ret = -1; for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) { - /* alias may be NULL if the VM is not running */ - if (disk->info.alias && - !(alias = qemuDomainStorageAlias(disk->info.alias, n->id))) - goto cleanup; + if (blockdev) { + frontendalias = QEMU_DOMAIN_DISK_PRIVATE(disk)->backendQomName; + backendalias = n->nodeformat; + backendstoragealias = n->nodestorage; + } else { + /* alias may be NULL if the VM is not running */ + if (disk->info.alias && + !(alias = qemuDomainStorageAlias(disk->info.alias, n->id))) + goto cleanup; + + qemuDomainGetStatsOneBlockRefreshNamed(n, alias, stats, nodestats); - qemuDomainGetStatsOneBlockRefreshNamed(n, alias, stats, nodestats); + frontendalias = alias; + backendalias = alias; + backendstoragealias = alias; + } if (qemuDomainGetStatsBlockExportHeader(disk, n, *recordnr, records, nrecords) < 0) @@ -20278,17 +20292,17 @@ qemuDomainGetStatsBlockExportDisk(virDomainDiskDefPtr disk, /* The following stats make sense only for the frontend device */ if (n == disk->src) { - if (qemuDomainGetStatsBlockExportFrontend(alias, stats, *recordnr, + if (qemuDomainGetStatsBlockExportFrontend(frontendalias, stats, *recordnr, records, nrecords) < 0) goto cleanup; } if (qemuDomainGetStatsOneBlock(driver, cfg, dom, records, nrecords, - alias, n, *recordnr, + backendalias, n, *recordnr, stats) < 0) goto cleanup; - if (qemuDomainGetStatsBlockExportBackendStorage(alias, + if (qemuDomainGetStatsBlockExportBackendStorage(backendstoragealias, stats, *recordnr, records, nrecords) < 0) goto cleanup; @@ -20323,19 +20337,26 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver, virJSONValuePtr nodedata = NULL; qemuDomainObjPrivatePtr priv = dom->privateData; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV); bool fetchnodedata = virQEMUCapsGet(priv->qemuCaps, - QEMU_CAPS_QUERY_NAMED_BLOCK_NODES); + QEMU_CAPS_QUERY_NAMED_BLOCK_NODES) && !blockdev; int count_index = -1; size_t visited = 0; bool visitBacking = !!(privflags & QEMU_DOMAIN_STATS_BACKING); if (HAVE_JOB(privflags) && virDomainObjIsActive(dom)) { qemuDomainObjEnterMonitor(driver, dom); - rc = qemuMonitorGetAllBlockStatsInfo(priv->mon, &stats, - visitBacking); - if (rc >= 0) - ignore_value(qemuMonitorBlockStatsUpdateCapacity(priv->mon, stats, - visitBacking)); + + rc = qemuMonitorGetAllBlockStatsInfo(priv->mon, &stats, visitBacking); + + if (blockdev) { + if (rc >= 0) + rc = qemuMonitorBlockStatsUpdateCapacityBlockdev(priv->mon, stats); + } else { + if (rc >= 0) + ignore_value(qemuMonitorBlockStatsUpdateCapacity(priv->mon, stats, + visitBacking)); + } if (fetchnodedata) nodedata = qemuMonitorQueryNamedBlockNodes(priv->mon); @@ -20361,7 +20382,8 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver, for (i = 0; i < dom->def->ndisks; i++) { if (qemuDomainGetStatsBlockExportDisk(dom->def->disks[i], stats, nodestats, record, maxparams, &visited, - visitBacking, driver, cfg, dom) < 0) + visitBacking, driver, cfg, dom, + blockdev) < 0) goto cleanup; } -- 2.16.2

'query-blockstats' did not report the 'qdev' field prior to fixing it so that it works with our setup. Use that as a witness to enable -blockdev Note that the blockjobs were NOT adapted yet so any blockjob will desync the state of qemu. This patch needs to wait until blockjobs are fixed. --- src/qemu/qemu_capabilities.c | 1 + tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml | 1 + tests/qemuxml2argvdata/disk-aio.x86_64-latest.args | 19 ++- .../disk-backing-chains-noindex.x86_64-latest.args | 145 ++++++++++++++++++--- .../qemuxml2argvdata/disk-cache.x86_64-latest.args | 50 ++++--- .../disk-cdrom-network.x86_64-latest.args | 32 +++-- .../disk-cdrom-tray.x86_64-latest.args | 24 ++-- .../qemuxml2argvdata/disk-cdrom.x86_64-latest.args | 17 ++- .../disk-copy_on_read.x86_64-latest.args | 19 ++- .../disk-detect-zeroes.x86_64-latest.args | 17 ++- .../disk-error-policy.x86_64-latest.args | 30 +++-- .../disk-network-gluster.x86_64-latest.args | 32 +++-- .../disk-network-iscsi.x86_64-latest.args | 58 +++++---- .../disk-network-nbd.x86_64-latest.args | 41 ++++-- .../disk-network-rbd.x86_64-latest.args | 67 ++++++---- .../disk-network-sheepdog.x86_64-latest.args | 16 ++- .../disk-network-source-auth.x86_64-latest.args | 30 +++-- .../disk-network-tlsx509.x86_64-latest.args | 61 +++++---- .../disk-readonly-disk.x86_64-latest.args | 14 +- .../disk-shared.x86_64-latest.args | 18 ++- ...isk-virtio-scsi-reservations.x86_64-latest.args | 20 ++- 21 files changed, 494 insertions(+), 218 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 6b4c14ac50..58512685bf 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1309,6 +1309,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = { { "blockdev-add/arg-type/+qcow2/encrypt/+luks/key-secret", QEMU_CAPS_QCOW2_LUKS }, { "nbd-server-start/arg-type/tls-creds", QEMU_CAPS_NBD_TLS }, { "screendump/arg-type/device", QEMU_CAPS_SCREENDUMP_DEVICE }, + { "query-blockstats/ret-type/qdev", QEMU_CAPS_BLOCKDEV }, }; typedef struct _virQEMUCapsObjectTypeProps virQEMUCapsObjectTypeProps; diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml index a2c6085de7..8e0f2fc3b5 100644 --- a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml @@ -216,6 +216,7 @@ <flag name='usb-storage.werror'/> <flag name='egl-headless'/> <flag name='vfio-pci.display'/> + <flag name='blockdev'/> <version>2012093</version> <kvmVersion>0</kvmVersion> <microcodeVersion>427343</microcodeVersion> diff --git a/tests/qemuxml2argvdata/disk-aio.x86_64-latest.args b/tests/qemuxml2argvdata/disk-aio.x86_64-latest.args index 3894ed2502..ae82ba52bd 100644 --- a/tests/qemuxml2argvdata/disk-aio.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-aio.x86_64-latest.args @@ -24,13 +24,20 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-ide0-0-0,\ -cache=none,aio=native \ --device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"aio":"native","node-name":"libvirt-2-storage","cache":{"direct":true,\ +"no-flush":false},"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,\ +"cache":{"direct":true,"no-flush":false},"driver":"qcow2",\ +"file":"libvirt-2-storage"}' \ +-device ide-hd,bus=ide.0,unit=0,drive=libvirt-2-format,id=ide0-0-0,bootindex=1,\ write-cache=on \ --drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,id=drive-ide0-1-0,\ -readonly=on,aio=threads \ --device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest2",\ +"aio":"threads","node-name":"libvirt-1-storage","read-only":true,\ +"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":true,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device ide-cd,bus=ide.1,unit=0,drive=libvirt-1-format,id=ide0-1-0 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args b/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args index afe078adcc..11d805f3d8 100644 --- a/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args @@ -24,33 +24,138 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive 'file=gluster+unix:///Volume2/Image?socket=/path/to/sock,file.debug=4,\ -format=qcow2,if=none,id=drive-virtio-disk0' \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +-blockdev '{"driver":"file","filename":"/tmp/missing-backing-store.qcow",\ +"node-name":"libvirt-25-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-25-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-25-storage"}' \ +-blockdev '{"driver":"gluster","volume":"Volume2","path":"Image",\ +"server":[{"type":"unix","path":"/path/to/sock"}],"debug":4,\ +"node-name":"libvirt-24-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-24-format","read-only":false,"driver":"qcow2",\ +"file":"libvirt-24-storage","backing":"libvirt-25-format"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=libvirt-24-format,\ id=virtio-disk0,bootindex=1 \ --drive file=nbd:unix:/var/run/nbdsock:exportname=bar,format=qcow2,if=none,\ -id=drive-virtio-disk1 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk1,\ +-blockdev '{"driver":"file","filename":"/tmp/Fedora-17-x86_64-Live-KDE.iso",\ +"node-name":"libvirt-23-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-23-format","read-only":true,"driver":"raw",\ +"file":"libvirt-23-storage"}' \ +-blockdev '{"driver":"file","filename":"/tmp/image5.qcow",\ +"node-name":"libvirt-22-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-22-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-22-storage","backing":"libvirt-23-format"}' \ +-blockdev '{"driver":"file","filename":"/tmp/image4.qcow",\ +"node-name":"libvirt-21-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-21-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-21-storage","backing":"libvirt-22-format"}' \ +-blockdev '{"driver":"file","filename":"/tmp/image3.qcow",\ +"node-name":"libvirt-20-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-20-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-20-storage","backing":"libvirt-21-format"}' \ +-blockdev '{"driver":"file","filename":"/tmp/image2",\ +"node-name":"libvirt-19-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-19-format","read-only":true,"driver":"vmdk",\ +"file":"libvirt-19-storage","backing":"libvirt-20-format"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"node-name":"libvirt-18-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-18-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-18-storage","backing":"libvirt-19-format"}' \ +-blockdev '{"driver":"nbd","server":{"type":"unix","path":"/var/run/nbdsock"},\ +"export":"bar","node-name":"libvirt-17-storage","read-only":false,\ +"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-17-format","read-only":false,"driver":"qcow2",\ +"file":"libvirt-17-storage","backing":"libvirt-18-format"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=libvirt-17-format,\ id=virtio-disk1 \ --drive file=gluster://example.org:6000/Volume1/Image,file.debug=4,format=raw,\ -if=none,id=drive-virtio-disk2 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk2,\ +-blockdev '{"driver":"gluster","volume":"Volume1","path":"Image",\ +"server":[{"type":"inet","host":"example.org","port":"6000"}],"debug":4,\ +"node-name":"libvirt-16-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-16-format","read-only":false,"driver":"raw",\ +"file":"libvirt-16-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=libvirt-16-format,\ id=virtio-disk2 \ --object secret,id=virtio-disk3-secret0,\ +-blockdev '{"driver":"file","filename":"/tmp/image.qcow",\ +"node-name":"libvirt-15-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-15-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-15-storage","backing":null}' \ +-object secret,id=libvirt-14-storage-secret0,\ data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ --drive 'file=rbd:pool/image:id=myname:auth_supported=cephx\;none:\ -mon_host=mon1.example.org\:6321\;mon2.example.org\:6322\;mon3.example.org\:\ -6322,file.password-secret=virtio-disk3-secret0,format=qcow2,if=none,\ -id=drive-virtio-disk3' \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk3,\ +-blockdev '{"driver":"rbd","pool":"pool","image":"image",\ +"server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\ +"port":"6322"},{"host":"mon3.example.org","port":"6322"}],"user":"myname",\ +"auth-client-required":["cephx","none"],\ +"key-secret":"libvirt-14-storage-secret0","node-name":"libvirt-14-storage",\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-14-format","read-only":false,"driver":"qcow2",\ +"file":"libvirt-14-storage","backing":"libvirt-15-format"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=libvirt-14-format,\ id=virtio-disk3 \ --drive file=/dev/HostVG/QEMUGuest11,format=qcow2,if=none,id=drive-virtio-disk4 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk4,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest11",\ +"node-name":"libvirt-13-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-13-format","read-only":false,"driver":"qcow2",\ +"file":"libvirt-13-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=libvirt-13-format,\ id=virtio-disk4 \ --drive file=/var/lib/libvirt/images/rhel7.1484071880,format=qcow2,if=none,\ -id=drive-virtio-disk5 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk5,\ +-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/rhel7.qcow2",\ +"node-name":"libvirt-12-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-12-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-12-storage","backing":null}' \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/images/rhel7.1483536402",\ +"node-name":"libvirt-11-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-11-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-11-storage","backing":"libvirt-12-format"}' \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/images/rhel7.1483545313",\ +"node-name":"libvirt-10-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-10-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-10-storage","backing":"libvirt-11-format"}' \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/images/rhel7.1483545901",\ +"node-name":"libvirt-9-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-9-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-9-storage","backing":"libvirt-10-format"}' \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/images/rhel7.1483546244",\ +"node-name":"libvirt-8-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-8-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-8-storage","backing":"libvirt-9-format"}' \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/images/rhel7.1483605920",\ +"node-name":"libvirt-7-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-7-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-7-storage","backing":"libvirt-8-format"}' \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/images/rhel7.1483605924",\ +"node-name":"libvirt-6-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-6-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-6-storage","backing":"libvirt-7-format"}' \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/images/rhel7.1483615252",\ +"node-name":"libvirt-5-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-5-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-5-storage","backing":"libvirt-6-format"}' \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/images/rhel7.1484071872",\ +"node-name":"libvirt-4-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-4-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-4-storage","backing":"libvirt-5-format"}' \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/images/rhel7.1484071876",\ +"node-name":"libvirt-3-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-3-storage","backing":"libvirt-4-format"}' \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/images/rhel7.1484071877",\ +"node-name":"libvirt-2-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":true,"driver":"qcow2",\ +"file":"libvirt-2-storage","backing":"libvirt-3-format"}' \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/images/rhel7.1484071880",\ +"node-name":"libvirt-1-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"qcow2",\ +"file":"libvirt-1-storage","backing":"libvirt-2-format"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=libvirt-1-format,\ id=virtio-disk5 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ diff --git a/tests/qemuxml2argvdata/disk-cache.x86_64-latest.args b/tests/qemuxml2argvdata/disk-cache.x86_64-latest.args index 9220e6bee9..95824b50a0 100644 --- a/tests/qemuxml2argvdata/disk-cache.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-cache.x86_64-latest.args @@ -25,25 +25,45 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ -device lsi,id=scsi0,bus=pci.0,addr=0x2 \ --drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-ide0-0-0,\ -cache=writeback \ --device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"node-name":"libvirt-5-storage","cache":{"direct":false,"no-flush":false},\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-5-format","read-only":false,\ +"cache":{"direct":false,"no-flush":false},"driver":"qcow2",\ +"file":"libvirt-5-storage"}' \ +-device ide-hd,bus=ide.0,unit=0,drive=libvirt-5-format,id=ide0-0-0,bootindex=1,\ write-cache=on \ --drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-ide0-0-1,\ -cache=unsafe \ --device ide-hd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"node-name":"libvirt-4-storage","cache":{"direct":false,"no-flush":true},\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-4-format","read-only":false,\ +"cache":{"direct":false,"no-flush":true},"driver":"qcow2",\ +"file":"libvirt-4-storage"}' \ +-device ide-hd,bus=ide.0,unit=1,drive=libvirt-4-format,id=ide0-0-1,\ write-cache=on \ --drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-scsi0-0-0,\ -cache=none \ --device scsi-hd,bus=scsi0.0,scsi-id=0,drive=drive-scsi0-0-0,id=scsi0-0-0,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"node-name":"libvirt-3-storage","cache":{"direct":true,"no-flush":false},\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":false,\ +"cache":{"direct":true,"no-flush":false},"driver":"qcow2",\ +"file":"libvirt-3-storage"}' \ +-device scsi-hd,bus=scsi0.0,scsi-id=0,drive=libvirt-3-format,id=scsi0-0-0,\ write-cache=on \ --drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-virtio-disk0,\ -cache=writethrough \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"node-name":"libvirt-2-storage","cache":{"direct":false,"no-flush":false},\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,\ +"cache":{"direct":false,"no-flush":false},"driver":"qcow2",\ +"file":"libvirt-2-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=libvirt-2-format,\ id=virtio-disk0,write-cache=off \ --drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-usb-disk1,\ -cache=directsync \ --device usb-storage,bus=usb.0,port=1,drive=drive-usb-disk1,id=usb-disk1,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"node-name":"libvirt-1-storage","cache":{"direct":true,"no-flush":false},\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,\ +"cache":{"direct":true,"no-flush":false},"driver":"qcow2",\ +"file":"libvirt-1-storage"}' \ +-device usb-storage,bus=usb.0,port=1,drive=libvirt-1-format,id=usb-disk1,\ removable=off,write-cache=off \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-cdrom-network.x86_64-latest.args b/tests/qemuxml2argvdata/disk-cdrom-network.x86_64-latest.args index 0ce8497840..493ab91188 100644 --- a/tests/qemuxml2argvdata/disk-cdrom-network.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-cdrom-network.x86_64-latest.args @@ -23,18 +23,26 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-shutdown \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=ftp://host.name:21/url/path/file.iso,format=raw,if=none,\ -id=drive-ide0-0-0,readonly=on \ --device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ --drive file=ftps://host.name:990/url/path/file.iso,format=raw,if=none,\ -id=drive-ide0-0-1,readonly=on \ --device ide-cd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1 \ --drive file=https://host.name:443/url/path/file.iso,format=raw,if=none,\ -id=drive-ide0-1-0,readonly=on \ --device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ --drive file=tftp://host.name:69/url/path/file.iso,format=raw,if=none,\ -id=drive-ide0-1-1,readonly=on \ --device ide-cd,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 \ +-blockdev '{"driver":"ftp","url":"ftp://host.name:21/url/path/file.iso",\ +"node-name":"libvirt-4-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-4-format","read-only":true,"driver":"raw",\ +"file":"libvirt-4-storage"}' \ +-device ide-cd,bus=ide.0,unit=0,drive=libvirt-4-format,id=ide0-0-0,bootindex=1 \ +-blockdev '{"driver":"ftps","url":"ftps://host.name:990/url/path/file.iso",\ +"node-name":"libvirt-3-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":true,"driver":"raw",\ +"file":"libvirt-3-storage"}' \ +-device ide-cd,bus=ide.0,unit=1,drive=libvirt-3-format,id=ide0-0-1 \ +-blockdev '{"driver":"https","url":"https://host.name:443/url/path/file.iso",\ +"node-name":"libvirt-2-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":true,"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device ide-cd,bus=ide.1,unit=0,drive=libvirt-2-format,id=ide0-1-0 \ +-blockdev '{"driver":"tftp","url":"tftp://host.name:69/url/path/file.iso",\ +"node-name":"libvirt-1-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":true,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device ide-cd,bus=ide.1,unit=1,drive=libvirt-1-format,id=ide0-1-1 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args b/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args index 79863e456d..8f6df4d5d4 100644 --- a/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args @@ -24,15 +24,23 @@ file=/tmp/lib/domain--1-test/master-key.aes \ -no-acpi \ -boot menu=on,strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/var/lib/libvirt/images/f14.img,format=qcow2,if=none,\ -id=drive-virtio-disk0 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/f14.img",\ +"node-name":"libvirt-3-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":false,"driver":"qcow2",\ +"file":"libvirt-3-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=libvirt-3-format,\ id=virtio-disk0,bootindex=2 \ --drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,format=raw,if=none,\ -id=drive-ide0-1-0,readonly=on \ --device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=1 \ --drive if=none,id=drive-ide0-1-1,readonly=on \ --device ide-cd,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso",\ +"node-name":"libvirt-2-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":true,"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device ide-cd,bus=ide.1,unit=0,drive=libvirt-2-format,id=ide0-1-0,bootindex=1 \ +-blockdev '{"driver":"file","filename":"/tmp/cdrom.img",\ +"node-name":"libvirt-1-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":true,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device ide-cd,bus=ide.1,unit=1,drive=libvirt-1-format,id=ide0-1-1 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-cdrom.x86_64-latest.args b/tests/qemuxml2argvdata/disk-cdrom.x86_64-latest.args index 4c5a599820..fbdc53a022 100644 --- a/tests/qemuxml2argvdata/disk-cdrom.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-cdrom.x86_64-latest.args @@ -24,12 +24,17 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \ --device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ --drive file=/root/boot.iso,format=raw,if=none,id=drive-ide0-1-0,readonly=on \ --device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ --drive if=none,id=drive-ide0-1-1,readonly=on \ --device ide-cd,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"node-name":"libvirt-3-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":false,"driver":"raw",\ +"file":"libvirt-3-storage"}' \ +-device ide-hd,bus=ide.0,unit=0,drive=libvirt-3-format,id=ide0-0-0,bootindex=1 \ +-blockdev '{"driver":"file","filename":"/root/boot.iso",\ +"node-name":"libvirt-2-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":true,"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device ide-cd,bus=ide.1,unit=0,drive=libvirt-2-format,id=ide0-1-0 \ +-device ide-cd,bus=ide.1,unit=1,id=ide0-1-1 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ -msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args b/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args index f2b5dbe050..36dccbbb17 100644 --- a/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args @@ -25,13 +25,20 @@ file=/tmp/lib/domain--1-test/master-key.aes \ -boot menu=on,strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x6 \ --drive file=/var/lib/libvirt/images/f14.img,format=qcow2,if=none,\ -id=drive-virtio-disk0,copy-on-read=on \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/f14.img",\ +"node-name":"libvirt-2-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"qcow2",\ +"file":"libvirt-2-storage"}' \ +-blockdev '{"driver":"copy-on-read","node-name":"libvirt-CoR-vda",\ +"file":"libvirt-2-format"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=libvirt-CoR-vda,\ id=virtio-disk0,bootindex=2 \ --drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,format=raw,if=none,\ -id=drive-ide0-1-0,readonly=on \ --device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=1 \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso",\ +"node-name":"libvirt-1-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":true,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device ide-cd,bus=ide.1,unit=0,drive=libvirt-1-format,id=ide0-1-0,bootindex=1 \ -netdev user,id=hostnet0 \ -device virtio-net-pci,tx=bh,netdev=hostnet0,id=net0,mac=52:54:00:e5:48:58,\ bus=pci.0,addr=0x2 \ diff --git a/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args b/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args index 101c0f2e65..79d10d206a 100644 --- a/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args @@ -24,13 +24,18 @@ file=/tmp/lib/domain--1-test/master-key.aes \ -no-acpi \ -boot menu=on,strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/var/lib/libvirt/images/f14.img,format=qcow2,if=none,\ -id=drive-virtio-disk0,discard=unmap,detect-zeroes=unmap \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/f14.img",\ +"node-name":"libvirt-2-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,"discard":"unmap",\ +"detect-zeroes":"unmap","driver":"qcow2","file":"libvirt-2-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=libvirt-2-format,\ id=virtio-disk0,bootindex=2 \ --drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,format=raw,if=none,\ -id=drive-ide0-1-0,readonly=on,discard=ignore,detect-zeroes=on \ --device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=1 \ +-blockdev '{"driver":"file",\ +"filename":"/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso",\ +"node-name":"libvirt-1-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":true,"discard":"ignore",\ +"detect-zeroes":"on","driver":"raw","file":"libvirt-1-storage"}' \ +-device ide-cd,bus=ide.1,unit=0,drive=libvirt-1-format,id=ide0-1-0,bootindex=1 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-error-policy.x86_64-latest.args b/tests/qemuxml2argvdata/disk-error-policy.x86_64-latest.args index e8fa9e2452..227f3fa036 100644 --- a/tests/qemuxml2argvdata/disk-error-policy.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-error-policy.x86_64-latest.args @@ -24,17 +24,29 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-ide0-0-0,\ -cache=none \ --device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"node-name":"libvirt-3-storage","cache":{"direct":true,"no-flush":false},\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":false,\ +"cache":{"direct":true,"no-flush":false},"driver":"qcow2",\ +"file":"libvirt-3-storage"}' \ +-device ide-hd,bus=ide.0,unit=0,drive=libvirt-3-format,id=ide0-0-0,bootindex=1,\ write-cache=on,werror=stop,rerror=stop \ --drive file=/dev/HostVG/QEMUGuest2,format=qcow2,if=none,id=drive-ide0-0-1,\ -cache=none \ --device ide-hd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest2",\ +"node-name":"libvirt-2-storage","cache":{"direct":true,"no-flush":false},\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,\ +"cache":{"direct":true,"no-flush":false},"driver":"qcow2",\ +"file":"libvirt-2-storage"}' \ +-device ide-hd,bus=ide.0,unit=1,drive=libvirt-2-format,id=ide0-0-1,\ write-cache=on,werror=enospc \ --drive file=/dev/HostVG/QEMUGuest3,format=qcow2,if=none,id=drive-ide0-1-0,\ -cache=none \ --device ide-hd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest3",\ +"node-name":"libvirt-1-storage","cache":{"direct":true,"no-flush":false},\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,\ +"cache":{"direct":true,"no-flush":false},"driver":"qcow2",\ +"file":"libvirt-1-storage"}' \ +-device ide-hd,bus=ide.1,unit=0,drive=libvirt-1-format,id=ide0-1-0,\ write-cache=on,werror=report,rerror=ignore \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-network-gluster.x86_64-latest.args b/tests/qemuxml2argvdata/disk-network-gluster.x86_64-latest.args index 9b99db8715..4e291acaea 100644 --- a/tests/qemuxml2argvdata/disk-network-gluster.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-network-gluster.x86_64-latest.args @@ -24,20 +24,28 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=gluster://example.org:6000/Volume1/Image,file.debug=4,format=raw,\ -if=none,id=drive-virtio-disk0 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +-blockdev '{"driver":"gluster","volume":"Volume1","path":"Image",\ +"server":[{"type":"inet","host":"example.org","port":"6000"}],"debug":4,\ +"node-name":"libvirt-3-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":false,"driver":"raw",\ +"file":"libvirt-3-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=libvirt-3-format,\ id=virtio-disk0,bootindex=1 \ --drive 'file=gluster+unix:///Volume2/Image?socket=/path/to/sock,file.debug=4,\ -format=raw,if=none,id=drive-virtio-disk1' \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk1,\ +-blockdev '{"driver":"gluster","volume":"Volume2","path":"Image",\ +"server":[{"type":"unix","path":"/path/to/sock"}],"debug":4,\ +"node-name":"libvirt-2-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=libvirt-2-format,\ id=virtio-disk1 \ --drive file.driver=gluster,file.volume=Volume3,file.path=Image.qcow2,\ -file.server.0.type=tcp,file.server.0.host=example.org,file.server.0.port=6000,\ -file.server.1.type=tcp,file.server.1.host=example.org,file.server.1.port=24007,\ -file.server.2.type=unix,file.server.2.socket=/path/to/sock,file.debug=4,\ -format=qcow2,if=none,id=drive-virtio-disk2 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk2,\ +-blockdev '{"driver":"gluster","volume":"Volume3","path":"Image.qcow2",\ +"server":[{"type":"inet","host":"example.org","port":"6000"},{"type":"inet",\ +"host":"example.org","port":"24007"},{"type":"unix","path":"/path/to/sock"}],\ +"debug":4,"node-name":"libvirt-1-storage","read-only":false,\ +"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"qcow2",\ +"file":"libvirt-1-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=libvirt-1-format,\ id=virtio-disk2 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-network-iscsi.x86_64-latest.args b/tests/qemuxml2argvdata/disk-network-iscsi.x86_64-latest.args index be9ab18314..b8d2ab4f2e 100644 --- a/tests/qemuxml2argvdata/disk-network-iscsi.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-network-iscsi.x86_64-latest.args @@ -25,39 +25,49 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ -device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x2 \ --drive file.driver=iscsi,file.portal=example.org:6000,\ -file.target=iqn.1992-01.com.example,file.lun=0,file.transport=tcp,format=raw,\ -if=none,id=drive-virtio-disk0 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,\ +-blockdev '{"driver":"iscsi","portal":"example.org:6000",\ +"target":"iqn.1992-01.com.example","lun":0,"transport":"tcp",\ +"node-name":"libvirt-5-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-5-format","read-only":false,"driver":"raw",\ +"file":"libvirt-5-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=libvirt-5-format,\ id=virtio-disk0,bootindex=1 \ --drive file.driver=iscsi,file.portal=example.org:6000,\ -file.target=iqn.1992-01.com.example,file.lun=1,file.transport=tcp,format=raw,\ -if=none,id=drive-virtio-disk1 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk1,\ +-blockdev '{"driver":"iscsi","portal":"example.org:6000",\ +"target":"iqn.1992-01.com.example","lun":1,"transport":"tcp",\ +"node-name":"libvirt-4-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-4-format","read-only":false,"driver":"raw",\ +"file":"libvirt-4-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=libvirt-4-format,\ id=virtio-disk1 \ --object secret,id=virtio-disk2-secret0,\ +-object secret,id=libvirt-3-storage-secret0,\ data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ --drive file.driver=iscsi,file.portal=example.org:6000,\ -file.target=iqn.1992-01.com.example:storage,file.lun=1,file.transport=tcp,\ -file.user=myname,file.password-secret=virtio-disk2-secret0,format=raw,if=none,\ -id=drive-virtio-disk2 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk2,\ +-blockdev '{"driver":"iscsi","portal":"example.org:6000",\ +"target":"iqn.1992-01.com.example:storage","lun":1,"transport":"tcp",\ +"user":"myname","password-secret":"libvirt-3-storage-secret0",\ +"node-name":"libvirt-3-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":false,"driver":"raw",\ +"file":"libvirt-3-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=libvirt-3-format,\ id=virtio-disk2 \ --object secret,id=virtio-disk3-secret0,\ +-object secret,id=libvirt-2-storage-secret0,\ data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ --drive file.driver=iscsi,file.portal=example.org:6000,\ -file.target=iqn.1992-01.com.example:storage,file.lun=2,file.transport=tcp,\ -file.user=myname,file.password-secret=virtio-disk3-secret0,format=raw,if=none,\ -id=drive-virtio-disk3 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk3,\ +-blockdev '{"driver":"iscsi","portal":"example.org:6000",\ +"target":"iqn.1992-01.com.example:storage","lun":2,"transport":"tcp",\ +"user":"myname","password-secret":"libvirt-2-storage-secret0",\ +"node-name":"libvirt-2-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=libvirt-2-format,\ id=virtio-disk3 \ --drive file.driver=iscsi,file.portal=example.org:3260,\ -file.target=iqn.1992-01.com.example,file.lun=0,file.transport=tcp,format=raw,\ -if=none,id=drive-scsi0-0-0-0 \ +-blockdev '{"driver":"iscsi","portal":"example.org:3260",\ +"target":"iqn.1992-01.com.example","lun":0,"transport":"tcp",\ +"node-name":"libvirt-1-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ -device scsi-block,bus=scsi0.0,channel=0,scsi-id=0,lun=0,\ -drive=drive-scsi0-0-0-0,id=scsi0-0-0-0 \ +drive=libvirt-1-format,id=scsi0-0-0-0 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ -msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-network-nbd.x86_64-latest.args b/tests/qemuxml2argvdata/disk-network-nbd.x86_64-latest.args index 85452e715a..9b8a079228 100644 --- a/tests/qemuxml2argvdata/disk-network-nbd.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-network-nbd.x86_64-latest.args @@ -24,22 +24,39 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=nbd:example.org:6000,format=raw,if=none,id=drive-virtio-disk0 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +-blockdev '{"driver":"nbd","server":{"type":"inet","host":"example.org",\ +"port":"6000"},"node-name":"libvirt-5-storage","read-only":false,\ +"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-5-format","read-only":false,"driver":"raw",\ +"file":"libvirt-5-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=libvirt-5-format,\ id=virtio-disk0,bootindex=1 \ --drive file=nbd:example.org:6000:exportname=bar,format=raw,if=none,\ -id=drive-virtio-disk1 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk1,\ +-blockdev '{"driver":"nbd","server":{"type":"inet","host":"example.org",\ +"port":"6000"},"export":"bar","node-name":"libvirt-4-storage",\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-4-format","read-only":false,"driver":"raw",\ +"file":"libvirt-4-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=libvirt-4-format,\ id=virtio-disk1 \ --drive 'file=nbd://[::1]:6000,format=raw,if=none,id=drive-virtio-disk2' \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk2,\ +-blockdev '{"driver":"nbd","server":{"type":"inet","host":"::1","port":"6000"},\ +"node-name":"libvirt-3-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":false,"driver":"raw",\ +"file":"libvirt-3-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=libvirt-3-format,\ id=virtio-disk2 \ --drive 'file=nbd://[::1]:6000/bar,format=raw,if=none,id=drive-virtio-disk3' \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk3,\ +-blockdev '{"driver":"nbd","server":{"type":"inet","host":"::1","port":"6000"},\ +"export":"bar","node-name":"libvirt-2-storage","read-only":false,\ +"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=libvirt-2-format,\ id=virtio-disk3 \ --drive file=nbd:unix:/var/run/nbdsock:exportname=bar,format=raw,if=none,\ -id=drive-virtio-disk4 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk4,\ +-blockdev '{"driver":"nbd","server":{"type":"unix","path":"/var/run/nbdsock"},\ +"export":"bar","node-name":"libvirt-1-storage","read-only":false,\ +"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=libvirt-1-format,\ id=virtio-disk4 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-network-rbd.x86_64-latest.args b/tests/qemuxml2argvdata/disk-network-rbd.x86_64-latest.args index 0c5898cbd3..e941548132 100644 --- a/tests/qemuxml2argvdata/disk-network-rbd.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-network-rbd.x86_64-latest.args @@ -24,37 +24,56 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive 'file=rbd:pool/image:auth_supported=none:mon_host=mon1.example.org\:\ -6321\;mon2.example.org\:6322\;mon3.example.org\:6322,format=raw,if=none,\ -id=drive-virtio-disk0' \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +-blockdev '{"driver":"rbd","pool":"pool","image":"image",\ +"server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\ +"port":"6322"},{"host":"mon3.example.org","port":"6322"}],\ +"node-name":"libvirt-6-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-6-format","read-only":false,"driver":"raw",\ +"file":"libvirt-6-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=libvirt-6-format,\ id=virtio-disk0,bootindex=1 \ --drive file=rbd:pool/image@asdf:auth_supported=none,format=raw,if=none,\ -id=drive-virtio-disk1 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk1,\ +-blockdev '{"driver":"rbd","pool":"pool","image":"image","snapshot":"asdf",\ +"node-name":"libvirt-5-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-5-format","read-only":false,"driver":"raw",\ +"file":"libvirt-5-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=libvirt-5-format,\ id=virtio-disk1 \ --drive 'file=rbd:pool/image@foo:auth_supported=none:mon_host=mon1.example.org\:\ -6321\;mon2.example.org\:6322\;mon3.example.org\:6322,format=raw,if=none,\ -id=drive-virtio-disk2' \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk2,\ +-blockdev '{"driver":"rbd","pool":"pool","image":"image","snapshot":"foo",\ +"server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\ +"port":"6322"},{"host":"mon3.example.org","port":"6322"}],\ +"node-name":"libvirt-4-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-4-format","read-only":false,"driver":"raw",\ +"file":"libvirt-4-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=libvirt-4-format,\ id=virtio-disk2 \ --drive file=rbd:pool/image@foo:auth_supported=none:conf=/blah/test.conf,\ -format=raw,if=none,id=drive-virtio-disk3 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk3,\ +-blockdev '{"driver":"rbd","pool":"pool","image":"image","snapshot":"foo",\ +"conf":"/blah/test.conf","node-name":"libvirt-3-storage","read-only":false,\ +"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":false,"driver":"raw",\ +"file":"libvirt-3-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=libvirt-3-format,\ id=virtio-disk3 \ --object secret,id=virtio-disk4-secret0,\ +-object secret,id=libvirt-2-storage-secret0,\ data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ --drive 'file=rbd:pool/image:id=myname:auth_supported=cephx\;none:\ -mon_host=mon1.example.org\:6321\;mon2.example.org\:6322\;mon3.example.org\:\ -6322,file.password-secret=virtio-disk4-secret0,format=raw,if=none,\ -id=drive-virtio-disk4' \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk4,\ +-blockdev '{"driver":"rbd","pool":"pool","image":"image",\ +"server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\ +"port":"6322"},{"host":"mon3.example.org","port":"6322"}],"user":"myname",\ +"auth-client-required":["cephx","none"],\ +"key-secret":"libvirt-2-storage-secret0","node-name":"libvirt-2-storage",\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=libvirt-2-format,\ id=virtio-disk4 \ --drive 'file=rbd:pool/image:auth_supported=none:mon_host=[\:\:1]\:\ -6321\;example.org\:6789\;[ffff\:1234\:567\:abc\:\:0f]\:6322\;[2001\:db8\:\:\ -ff00\:42\:8329]\:6322,format=raw,if=none,id=drive-virtio-disk5' \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk5,\ +-blockdev '{"driver":"rbd","pool":"pool","image":"image",\ +"server":[{"host":"::1","port":"6321"},{"host":"example.org","port":"6789"},\ +{"host":"ffff:1234:567:abc::0f","port":"6322"},\ +{"host":"2001:db8::ff00:42:8329","port":"6322"}],\ +"node-name":"libvirt-1-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=libvirt-1-format,\ id=virtio-disk5 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-network-sheepdog.x86_64-latest.args b/tests/qemuxml2argvdata/disk-network-sheepdog.x86_64-latest.args index 544c673820..c6d9175be7 100644 --- a/tests/qemuxml2argvdata/disk-network-sheepdog.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-network-sheepdog.x86_64-latest.args @@ -24,11 +24,17 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/dev/HostVG/QEMU,,Guest,,,,1,format=raw,if=none,id=drive-ide0-0-0 \ --device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ --drive file=sheepdog:example.org:6000:image,,with,,commas,format=raw,if=none,\ -id=drive-virtio-disk0 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMU,Guest,,1",\ +"node-name":"libvirt-2-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device ide-hd,bus=ide.0,unit=0,drive=libvirt-2-format,id=ide0-0-0,bootindex=1 \ +-blockdev '{"driver":"sheepdog","server":{"type":"inet","host":"example.org",\ +"port":"6000"},"vdi":"image,with,commas","node-name":"libvirt-1-storage",\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=libvirt-1-format,\ id=virtio-disk0 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-network-source-auth.x86_64-latest.args b/tests/qemuxml2argvdata/disk-network-source-auth.x86_64-latest.args index 9f124ec75f..6483c7bd11 100644 --- a/tests/qemuxml2argvdata/disk-network-source-auth.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-network-source-auth.x86_64-latest.args @@ -24,23 +24,29 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --object secret,id=virtio-disk0-secret0,\ +-object secret,id=libvirt-2-storage-secret0,\ data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ --drive file.driver=iscsi,file.portal=example.org:6000,\ -file.target=iqn.1992-01.com.example:storage,file.lun=1,file.transport=tcp,\ -file.user=myname,file.password-secret=virtio-disk0-secret0,format=raw,if=none,\ -id=drive-virtio-disk0 \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +-blockdev '{"driver":"iscsi","portal":"example.org:6000",\ +"target":"iqn.1992-01.com.example:storage","lun":1,"transport":"tcp",\ +"user":"myname","password-secret":"libvirt-2-storage-secret0",\ +"node-name":"libvirt-2-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=libvirt-2-format,\ id=virtio-disk0,bootindex=1 \ --object secret,id=virtio-disk1-secret0,\ +-object secret,id=libvirt-1-storage-secret0,\ data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\ keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \ --drive 'file=rbd:pool/image:id=myname:auth_supported=cephx\;none:\ -mon_host=mon1.example.org\:6321\;mon2.example.org\:6322\;mon3.example.org\:\ -6322,file.password-secret=virtio-disk1-secret0,format=raw,if=none,\ -id=drive-virtio-disk1' \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk1,\ +-blockdev '{"driver":"rbd","pool":"pool","image":"image",\ +"server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\ +"port":"6322"},{"host":"mon3.example.org","port":"6322"}],"user":"myname",\ +"auth-client-required":["cephx","none"],\ +"key-secret":"libvirt-1-storage-secret0","node-name":"libvirt-1-storage",\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=libvirt-1-format,\ id=virtio-disk1 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-latest.args b/tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-latest.args index 48d70e1cd3..8d4786abb5 100644 --- a/tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-latest.args @@ -25,34 +25,47 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/libvirt-vxhs/dummy,\ -,path,endpoint=client,verify-peer=yes \ --drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ -file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ -file.server.host=192.168.0.1,file.server.port=9999,format=raw,if=none,\ -id=drive-virtio-disk0,cache=none \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +-object tls-creds-x509,id=objlibvirt-4-storage_tls0,\ +dir=/etc/pki/libvirt-vxhs/dummy,,path,endpoint=client,verify-peer=yes \ +-blockdev '{"driver":"vxhs","tls-creds":"objlibvirt-4-storage_tls0",\ +"vdisk-id":"eb90327c-8302-4725-9e1b-4e85ed4dc251",\ +"server":{"host":"192.168.0.1","port":"9999"},"node-name":"libvirt-4-storage",\ +"cache":{"direct":true,"no-flush":false},"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-4-format","read-only":false,\ +"cache":{"direct":true,"no-flush":false},"driver":"raw",\ +"file":"libvirt-4-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=libvirt-4-format,\ id=virtio-disk0,bootindex=1,write-cache=on,\ serial=eb90327c-8302-4725-9e1b-4e85ed4dc251 \ --object tls-creds-x509,id=objvirtio-disk1_tls0,dir=/etc/pki/libvirt-vxhs/dummy,\ -,path,endpoint=client,verify-peer=yes \ --drive file.driver=vxhs,file.tls-creds=objvirtio-disk1_tls0,\ -file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc252,\ -file.server.host=192.168.0.2,file.server.port=9999,format=raw,if=none,\ -id=drive-virtio-disk1,cache=none \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk1,\ +-object tls-creds-x509,id=objlibvirt-3-storage_tls0,\ +dir=/etc/pki/libvirt-vxhs/dummy,,path,endpoint=client,verify-peer=yes \ +-blockdev '{"driver":"vxhs","tls-creds":"objlibvirt-3-storage_tls0",\ +"vdisk-id":"eb90327c-8302-4725-9e1b-4e85ed4dc252",\ +"server":{"host":"192.168.0.2","port":"9999"},"node-name":"libvirt-3-storage",\ +"cache":{"direct":true,"no-flush":false},"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":false,\ +"cache":{"direct":true,"no-flush":false},"driver":"raw",\ +"file":"libvirt-3-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=libvirt-3-format,\ id=virtio-disk1,write-cache=on,serial=eb90327c-8302-4725-9e1b-4e85ed4dc252 \ --drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc253,\ -file.server.host=192.168.0.3,file.server.port=9999,format=raw,if=none,\ -id=drive-virtio-disk2,cache=none \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk2,\ +-blockdev '{"driver":"vxhs","vdisk-id":"eb90327c-8302-4725-9e1b-4e85ed4dc253",\ +"server":{"host":"192.168.0.3","port":"9999"},"node-name":"libvirt-2-storage",\ +"cache":{"direct":true,"no-flush":false},"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,\ +"cache":{"direct":true,"no-flush":false},"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=libvirt-2-format,\ id=virtio-disk2,write-cache=on,serial=eb90327c-8302-4725-9e1b-4e85ed4dc252 \ --object tls-creds-x509,id=objvirtio-disk3_tls0,dir=/etc/pki/libvirt-nbd/dummy,,\ -path,endpoint=client,verify-peer=yes \ --drive file.driver=nbd,file.server.type=inet,file.server.host=example.com,\ -file.server.port=1234,file.tls-creds=objvirtio-disk3_tls0,format=raw,if=none,\ -id=drive-virtio-disk3,cache=none \ --device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk3,\ +-object tls-creds-x509,id=objlibvirt-1-storage_tls0,\ +dir=/etc/pki/libvirt-nbd/dummy,,path,endpoint=client,verify-peer=yes \ +-blockdev '{"driver":"nbd","server":{"type":"inet","host":"example.com",\ +"port":"1234"},"tls-creds":"objlibvirt-1-storage_tls0",\ +"node-name":"libvirt-1-storage","cache":{"direct":true,"no-flush":false},\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,\ +"cache":{"direct":true,"no-flush":false},"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=libvirt-1-format,\ id=virtio-disk3,write-cache=on \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-readonly-disk.x86_64-latest.args b/tests/qemuxml2argvdata/disk-readonly-disk.x86_64-latest.args index 3fd8f5c849..435f930fa8 100644 --- a/tests/qemuxml2argvdata/disk-readonly-disk.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-readonly-disk.x86_64-latest.args @@ -24,10 +24,16 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \ --device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ --drive file=/dev/sr0,format=raw,if=none,id=drive-ide0-1-0,readonly=on \ --device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"node-name":"libvirt-2-storage","read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device ide-hd,bus=ide.0,unit=0,drive=libvirt-2-format,id=ide0-0-0,bootindex=1 \ +-blockdev '{"driver":"host_device","filename":"/dev/sr0",\ +"node-name":"libvirt-1-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":true,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device ide-cd,bus=ide.1,unit=0,drive=libvirt-1-format,id=ide0-1-0 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-shared.x86_64-latest.args b/tests/qemuxml2argvdata/disk-shared.x86_64-latest.args index 15f8c6b3d7..8560f82854 100644 --- a/tests/qemuxml2argvdata/disk-shared.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-shared.x86_64-latest.args @@ -24,13 +24,19 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0,\ -cache=none \ --device ide-hd,bus=ide.0,unit=0,share-rw=on,drive=drive-ide0-0-0,id=ide0-0-0,\ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"node-name":"libvirt-2-storage","cache":{"direct":true,"no-flush":false},\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,\ +"cache":{"direct":true,"no-flush":false},"driver":"raw",\ +"file":"libvirt-2-storage"}' \ +-device ide-hd,bus=ide.0,unit=0,share-rw=on,drive=libvirt-2-format,id=ide0-0-0,\ bootindex=1,write-cache=on,serial=XYZXYZXYZYXXYZYZYXYZY \ --drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,id=drive-ide0-1-0,\ -readonly=on \ --device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest2",\ +"node-name":"libvirt-1-storage","read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":true,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device ide-cd,bus=ide.1,unit=0,drive=libvirt-1-format,id=ide0-1-0 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-latest.args b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-latest.args index 902864539b..8ba2767c57 100644 --- a/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-latest.args @@ -27,16 +27,22 @@ path=/tmp/lib/domain--1-QEMUGuest1/pr-helper0.sock \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ -device virtio-scsi-pci,id=scsi0,num_queues=8,bus=pci.0,addr=0x3 \ --drive file=/dev/HostVG/QEMUGuest1,file.pr-manager=pr-helper0,format=raw,\ -if=none,id=drive-scsi0-0-0-0 \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1",\ +"pr-manager":"pr-helper0","node-name":"libvirt-2-storage","read-only":false,\ +"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"raw",\ +"file":"libvirt-2-storage"}' \ -device scsi-block,bus=scsi0.0,channel=0,scsi-id=0,lun=0,\ -drive=drive-scsi0-0-0-0,id=scsi0-0-0-0,bootindex=1 \ --object pr-manager-helper,id=pr-helper-scsi0-0-0-1,\ +drive=libvirt-2-format,id=scsi0-0-0-0,bootindex=1 \ +-object pr-manager-helper,id=pr-helper-libvirt-1-storage,\ path=/path/to/qemu-pr-helper.sock \ --drive file=/dev/HostVG/QEMUGuest2,file.pr-manager=pr-helper-scsi0-0-0-1,\ -format=raw,if=none,id=drive-scsi0-0-0-1 \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest2",\ +"pr-manager":"pr-helper-libvirt-1-storage","node-name":"libvirt-1-storage",\ +"read-only":false,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ -device scsi-block,bus=scsi0.0,channel=0,scsi-id=0,lun=1,\ -drive=drive-scsi0-0-0-1,id=scsi0-0-0-1 \ +drive=libvirt-1-format,id=scsi0-0-0-1 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4 \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ resourcecontrol=deny \ -- 2.16.2
participants (1)
-
Peter Krempa