-device does not work as -drive do
| Affects | Status | Importance | Assigned to | Milestone | |
|---|---|---|---|---|---|
| QEMU |
Expired
|
Undecided
|
Unassigned | ||
Bug Description
Copy/paste of https:/
Below, what was my question the answer I wrote, all exposes the bug.
=======
I need to eject a floppy from QEmu 3.0 monitor, but the command surprisingly fails complaining the device is not found, while it is really there.
Listing of devices:
(qemu) info block
fda: dos-6-22/
Attached to: /machine/
Removable device: not locked, tray closed
Cache mode: writeback
hda: hda.img (raw)
Attached to: /machine/
Cache mode: writeback
Eject command result:
(qemu) eject fda
Device 'fda' not found
This is so although this documentation says this is how I have to do: https:/
The `change` command complains the same:
(qemu) change fda dos-6-22/
Device 'fda' not found
Is this a bug or me doing something wrong?
I tried using different node names, with always the same result.
=======
I’m posting as an answer, but I’m not strictly sure. I can just say, if I understand correctly, this is a bug.
The answer comes in two parts.
First part, is a stripped down failing invocation:
qemu-
-monitor stdio \
-machine type=isapc,
-blockdev driver=
-blockdev driver=
-global isa-fdc.driveA=fda
(qemu) info block
ide1-cd0: [not inserted]
Attached to: /machine/
Removable device: not locked, tray closed
sd0: [not inserted]
Removable device: not locked, tray closed
fda: fda.img (raw)
Attached to: /machine/
Removable device: not locked, tray closed
Cache mode: writeback
(qemu) eject fda
Device 'fda' not found
Second part, is the same without the last argument `-global isa-fdc.
qemu-
-monitor stdio \
-machine type=isapc,
-blockdev driver=
-blockdev driver=
(qemu) info block
ide1-cd0: [not inserted]
Attached to: /machine/
Removable device: not locked, tray closed
floppy0: [not inserted]
Attached to: /machine/
Removable device: not locked, tray closed
sd0: [not inserted]
Removable device: not locked, tray closed
(qemu) eject floppy0
There is more error when `-global isa-fdc.driveA=fda` is removed. However, the documentation says:
> -global driver=
> Set default value of driver’s property prop to value, e.g.:
> qemu-system-i386 -global ide-hd.
> In particular, you can **use this to set driver properties for devices which are created automatically by the machine model**. To create a device which is not created automatically and set properties on it, use -device.
> -global driver.prop=value is shorthand for -global driver=
What I put a stress on in the quote, suggest I’m not misusing `-global` and that’s most probably a bug.
**Update for more details:**
It seems using `-drive` instead of `-device` and `driveA` assignment, the result is not the same, although RedHat documentation recommands using `-device` instead of `-drive` and QEmu 3.0 documentation says `-drive` is essentially a shortcut for `-device` (“essentially”, not telling about the difference).
Below, two cases, with an except of `info block` and an excerpt of `info qtree`.
With this one, `eject floppy0` works:
qemu-
-monitor stdio \
-machine type=isapc,
-drive format=
-device isa-vga,vgamem_mb=1 \
-serial msmouse
[…]
floppy0 (#block156): fda.img (raw)
Attached to: /machine/
Removable device: not locked, tray closed
Cache mode: writeback
[…]
dev: isa-fdc, id ""
iobase = 1008 (0x3f0)
irq = 6 (0x6)
dma = 2 (0x2)
driveA = ""
driveB = ""
fdtypeA = "auto"
fdtypeB = "auto"
fallback = "288"
isa irq 6
bus: floppy-bus.0
type floppy-bus
dev: floppy, id ""
unit = 0 (0x0)
drive = "floppy0"
With this one, `eject fda` does not work:
qemu-
-monitor stdio \
-machine type=isapc,
-blockdev driver=
-blockdev driver=
-global isa-fdc.driveA=fda \
-device isa-vga,vgamem_mb=1 \
-serial msmouse
[…]
fda: fda.img (raw)
Attached to: /machine/
Removable device: not locked, tray closed
Cache mode: writeback
[…]
dev: isa-fdc, id ""
iobase = 1008 (0x3f0)
irq = 6 (0x6)
dma = 2 (0x2)
driveA = ""
driveB = ""
fdtypeA = "auto"
fdtypeB = "auto"
fallback = "288"
isa irq 6
bus: floppy-bus.0
type floppy-bus
dev: floppy, id ""
unit = 0 (0x0)
drive = "fda"

Hi,
As you yourself say, -drive does work, so this is really not about -drive, but about -blockdev.
-drive creates part of the device as well, so to speak, whereas -blockdev only creates one (or more) nodes in the block layer. You can only eject something from devices, however, so you cannot eject a blockdev. So yes, there is a difference between -drive and -blockdev.
If you want to use eject, you either have to use -drive (which is legacy), or you eject the ID given to -device (because you eject the device). However, you haven't even used -device, but you just used -global (which doesn't allow giving an ID).
As you can see from "info block", there is still a QOM path that you could in theory use, too. So you probably could also "eject /machine/ unattached/ device[ 12]" (in the last example).
In practice, you should probably do this:
$ qemu-system-i386 \ file,node- name=fda- img,filename= fda.img \ raw,node- name=fda, file=fda- img \ id=floppy, drive=fda \
-blockdev driver=
-blockdev driver=
-device floppy,
-monitor stdio
(qemu) info block
[...]
fda: fda.img (raw)
Attached to: floppy
Removable device: not locked, tray closed
Cache mode: writeback
(qemu) eject floppy
Device 'floppy' not found
Oops.
Well, it works with QMP:
{'execute' :'eject' ,'arguments' :{'id': 'floppy' }}
{"return": {}}
So there is indeed a bug, although it's not the one you're reporting. The bug is that HMP's eject does not accept a -device ID (but only a -drive ID).
Max