ac2ae233a0
bdrv_unref() is called by a lot of places that need to hold the graph lock (it naturally happens in the context of operations that change the graph). However, bdrv_unref() takes the graph writer lock internally, so it can't actually be called while already holding a graph lock without causing a deadlock. bdrv_unref() also can't just become GRAPH_WRLOCK because it drains the node before closing it, and draining requires that the graph is unlocked. The solution is to defer deleting the node until we don't hold the lock any more and draining is possible again. Note that keeping images open for longer than necessary can create problems, too: You can't open an image again before it is really closed (if image locking didn't prevent it, it would cause corruption). Reopening an image immediately happens at least during bdrv_open() and bdrv_co_create(). In order to solve this problem, make sure to run the deferred unref in bdrv_graph_wrunlock(), i.e. the first possible place where we can drain again. This is also why bdrv_schedule_unref() is marked GRAPH_WRLOCK. The output of iotest 051 is updated because the additional polling changes the order of HMP output, resulting in a new "(qemu)" prompt in the test output that was previously on a separate line and filtered out. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-ID: <20230911094620.45040-6-kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
554 lines
26 KiB
Plaintext
554 lines
26 KiB
Plaintext
QA output created by 051
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
|
|
|
|
=== Unknown option ===
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=,if=none,id=drive0
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=,if=none,id=drive0: Block format 'qcow2' does not support the option 'unknown_opt'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=on,if=none,id=drive0
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=on,if=none,id=drive0: Block format 'qcow2' does not support the option 'unknown_opt'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=1234,if=none,id=drive0
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=1234,if=none,id=drive0: Block format 'qcow2' does not support the option 'unknown_opt'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=foo,if=none,id=drive0
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=foo,if=none,id=drive0: Block format 'qcow2' does not support the option 'unknown_opt'
|
|
|
|
|
|
=== Unknown protocol option ===
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,file.unknown_opt=
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,file.unknown_opt=: Block protocol 'file' doesn't support the option 'unknown_opt'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,file.unknown_opt=on
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,file.unknown_opt=on: Block protocol 'file' doesn't support the option 'unknown_opt'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,file.unknown_opt=1234
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,file.unknown_opt=1234: Block protocol 'file' doesn't support the option 'unknown_opt'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,file.unknown_opt=foo
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,file.unknown_opt=foo: Block protocol 'file' doesn't support the option 'unknown_opt'
|
|
|
|
|
|
=== Invalid format ===
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=foo
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=foo: Unknown driver 'foo'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,driver=foo
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,driver=foo: Unknown driver 'foo'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,driver=raw,format=qcow2
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,driver=raw,format=qcow2: Cannot specify both 'driver' and 'format'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,driver=qcow2,format=qcow2
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,driver=qcow2,format=qcow2: Cannot specify both 'driver' and 'format'
|
|
|
|
|
|
=== Node names ===
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,node-name=x123456789012345678901234567890
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,node-name=x1234567890123456789012345678901
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,node-name=x1234567890123456789012345678901: Node name too long
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,node-name=All-Types.of_all0wed_chars
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,node-name=123foo
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,node-name=123foo: Invalid node-name: '123foo'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,node-name=_foo
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,node-name=_foo: Invalid node-name: '_foo'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,node-name=foo#12
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,node-name=foo#12: Invalid node-name: 'foo#12'
|
|
|
|
|
|
=== Device without drive ===
|
|
|
|
Testing: -device virtio-scsi -device scsi-hd
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
QEMU_PROG: -device scsi-hd: drive property not set
|
|
|
|
|
|
=== Overriding backing file ===
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,driver=qcow2,backing.file.filename=TEST_DIR/t.qcow2.orig,if=none,id=drive0 -nodefaults
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) info block
|
|
drive0 (NODE_NAME): json:{"backing": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/t.qcow2.orig"}}, "driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/t.qcow2"}} (qcow2)
|
|
Removable device: not locked, tray closed
|
|
Cache mode: writeback
|
|
Backing file: TEST_DIR/t.qcow2.orig (chain depth: 1)
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,driver=raw,backing.file.filename=TEST_DIR/t.qcow2.orig
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,driver=raw,backing.file.filename=TEST_DIR/t.qcow2.orig: Driver doesn't support backing files
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,file.backing.driver=file,file.backing.filename=TEST_DIR/t.qcow2.orig
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,file.backing.driver=file,file.backing.filename=TEST_DIR/t.qcow2.orig: Driver doesn't support backing files
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,file.backing.driver=qcow2,file.backing.file.filename=TEST_DIR/t.qcow2.orig
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,file.backing.driver=qcow2,file.backing.file.filename=TEST_DIR/t.qcow2.orig: Driver doesn't support backing files
|
|
|
|
|
|
=== Enable and disable lazy refcounting on the command line, plus some invalid values ===
|
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,lazy-refcounts=on
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,lazy-refcounts=off
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,lazy-refcounts=
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,lazy-refcounts=: Parameter 'lazy-refcounts' expects 'on' or 'off'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,lazy-refcounts=42
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,lazy-refcounts=42: Parameter 'lazy-refcounts' expects 'on' or 'off'
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,lazy-refcounts=foo
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,lazy-refcounts=foo: Parameter 'lazy-refcounts' expects 'on' or 'off'
|
|
|
|
|
|
=== With version 2 images enabling lazy refcounts must fail ===
|
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,lazy-refcounts=on
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,lazy-refcounts=on: Lazy refcounts require a qcow2 image with at least qemu 1.1 compatibility level
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,lazy-refcounts=off
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
|
|
=== No medium ===
|
|
|
|
Testing: -drive if=floppy
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive if=ide,media=cdrom
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive if=ide
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
QEMU_PROG: Device needs media, but drive is empty
|
|
|
|
Testing: -drive if=virtio
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
QEMU_PROG: -drive if=virtio: Device needs media, but drive is empty
|
|
|
|
Testing: -drive if=none,id=disk -device ide-cd,drive=disk
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive if=none,id=disk -device lsi53c895a -device scsi-cd,drive=disk
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive if=none,id=disk -device ide-hd,drive=disk
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
QEMU_PROG: -device ide-hd,drive=disk: Device needs media, but drive is empty
|
|
|
|
Testing: -drive if=none,id=disk -device lsi53c895a -device scsi-hd,drive=disk
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
QEMU_PROG: -device scsi-hd,drive=disk: Device needs media, but drive is empty
|
|
|
|
|
|
=== Attach to node in non-default iothread ===
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,node-name=disk -object iothread,id=thread0 -device virtio-scsi,iothread=thread0,id=virtio-scsi0 -device scsi-hd,bus=virtio-scsi0.0,drive=disk,share-rw=on -device ide-hd,drive=disk,share-rw=on
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) QEMU_PROG: -device ide-hd,drive=disk,share-rw=on: Cannot change iothread of active block backend
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,node-name=disk -object iothread,id=thread0 -device virtio-scsi,iothread=thread0,id=virtio-scsi0 -device scsi-hd,bus=virtio-scsi0.0,drive=disk,share-rw=on -device virtio-blk-pci,drive=disk,share-rw=on
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) QEMU_PROG: -device virtio-blk-pci,drive=disk,share-rw=on: Cannot change iothread of active block backend
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,node-name=disk -object iothread,id=thread0 -device virtio-scsi,iothread=thread0,id=virtio-scsi0 -device scsi-hd,bus=virtio-scsi0.0,drive=disk,share-rw=on -device lsi53c895a,id=lsi0 -device scsi-hd,bus=lsi0.0,drive=disk,share-rw=on
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) QEMU_PROG: -device scsi-hd,bus=lsi0.0,drive=disk,share-rw=on: HBA does not support iothreads
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,node-name=disk -object iothread,id=thread0 -device virtio-scsi,iothread=thread0,id=virtio-scsi0 -device scsi-hd,bus=virtio-scsi0.0,drive=disk,share-rw=on -device virtio-scsi,id=virtio-scsi1 -device scsi-hd,bus=virtio-scsi1.0,drive=disk,share-rw=on
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) QEMU_PROG: -device scsi-hd,bus=virtio-scsi1.0,drive=disk,share-rw=on: Cannot change iothread of active block backend
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,node-name=disk -object iothread,id=thread0 -device virtio-scsi,iothread=thread0,id=virtio-scsi0 -device scsi-hd,bus=virtio-scsi0.0,drive=disk,share-rw=on -device virtio-blk-pci,drive=disk,iothread=thread0,share-rw=on
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) QEMU_PROG: -device virtio-blk-pci,drive=disk,iothread=thread0,share-rw=on: Cannot change iothread of active block backend
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,node-name=disk -object iothread,id=thread0 -device virtio-scsi,iothread=thread0,id=virtio-scsi0 -device scsi-hd,bus=virtio-scsi0.0,drive=disk,share-rw=on -device virtio-scsi,id=virtio-scsi1,iothread=thread0 -device scsi-hd,bus=virtio-scsi1.0,drive=disk,share-rw=on
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
|
|
=== Read-only ===
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=floppy,readonly=on
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=ide,media=cdrom,readonly=on
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=ide,readonly=on
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
QEMU_PROG: Block node is read-only
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=virtio,readonly=on
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,id=disk,readonly=on -device ide-cd,drive=disk
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,id=disk,readonly=on -device lsi53c895a -device scsi-cd,drive=disk
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,id=disk,readonly=on -device ide-hd,drive=disk
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
QEMU_PROG: -device ide-hd,drive=disk: Block node is read-only
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,id=disk,readonly=on -device lsi53c895a -device scsi-hd,drive=disk
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
|
|
=== Cache modes ===
|
|
|
|
Testing: -drive driver=null-co,read-zeroes=on,cache=none
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive driver=null-co,read-zeroes=on,cache=directsync
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive driver=null-co,read-zeroes=on,cache=writeback
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive driver=null-co,read-zeroes=on,cache=writethrough
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive driver=null-co,read-zeroes=on,cache=unsafe
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive driver=null-co,cache=invalid_value
|
|
QEMU_PROG: -drive driver=null-co,cache=invalid_value: invalid cache option
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=writeback,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) info block
|
|
drive0 (NODE_NAME): json:{"backing": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/t.qcow2.base"}}, "driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/t.qcow2"}} (qcow2)
|
|
Removable device: not locked, tray closed
|
|
Cache mode: writeback
|
|
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
|
(qemu) info block file
|
|
|
|
file: TEST_DIR/t.qcow2 (file)
|
|
Cache mode: writeback
|
|
(qemu) info block backing
|
|
backing: TEST_DIR/t.qcow2.base (qcow2, read-only)
|
|
Cache mode: writeback, ignore flushes
|
|
(qemu) info block backing-file
|
|
|
|
backing-file: TEST_DIR/t.qcow2.base (file, read-only)
|
|
Cache mode: writeback, ignore flushes
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=writethrough,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) info block
|
|
drive0 (NODE_NAME): json:{"backing": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/t.qcow2.base"}}, "driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/t.qcow2"}} (qcow2)
|
|
Removable device: not locked, tray closed
|
|
Cache mode: writethrough
|
|
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
|
(qemu) info block file
|
|
|
|
file: TEST_DIR/t.qcow2 (file)
|
|
Cache mode: writeback
|
|
(qemu) info block backing
|
|
backing: TEST_DIR/t.qcow2.base (qcow2, read-only)
|
|
Cache mode: writeback, ignore flushes
|
|
(qemu) info block backing-file
|
|
|
|
backing-file: TEST_DIR/t.qcow2.base (file, read-only)
|
|
Cache mode: writeback, ignore flushes
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=unsafe,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) info block
|
|
drive0 (NODE_NAME): json:{"backing": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/t.qcow2.base"}}, "driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/t.qcow2"}} (qcow2)
|
|
Removable device: not locked, tray closed
|
|
Cache mode: writeback, ignore flushes
|
|
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
|
(qemu) info block file
|
|
|
|
file: TEST_DIR/t.qcow2 (file)
|
|
Cache mode: writeback, ignore flushes
|
|
(qemu) info block backing
|
|
backing: TEST_DIR/t.qcow2.base (qcow2, read-only)
|
|
Cache mode: writeback, ignore flushes
|
|
(qemu) info block backing-file
|
|
|
|
backing-file: TEST_DIR/t.qcow2.base (file, read-only)
|
|
Cache mode: writeback, ignore flushes
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=invalid_value,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,cache=invalid_value,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0: invalid cache option
|
|
|
|
|
|
=== Specifying the protocol layer ===
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,file.driver=file
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
|
|
=== Leaving out required options ===
|
|
|
|
Testing: -drive driver=file
|
|
QEMU_PROG: -drive driver=file: The 'file' block driver requires a file name
|
|
|
|
Testing: -drive driver=file,filename=
|
|
QEMU_PROG: -drive driver=file,filename=: The 'file' block driver requires a file name
|
|
|
|
Testing: -drive driver=nbd
|
|
QEMU_PROG: -drive driver=nbd: NBD server address missing
|
|
|
|
Testing: -drive driver=raw
|
|
QEMU_PROG: -drive driver=raw: A block device must be specified for "file"
|
|
|
|
Testing: -drive file.driver=file
|
|
QEMU_PROG: -drive file.driver=file: The 'file' block driver requires a file name
|
|
|
|
Testing: -drive file.driver=nbd
|
|
QEMU_PROG: -drive file.driver=nbd: NBD server address missing
|
|
|
|
Testing: -drive file.driver=raw
|
|
QEMU_PROG: -drive file.driver=raw: A block device must be specified for "file"
|
|
|
|
Testing: -drive foo=bar
|
|
QEMU_PROG: -drive foo=bar: Must specify either driver or file
|
|
|
|
|
|
=== Specifying both an option and its legacy alias ===
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,iops=1234,throttling.iops-total=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,iops=1234,throttling.iops-total=5678: 'throttling.iops-total' and its alias 'iops' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,iops_rd=1234,throttling.iops-read=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,iops_rd=1234,throttling.iops-read=5678: 'throttling.iops-read' and its alias 'iops_rd' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,iops_wr=1234,throttling.iops-write=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,iops_wr=1234,throttling.iops-write=5678: 'throttling.iops-write' and its alias 'iops_wr' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps=1234,throttling.bps-total=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,bps=1234,throttling.bps-total=5678: 'throttling.bps-total' and its alias 'bps' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps_rd=1234,throttling.bps-read=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,bps_rd=1234,throttling.bps-read=5678: 'throttling.bps-read' and its alias 'bps_rd' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps_wr=1234,throttling.bps-write=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,bps_wr=1234,throttling.bps-write=5678: 'throttling.bps-write' and its alias 'bps_wr' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,iops_max=1234,throttling.iops-total-max=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,iops_max=1234,throttling.iops-total-max=5678: 'throttling.iops-total-max' and its alias 'iops_max' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,iops_rd_max=1234,throttling.iops-read-max=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,iops_rd_max=1234,throttling.iops-read-max=5678: 'throttling.iops-read-max' and its alias 'iops_rd_max' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,iops_wr_max=1234,throttling.iops-write-max=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,iops_wr_max=1234,throttling.iops-write-max=5678: 'throttling.iops-write-max' and its alias 'iops_wr_max' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps_max=1234,throttling.bps-total-max=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,bps_max=1234,throttling.bps-total-max=5678: 'throttling.bps-total-max' and its alias 'bps_max' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps_rd_max=1234,throttling.bps-read-max=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,bps_rd_max=1234,throttling.bps-read-max=5678: 'throttling.bps-read-max' and its alias 'bps_rd_max' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps_wr_max=1234,throttling.bps-write-max=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,bps_wr_max=1234,throttling.bps-write-max=5678: 'throttling.bps-write-max' and its alias 'bps_wr_max' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,iops_size=1234,throttling.iops-size=5678
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,iops_size=1234,throttling.iops-size=5678: 'throttling.iops-size' and its alias 'iops_size' can't be used at the same time
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,readonly=on,read-only=off
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,readonly=on,read-only=off: 'read-only' and its alias 'readonly' can't be used at the same time
|
|
|
|
|
|
=== Catching negative/large throttling values ===
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,iops=-1
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,iops=-1: bps/iops/max values must be within [0, 1000000000000000]
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps=-2
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,bps=-2: bps/iops/max values must be within [0, 1000000000000000]
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps_rd=-3
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,bps_rd=-3: bps/iops/max values must be within [0, 1000000000000000]
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps_rd_max=-3
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,bps_rd_max=-3: bps/iops/max values must be within [0, 1000000000000000]
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,throttling.iops-total=-4
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,throttling.iops-total=-4: bps/iops/max values must be within [0, 1000000000000000]
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,throttling.bps-total=-5
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,throttling.bps-total=-5: bps/iops/max values must be within [0, 1000000000000000]
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps=0
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps=1
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps=1000000000000000
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps=1000000000000001
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,bps=1000000000000001: bps/iops/max values must be within [0, 1000000000000000]
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,bps=9999999999999999
|
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,bps=9999999999999999: bps/iops/max values must be within [0, 1000000000000000]
|
|
|
|
|
|
=== Parsing protocol from file name ===
|
|
|
|
Testing: -hda foo:bar
|
|
QEMU_PROG: -hda foo:bar: Unknown protocol 'foo'
|
|
|
|
Testing: -drive file=foo:bar
|
|
QEMU_PROG: -drive file=foo:bar: Unknown protocol 'foo'
|
|
|
|
Testing: -drive file.filename=foo:bar
|
|
QEMU_PROG: -drive file.filename=foo:bar: Could not open 'foo:bar': No such file or directory
|
|
|
|
Testing: -hda file:TEST_DIR/t.qcow2
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=file:TEST_DIR/t.qcow2
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) quit
|
|
|
|
Testing: -drive file.filename=file:TEST_DIR/t.qcow2
|
|
QEMU_PROG: -drive file.filename=file:TEST_DIR/t.qcow2: Could not open 'file:TEST_DIR/t.qcow2': No such file or directory
|
|
|
|
|
|
=== Snapshot mode ===
|
|
|
|
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,id=drive0 -snapshot
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) qemu-io drive0 "write -P 0x22 0 4k"
|
|
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,snapshot=on,if=none,id=drive0
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) qemu-io drive0 "write -P 0x22 0 4k"
|
|
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
(qemu) quit
|
|
|
|
Testing: -drive file.filename=TEST_DIR/t.qcow2,driver=qcow2,snapshot=on,if=none,id=drive0
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) qemu-io drive0 "write -P 0x22 0 4k"
|
|
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
(qemu) quit
|
|
|
|
Testing: -drive file.filename=TEST_DIR/t.qcow2,driver=qcow2,if=none,id=drive0 -snapshot
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) qemu-io drive0 "write -P 0x22 0 4k"
|
|
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=file:TEST_DIR/t.qcow2,if=none,id=drive0 -snapshot
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) qemu-io drive0 "write -P 0x22 0 4k"
|
|
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=file:TEST_DIR/t.qcow2,snapshot=on,if=none,id=drive0
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) qemu-io drive0 "write -P 0x22 0 4k"
|
|
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,if=none,id=drive0 -snapshot
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) qemu-io drive0 "write -P 0x22 0 4k"
|
|
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
(qemu) quit
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,snapshot=on,if=none,id=drive0
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) qemu-io drive0 "write -P 0x22 0 4k"
|
|
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
(qemu) quit
|
|
|
|
read 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
Testing: -drive file=TEST_DIR/t.qcow2,snapshot=off,if=none,id=drive0
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) qemu-io drive0 "write -P 0x22 0 4k"
|
|
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
(qemu) quit
|
|
|
|
read 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
Testing: -drive file=TEST_DIR/t.qcow2,snapshot=on,if=none,id=drive0
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) qemu-io drive0 "write -P 0x33 0 4k"
|
|
wrote 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
(qemu) commit drive0
|
|
(qemu) quit
|
|
|
|
read 4096/4096 bytes at offset 0
|
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
Testing: -drive driver=null-co,snapshot=on
|
|
QEMU_PROG: -drive driver=null-co,snapshot=on: Could not open temporary file SNAPSHOT_PATH: No such file or directory
|
|
|
|
Testing: -drive file=TEST_DIR/t.qcow2,snapshot=on,read-only=on,if=none,id=drive0
|
|
QEMU X.Y.Z monitor - type 'help' for more information
|
|
(qemu) info block
|
|
drive0 (NODE_NAME): json:{"backing": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/t.qcow2"}}, "driver": "qcow2", "file": {"driver": "file", "filename": SNAPSHOT_PATH}} (qcow2, read-only)
|
|
Removable device: not locked, tray closed
|
|
Cache mode: writeback, ignore flushes
|
|
Backing file: TEST_DIR/t.qcow2 (chain depth: 1)
|
|
(qemu) quit
|
|
|
|
*** done
|