virtio-blk: use aliases instead of duplicate qdev properties
virtio-blk-pci, virtio-blk-s390, and virtio-blk-ccw all duplicate the qdev properties of their VirtIOBlock child. This approach does not work well with string or pointer properties since we must be careful about leaking or double-freeing them. Use the QOM alias property to forward property accesses to the VirtIOBlock child. This way no duplication is necessary. Remember to stop calling virtio_blk_set_conf() so that we don't clobber the values already set on the VirtIOBlock instance. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
This commit is contained in:
parent
67cc7e0aac
commit
caffdac363
@ -167,7 +167,6 @@ static int s390_virtio_blk_init(VirtIOS390Device *s390_dev)
|
||||
{
|
||||
VirtIOBlkS390 *dev = VIRTIO_BLK_S390(s390_dev);
|
||||
DeviceState *vdev = DEVICE(&dev->vdev);
|
||||
virtio_blk_set_conf(vdev, &(dev->blk));
|
||||
qdev_set_parent_bus(vdev, BUS(&s390_dev->bus));
|
||||
if (qdev_init(vdev) < 0) {
|
||||
return -1;
|
||||
@ -180,6 +179,7 @@ static void s390_virtio_blk_instance_init(Object *obj)
|
||||
VirtIOBlkS390 *dev = VIRTIO_BLK_S390(obj);
|
||||
object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
|
||||
object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
|
||||
qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
|
||||
}
|
||||
|
||||
static int s390_virtio_serial_init(VirtIOS390Device *s390_dev)
|
||||
@ -513,18 +513,11 @@ static const TypeInfo s390_virtio_net = {
|
||||
.class_init = s390_virtio_net_class_init,
|
||||
};
|
||||
|
||||
static Property s390_virtio_blk_properties[] = {
|
||||
DEFINE_VIRTIO_BLK_PROPERTIES(VirtIOBlkS390, blk),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static void s390_virtio_blk_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);
|
||||
|
||||
k->init = s390_virtio_blk_init;
|
||||
dc->props = s390_virtio_blk_properties;
|
||||
}
|
||||
|
||||
static const TypeInfo s390_virtio_blk = {
|
||||
|
@ -124,7 +124,6 @@ void s390_virtio_reset_idx(VirtIOS390Device *dev);
|
||||
typedef struct VirtIOBlkS390 {
|
||||
VirtIOS390Device parent_obj;
|
||||
VirtIOBlock vdev;
|
||||
VirtIOBlkConf blk;
|
||||
} VirtIOBlkS390;
|
||||
|
||||
/* virtio-scsi-s390 */
|
||||
|
@ -800,7 +800,6 @@ static int virtio_ccw_blk_init(VirtioCcwDevice *ccw_dev)
|
||||
{
|
||||
VirtIOBlkCcw *dev = VIRTIO_BLK_CCW(ccw_dev);
|
||||
DeviceState *vdev = DEVICE(&dev->vdev);
|
||||
virtio_blk_set_conf(vdev, &(dev->blk));
|
||||
qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus));
|
||||
if (qdev_init(vdev) < 0) {
|
||||
return -1;
|
||||
@ -814,6 +813,7 @@ static void virtio_ccw_blk_instance_init(Object *obj)
|
||||
VirtIOBlkCcw *dev = VIRTIO_BLK_CCW(obj);
|
||||
object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
|
||||
object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
|
||||
qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
|
||||
}
|
||||
|
||||
static int virtio_ccw_serial_init(VirtioCcwDevice *ccw_dev)
|
||||
@ -1400,7 +1400,6 @@ static const TypeInfo virtio_ccw_net = {
|
||||
static Property virtio_ccw_blk_properties[] = {
|
||||
DEFINE_PROP_STRING("devno", VirtioCcwDevice, bus_id),
|
||||
DEFINE_VIRTIO_BLK_FEATURES(VirtioCcwDevice, host_features[0]),
|
||||
DEFINE_VIRTIO_BLK_PROPERTIES(VirtIOBlkCcw, blk),
|
||||
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
||||
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
|
@ -144,7 +144,6 @@ typedef struct VHostSCSICcw {
|
||||
typedef struct VirtIOBlkCcw {
|
||||
VirtioCcwDevice parent_obj;
|
||||
VirtIOBlock vdev;
|
||||
VirtIOBlkConf blk;
|
||||
} VirtIOBlkCcw;
|
||||
|
||||
/* virtio-balloon-ccw */
|
||||
|
@ -1067,7 +1067,6 @@ static Property virtio_blk_pci_properties[] = {
|
||||
VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
|
||||
DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
|
||||
DEFINE_VIRTIO_BLK_FEATURES(VirtIOPCIProxy, host_features),
|
||||
DEFINE_VIRTIO_BLK_PROPERTIES(VirtIOBlkPCI, blk),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
@ -1075,7 +1074,6 @@ static int virtio_blk_pci_init(VirtIOPCIProxy *vpci_dev)
|
||||
{
|
||||
VirtIOBlkPCI *dev = VIRTIO_BLK_PCI(vpci_dev);
|
||||
DeviceState *vdev = DEVICE(&dev->vdev);
|
||||
virtio_blk_set_conf(vdev, &(dev->blk));
|
||||
qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus));
|
||||
if (qdev_init(vdev) < 0) {
|
||||
return -1;
|
||||
@ -1103,6 +1101,7 @@ static void virtio_blk_pci_instance_init(Object *obj)
|
||||
VirtIOBlkPCI *dev = VIRTIO_BLK_PCI(obj);
|
||||
object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
|
||||
object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
|
||||
qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
|
||||
}
|
||||
|
||||
static const TypeInfo virtio_blk_pci_info = {
|
||||
|
@ -131,7 +131,6 @@ struct VHostSCSIPCI {
|
||||
struct VirtIOBlkPCI {
|
||||
VirtIOPCIProxy parent_obj;
|
||||
VirtIOBlock vdev;
|
||||
VirtIOBlkConf blk;
|
||||
};
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user