Commit ce15408f350c4b97635618692a45aedabfdd2696
1 parent
b6098c3042
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
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>
Showing 1 changed file with 13 additions and 3 deletions Side-by-side Diff
drivers/s390/kvm/virtio_ccw.c
... | ... | @@ -733,6 +733,9 @@ |
733 | 733 | |
734 | 734 | rc = le32_to_cpu(features->features); |
735 | 735 | |
736 | + if (vcdev->revision == 0) | |
737 | + goto out_free; | |
738 | + | |
736 | 739 | /* Read second half of the feature bits from the host. */ |
737 | 740 | features->index = 1; |
738 | 741 | ccw->cmd_code = CCW_CMD_READ_FEAT; |
... | ... | @@ -775,6 +778,9 @@ |
775 | 778 | ccw->cda = (__u32)(unsigned long)features; |
776 | 779 | ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_WRITE_FEAT); |
777 | 780 | |
781 | + if (vcdev->revision == 0) | |
782 | + goto out_free; | |
783 | + | |
778 | 784 | features->index = 1; |
779 | 785 | features->features = cpu_to_le32(vdev->features >> 32); |
780 | 786 | /* Write the second half of the feature bits to the host. */ |
... | ... | @@ -1182,9 +1188,13 @@ |
1182 | 1188 | vcdev->vdev.id.vendor = cdev->id.cu_type; |
1183 | 1189 | vcdev->vdev.id.device = cdev->id.cu_model; |
1184 | 1190 | |
1185 | - ret = virtio_ccw_set_transport_rev(vcdev); | |
1186 | - if (ret) | |
1187 | - goto out_free; | |
1191 | + if (virtio_device_is_legacy_only(vcdev->vdev.id)) { | |
1192 | + vcdev->revision = 0; | |
1193 | + } else { | |
1194 | + ret = virtio_ccw_set_transport_rev(vcdev); | |
1195 | + if (ret) | |
1196 | + goto out_free; | |
1197 | + } | |
1188 | 1198 | |
1189 | 1199 | ret = register_virtio_device(&vcdev->vdev); |
1190 | 1200 | if (ret) { |