On 22 June 2015 at 10:59, Markus Armbruster <arm...@redhat.com> wrote: > What about this instead: > > 1. When -device creation connects a qdev_prop_drive property to a > backend, fail when the backend has a DriveInfo and the DriveInfo has > type != IF_NONE. Note: the connection is made in parse_drive(). > > 2. This breaks -drive if=virtio and possibly more. That's because for > if=virtio, we create input for -device creation that asks to connect > this IF_VIRTIO drive. To unbreak it, mark the DriveInfo when we create > such input, and make parse_drive() accept backends so marked. To find > the places that need to mark, examine users of option group "device". A > quick, sloppy grep shows a bit over a dozen candidates. Not too bad.
It looks like we missed a bunch of places that need changing, because we don't only go through parse_drive() for connections made by user -device creation and places where the code has added something to the "device" option group. For instance, if=scsi auto-plugin for x86 pc will end up calling qdev_prop_set_drive() from scsi_bus_legacy_add_drive(), which then goes through parse_drive(). There are 17 places that call qdev_prop_set_drive(); we could change them all, but that's the sort of invasive change I was hoping to avoid with my initial blk_by_legacy_dinfo change... (I think currently all callers of qdev_prop_set_drive{,_nofail}() are using it to connect legacy drives, except for hw/usb/dev-storage.c, which is calling drive_new() to create an if=none drive and then wiring it up to the device with qdev_prop_set_drive(). This feels like a fragile assumption for the future, though.) thanks -- PMM