virtio: Add transport feature handling stub for virtio_ring.

To prepare for virtio_ring transport feature bits, hook in a call in
all the users to manipulate them.  This currently just clears all the
bits, since it doesn't understand any features.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
---
 drivers/lguest/lguest_device.c |    3 +++
 drivers/s390/kvm/kvm_virtio.c  |    3 +++
 drivers/virtio/virtio_pci.c    |    3 +++
 drivers/virtio/virtio_ring.c   |   15 +++++++++++++++
 include/linux/virtio_ring.h    |    2 ++
 5 files changed, 26 insertions(+)

diff -r 62fdb62bd7ae drivers/lguest/lguest_device.c
--- a/drivers/lguest/lguest_device.c	Thu Jun 26 01:32:45 2008 +1000
+++ b/drivers/lguest/lguest_device.c	Thu Jun 26 01:33:05 2008 +1000
@@ -104,6 +104,9 @@ static void lg_finalize_features(struct 
 	struct lguest_device_desc *desc = to_lgdev(vdev)->desc;
 	/* Second half of bitmap is features we accept. */
 	u8 *out_features = lg_features(desc) + desc->feature_len;
+
+	/* Give virtio_ring a chance to accept features. */
+	vring_transport_features(vdev);
 
 	memset(out_features, 0, desc->feature_len);
 	bits = min_t(unsigned, desc->feature_len, sizeof(vdev->features)) * 8;
diff -r 62fdb62bd7ae drivers/s390/kvm/kvm_virtio.c
--- a/drivers/s390/kvm/kvm_virtio.c	Thu Jun 26 01:32:45 2008 +1000
+++ b/drivers/s390/kvm/kvm_virtio.c	Thu Jun 26 01:33:05 2008 +1000
@@ -94,6 +94,9 @@ static void kvm_finalize_features(struct
 	struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
 	/* Second half of bitmap is features we accept. */
 	u8 *out_features = kvm_vq_features(desc) + desc->feature_len;
+
+	/* Give virtio_ring a chance to accept features. */
+	vring_transport_features(vdev);
 
 	memset(out_features, 0, desc->feature_len);
 	bits = min_t(unsigned, desc->feature_len, sizeof(vdev->features)) * 8;
diff -r 62fdb62bd7ae drivers/virtio/virtio_pci.c
--- a/drivers/virtio/virtio_pci.c	Thu Jun 26 01:32:45 2008 +1000
+++ b/drivers/virtio/virtio_pci.c	Thu Jun 26 01:33:05 2008 +1000
@@ -98,6 +98,9 @@ static void vp_finalize_features(struct 
 static void vp_finalize_features(struct virtio_device *vdev)
 {
 	struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+
+	/* Give virtio_ring a chance to accept features. */
+	vring_transport_features(vdev);
 
 	/* We only support 32 feature bits. */
 	BUILD_BUG_ON(ARRAY_SIZE(vdev->features) != 1);
diff -r 62fdb62bd7ae drivers/virtio/virtio_ring.c
--- a/drivers/virtio/virtio_ring.c	Thu Jun 26 01:32:45 2008 +1000
+++ b/drivers/virtio/virtio_ring.c	Thu Jun 26 01:33:05 2008 +1000
@@ -323,4 +323,19 @@ void vring_del_virtqueue(struct virtqueu
 }
 EXPORT_SYMBOL_GPL(vring_del_virtqueue);
 
+/* Manipulates transport-specific feature bits. */
+void vring_transport_features(struct virtio_device *vdev)
+{
+	unsigned int i;
+
+	for (i = VIRTIO_TRANSPORT_F_START; i < VIRTIO_TRANSPORT_F_END; i++) {
+		switch (i) {
+		default:
+			/* We don't understand this bit. */
+			clear_bit(i, vdev->features);
+		}
+	}
+}
+EXPORT_SYMBOL_GPL(vring_transport_features);
+
 MODULE_LICENSE("GPL");
diff -r 62fdb62bd7ae include/linux/virtio_ring.h
--- a/include/linux/virtio_ring.h	Thu Jun 26 01:32:45 2008 +1000
+++ b/include/linux/virtio_ring.h	Thu Jun 26 01:33:05 2008 +1000
@@ -120,6 +120,8 @@ struct virtqueue *vring_new_virtqueue(un
 				      void (*notify)(struct virtqueue *vq),
 				      void (*callback)(struct virtqueue *vq));
 void vring_del_virtqueue(struct virtqueue *vq);
+/* Filter out transport-specific feature bits. */
+void vring_transport_features(struct virtio_device *vdev);
 
 irqreturn_t vring_interrupt(int irq, void *_vq);
 #endif /* __KERNEL__ */
