d21471696b
Passing fixed-iothread=true should make iothread conflicts fatal, whereas fixed-iothread=false should not. Combine the second case with an error condition that is checked after the iothread is handled, to verify that qemu does not crash if there is such an error after changing the iothread failed. Signed-off-by: Max Reitz <mreitz@redhat.com> Message-Id: <20210624083825.29224-3-mreitz@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Tested-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
133 lines
6.0 KiB
Plaintext
133 lines
6.0 KiB
Plaintext
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
=== Launch VM ===
|
|
{"execute": "nbd-server-start", "arguments": {"addr": {"data": {"path": "SOCK_DIR/PID-socket"}, "type": "unix"}}}
|
|
{"return": {}}
|
|
{"execute": "query-block-exports", "arguments": {}}
|
|
{"return": []}
|
|
|
|
=== Create a read-only NBD export ===
|
|
{"execute": "block-export-add", "arguments": {"id": "export0", "node-name": "fmt", "type": "nbd"}}
|
|
{"return": {}}
|
|
{"execute": "query-block-exports", "arguments": {}}
|
|
{"return": [{"id": "export0", "node-name": "fmt", "shutting-down": false, "type": "nbd"}]}
|
|
exports available: 1
|
|
export: 'fmt'
|
|
size: 67108864
|
|
flags: 0x58f ( readonly flush fua df multi cache )
|
|
min block: XXX
|
|
opt block: XXX
|
|
max block: XXX
|
|
available meta contexts: 1
|
|
base:allocation
|
|
|
|
|
|
=== Try a few invalid things ===
|
|
{"execute": "block-export-add", "arguments": {"id": "#invalid", "node-name": "fmt", "type": "nbd"}}
|
|
{"error": {"class": "GenericError", "desc": "Invalid block export id"}}
|
|
{"execute": "block-export-add", "arguments": {"id": "export0", "node-name": "fmt", "type": "nbd"}}
|
|
{"error": {"class": "GenericError", "desc": "Block export id 'export0' is already in use"}}
|
|
{"execute": "block-export-add", "arguments": {"id": "export1", "node-name": "ro", "type": "nbd", "writable": true}}
|
|
{"error": {"class": "GenericError", "desc": "Cannot export read-only node as writable"}}
|
|
{"execute": "block-export-del", "arguments": {"id": "export1"}}
|
|
{"error": {"class": "GenericError", "desc": "Export 'export1' is not found"}}
|
|
{"execute": "query-block-exports", "arguments": {}}
|
|
{"return": [{"id": "export0", "node-name": "fmt", "shutting-down": false, "type": "nbd"}]}
|
|
|
|
=== Move export to an iothread ===
|
|
{"execute": "device_add", "arguments": {"drive": "fmt", "driver": "scsi-hd", "id": "sda"}}
|
|
{"return": {}}
|
|
{"execute": "query-block-exports", "arguments": {}}
|
|
{"return": [{"id": "export0", "node-name": "fmt", "shutting-down": false, "type": "nbd"}]}
|
|
exports available: 1
|
|
export: 'fmt'
|
|
size: 67108864
|
|
flags: 0x58f ( readonly flush fua df multi cache )
|
|
min block: XXX
|
|
opt block: XXX
|
|
max block: XXX
|
|
available meta contexts: 1
|
|
base:allocation
|
|
|
|
|
|
=== Add export with conflicting iothread ===
|
|
{"execute": "device_add", "arguments": {"drive": "null", "driver": "scsi-hd", "id": "sdb"}}
|
|
{"return": {}}
|
|
{"execute": "block-export-add", "arguments": {"fixed-iothread": true, "id": "export1", "iothread": "iothread1", "node-name": "null", "type": "nbd", "writable": true}}
|
|
{"error": {"class": "GenericError", "desc": "Cannot change iothread of active block backend"}}
|
|
{"execute": "block-export-add", "arguments": {"fixed-iothread": false, "id": "export1", "iothread": "iothread1", "node-name": "null", "type": "nbd", "writable": true}}
|
|
{"error": {"class": "GenericError", "desc": "Permission conflict on node 'null': permissions 'write' are both required by an unnamed block device (uses node 'null' as 'root' child) and unshared by block device 'sdb' (uses node 'null' as 'root' child)."}}
|
|
|
|
=== Add a writable export ===
|
|
{"execute": "block-export-add", "arguments": {"description": "This is the writable second export", "id": "export1", "name": "export1", "node-name": "fmt", "type": "nbd", "writable": true, "writethrough": true}}
|
|
{"error": {"class": "GenericError", "desc": "Permission conflict on node 'fmt': permissions 'write' are both required by an unnamed block device (uses node 'fmt' as 'root' child) and unshared by block device 'sda' (uses node 'fmt' as 'root' child)."}}
|
|
{"execute": "device_del", "arguments": {"id": "sda"}}
|
|
{"return": {}}
|
|
{"data": {"device": "sda", "path": "/machine/peripheral/sda"}, "event": "DEVICE_DELETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
|
{"execute": "device_add", "arguments": {"drive": "fmt", "driver": "scsi-hd", "id": "sda", "share-rw": true}}
|
|
{"return": {}}
|
|
{"execute": "block-export-add", "arguments": {"description": "This is the writable second export", "id": "export1", "name": "export1", "node-name": "fmt", "type": "nbd", "writable": true, "writethrough": true}}
|
|
{"return": {}}
|
|
{"execute": "query-block-exports", "arguments": {}}
|
|
{"return": [{"id": "export1", "node-name": "fmt", "shutting-down": false, "type": "nbd"}, {"id": "export0", "node-name": "fmt", "shutting-down": false, "type": "nbd"}]}
|
|
exports available: 2
|
|
export: 'fmt'
|
|
size: 67108864
|
|
flags: 0x58f ( readonly flush fua df multi cache )
|
|
min block: XXX
|
|
opt block: XXX
|
|
max block: XXX
|
|
available meta contexts: 1
|
|
base:allocation
|
|
export: 'export1'
|
|
description: This is the writable second export
|
|
size: 67108864
|
|
flags: 0xced ( flush fua trim zeroes df cache fast-zero )
|
|
min block: XXX
|
|
opt block: XXX
|
|
max block: XXX
|
|
available meta contexts: 1
|
|
base:allocation
|
|
|
|
|
|
=== Connect qemu-io to export1, try removing exports ===
|
|
read 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
wrote 4096/4096 bytes at offset 4096
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
{"execute": "block-export-del", "arguments": {"id": "export1"}}
|
|
{"error": {"class": "GenericError", "desc": "export 'export1' still in use"}}
|
|
{"execute": "block-export-del", "arguments": {"id": "export0"}}
|
|
{"return": {}}
|
|
[{"data": {"id": "export0"}, "event": "BLOCK_EXPORT_DELETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}]
|
|
{"execute": "query-block-exports", "arguments": {}}
|
|
{"return": [{"id": "export1", "node-name": "fmt", "shutting-down": false, "type": "nbd"}]}
|
|
exports available: 1
|
|
export: 'export1'
|
|
description: This is the writable second export
|
|
size: 67108864
|
|
flags: 0xced ( flush fua trim zeroes df cache fast-zero )
|
|
min block: XXX
|
|
opt block: XXX
|
|
max block: XXX
|
|
available meta contexts: 1
|
|
base:allocation
|
|
|
|
|
|
=== Connect qemu-io again, try force removing ===
|
|
{"execute": "block-export-del", "arguments": {"id": "export1"}}
|
|
{"error": {"class": "GenericError", "desc": "export 'export1' still in use"}}
|
|
{"execute": "block-export-del", "arguments": {"id": "export1", "mode": "hard"}}
|
|
{"return": {}}
|
|
read failed: Input/output error
|
|
|
|
{"execute": "query-block-exports", "arguments": {}}
|
|
{"return": []}
|
|
exports available: 0
|
|
|
|
|
|
=== Shut down QEMU ===
|