scsi: fix regression and honor bootindex again for legacy drives
Commit3089637461
("scsi: Don't ignore most usb-storage properties") removed the call to object_property_set_int() and thus the 'set' method for the bootindex property was also not called anymore. Here that method is device_set_bootindex() (as configured by scsi_dev_instance_init() -> device_add_bootindex_property()) which as a side effect registers the device via add_boot_device_path(). As reported by a downstream user [0], the bootindex property did not have the desired effect anymore for legacy drives. Fix the regression by explicitly calling the add_boot_device_path() function after checking that the bootindex is not yet used (to avoid add_boot_device_path() calling exit()). [0]: https://forum.proxmox.com/threads/149772/post-679433 Cc: qemu-stable@nongnu.org Fixes:3089637461
("scsi: Don't ignore most usb-storage properties") Suggested-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> Link: https://lore.kernel.org/r/20240710152529.1737407-1-f.ebner@proxmox.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
a4975023fb
commit
57a8a80d1a
@ -384,6 +384,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
|
|||||||
DeviceState *dev;
|
DeviceState *dev;
|
||||||
SCSIDevice *s;
|
SCSIDevice *s;
|
||||||
DriveInfo *dinfo;
|
DriveInfo *dinfo;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
if (blk_is_sg(blk)) {
|
if (blk_is_sg(blk)) {
|
||||||
driver = "scsi-generic";
|
driver = "scsi-generic";
|
||||||
@ -403,6 +404,14 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
|
|||||||
s = SCSI_DEVICE(dev);
|
s = SCSI_DEVICE(dev);
|
||||||
s->conf = *conf;
|
s->conf = *conf;
|
||||||
|
|
||||||
|
check_boot_index(conf->bootindex, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
object_unparent(OBJECT(dev));
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
add_boot_device_path(conf->bootindex, dev, NULL);
|
||||||
|
|
||||||
qdev_prop_set_uint32(dev, "scsi-id", unit);
|
qdev_prop_set_uint32(dev, "scsi-id", unit);
|
||||||
if (object_property_find(OBJECT(dev), "removable")) {
|
if (object_property_find(OBJECT(dev), "removable")) {
|
||||||
qdev_prop_set_bit(dev, "removable", removable);
|
qdev_prop_set_bit(dev, "removable", removable);
|
||||||
|
Loading…
Reference in New Issue
Block a user