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);
|
VirtIOBlkS390 *dev = VIRTIO_BLK_S390(s390_dev);
|
||||||
DeviceState *vdev = DEVICE(&dev->vdev);
|
DeviceState *vdev = DEVICE(&dev->vdev);
|
||||||
virtio_blk_set_conf(vdev, &(dev->blk));
|
|
||||||
qdev_set_parent_bus(vdev, BUS(&s390_dev->bus));
|
qdev_set_parent_bus(vdev, BUS(&s390_dev->bus));
|
||||||
if (qdev_init(vdev) < 0) {
|
if (qdev_init(vdev) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -180,6 +179,7 @@ static void s390_virtio_blk_instance_init(Object *obj)
|
|||||||
VirtIOBlkS390 *dev = VIRTIO_BLK_S390(obj);
|
VirtIOBlkS390 *dev = VIRTIO_BLK_S390(obj);
|
||||||
object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
|
object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
|
||||||
object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
|
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)
|
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,
|
.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)
|
static void s390_virtio_blk_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
|
||||||
VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);
|
VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);
|
||||||
|
|
||||||
k->init = s390_virtio_blk_init;
|
k->init = s390_virtio_blk_init;
|
||||||
dc->props = s390_virtio_blk_properties;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo s390_virtio_blk = {
|
static const TypeInfo s390_virtio_blk = {
|
||||||
|
@ -124,7 +124,6 @@ void s390_virtio_reset_idx(VirtIOS390Device *dev);
|
|||||||
typedef struct VirtIOBlkS390 {
|
typedef struct VirtIOBlkS390 {
|
||||||
VirtIOS390Device parent_obj;
|
VirtIOS390Device parent_obj;
|
||||||
VirtIOBlock vdev;
|
VirtIOBlock vdev;
|
||||||
VirtIOBlkConf blk;
|
|
||||||
} VirtIOBlkS390;
|
} VirtIOBlkS390;
|
||||||
|
|
||||||
/* virtio-scsi-s390 */
|
/* virtio-scsi-s390 */
|
||||||
|
@ -800,7 +800,6 @@ static int virtio_ccw_blk_init(VirtioCcwDevice *ccw_dev)
|
|||||||
{
|
{
|
||||||
VirtIOBlkCcw *dev = VIRTIO_BLK_CCW(ccw_dev);
|
VirtIOBlkCcw *dev = VIRTIO_BLK_CCW(ccw_dev);
|
||||||
DeviceState *vdev = DEVICE(&dev->vdev);
|
DeviceState *vdev = DEVICE(&dev->vdev);
|
||||||
virtio_blk_set_conf(vdev, &(dev->blk));
|
|
||||||
qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus));
|
qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus));
|
||||||
if (qdev_init(vdev) < 0) {
|
if (qdev_init(vdev) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -814,6 +813,7 @@ static void virtio_ccw_blk_instance_init(Object *obj)
|
|||||||
VirtIOBlkCcw *dev = VIRTIO_BLK_CCW(obj);
|
VirtIOBlkCcw *dev = VIRTIO_BLK_CCW(obj);
|
||||||
object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
|
object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
|
||||||
object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
|
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)
|
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[] = {
|
static Property virtio_ccw_blk_properties[] = {
|
||||||
DEFINE_PROP_STRING("devno", VirtioCcwDevice, bus_id),
|
DEFINE_PROP_STRING("devno", VirtioCcwDevice, bus_id),
|
||||||
DEFINE_VIRTIO_BLK_FEATURES(VirtioCcwDevice, host_features[0]),
|
DEFINE_VIRTIO_BLK_FEATURES(VirtioCcwDevice, host_features[0]),
|
||||||
DEFINE_VIRTIO_BLK_PROPERTIES(VirtIOBlkCcw, blk),
|
|
||||||
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
||||||
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
@ -144,7 +144,6 @@ typedef struct VHostSCSICcw {
|
|||||||
typedef struct VirtIOBlkCcw {
|
typedef struct VirtIOBlkCcw {
|
||||||
VirtioCcwDevice parent_obj;
|
VirtioCcwDevice parent_obj;
|
||||||
VirtIOBlock vdev;
|
VirtIOBlock vdev;
|
||||||
VirtIOBlkConf blk;
|
|
||||||
} VirtIOBlkCcw;
|
} VirtIOBlkCcw;
|
||||||
|
|
||||||
/* virtio-balloon-ccw */
|
/* virtio-balloon-ccw */
|
||||||
|
@ -1067,7 +1067,6 @@ static Property virtio_blk_pci_properties[] = {
|
|||||||
VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
|
VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
|
||||||
DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
|
DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
|
||||||
DEFINE_VIRTIO_BLK_FEATURES(VirtIOPCIProxy, host_features),
|
DEFINE_VIRTIO_BLK_FEATURES(VirtIOPCIProxy, host_features),
|
||||||
DEFINE_VIRTIO_BLK_PROPERTIES(VirtIOBlkPCI, blk),
|
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
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);
|
VirtIOBlkPCI *dev = VIRTIO_BLK_PCI(vpci_dev);
|
||||||
DeviceState *vdev = DEVICE(&dev->vdev);
|
DeviceState *vdev = DEVICE(&dev->vdev);
|
||||||
virtio_blk_set_conf(vdev, &(dev->blk));
|
|
||||||
qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus));
|
qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus));
|
||||||
if (qdev_init(vdev) < 0) {
|
if (qdev_init(vdev) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -1103,6 +1101,7 @@ static void virtio_blk_pci_instance_init(Object *obj)
|
|||||||
VirtIOBlkPCI *dev = VIRTIO_BLK_PCI(obj);
|
VirtIOBlkPCI *dev = VIRTIO_BLK_PCI(obj);
|
||||||
object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
|
object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
|
||||||
object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
|
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 = {
|
static const TypeInfo virtio_blk_pci_info = {
|
||||||
|
@ -131,7 +131,6 @@ struct VHostSCSIPCI {
|
|||||||
struct VirtIOBlkPCI {
|
struct VirtIOBlkPCI {
|
||||||
VirtIOPCIProxy parent_obj;
|
VirtIOPCIProxy parent_obj;
|
||||||
VirtIOBlock vdev;
|
VirtIOBlock vdev;
|
||||||
VirtIOBlkConf blk;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user