virtio_ccw: legacy: don't negotiate rev 1/features
Legacy balloon device doesn't pretend to support revision 1 or 64 bit features. But just in case someone implements a broken one that does, let's not even try to drive legacy only devices using revision 1, and let's not give them a chance to say they support VIRTIO_F_VERSION_1 by not reading or writing high feature bits. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
parent
b6098c3042
commit
ce15408f35
|
@ -733,6 +733,9 @@ static u64 virtio_ccw_get_features(struct virtio_device *vdev)
|
||||||
|
|
||||||
rc = le32_to_cpu(features->features);
|
rc = le32_to_cpu(features->features);
|
||||||
|
|
||||||
|
if (vcdev->revision == 0)
|
||||||
|
goto out_free;
|
||||||
|
|
||||||
/* Read second half of the feature bits from the host. */
|
/* Read second half of the feature bits from the host. */
|
||||||
features->index = 1;
|
features->index = 1;
|
||||||
ccw->cmd_code = CCW_CMD_READ_FEAT;
|
ccw->cmd_code = CCW_CMD_READ_FEAT;
|
||||||
|
@ -775,6 +778,9 @@ static void virtio_ccw_finalize_features(struct virtio_device *vdev)
|
||||||
ccw->cda = (__u32)(unsigned long)features;
|
ccw->cda = (__u32)(unsigned long)features;
|
||||||
ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_WRITE_FEAT);
|
ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_WRITE_FEAT);
|
||||||
|
|
||||||
|
if (vcdev->revision == 0)
|
||||||
|
goto out_free;
|
||||||
|
|
||||||
features->index = 1;
|
features->index = 1;
|
||||||
features->features = cpu_to_le32(vdev->features >> 32);
|
features->features = cpu_to_le32(vdev->features >> 32);
|
||||||
/* Write the second half of the feature bits to the host. */
|
/* Write the second half of the feature bits to the host. */
|
||||||
|
@ -1182,9 +1188,13 @@ static int virtio_ccw_online(struct ccw_device *cdev)
|
||||||
vcdev->vdev.id.vendor = cdev->id.cu_type;
|
vcdev->vdev.id.vendor = cdev->id.cu_type;
|
||||||
vcdev->vdev.id.device = cdev->id.cu_model;
|
vcdev->vdev.id.device = cdev->id.cu_model;
|
||||||
|
|
||||||
ret = virtio_ccw_set_transport_rev(vcdev);
|
if (virtio_device_is_legacy_only(vcdev->vdev.id)) {
|
||||||
if (ret)
|
vcdev->revision = 0;
|
||||||
goto out_free;
|
} else {
|
||||||
|
ret = virtio_ccw_set_transport_rev(vcdev);
|
||||||
|
if (ret)
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
ret = register_virtio_device(&vcdev->vdev);
|
ret = register_virtio_device(&vcdev->vdev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
Loading…
Reference in New Issue