virtio: meet virtio spec by finalizing features before using device
authorRusty Russell <rusty@rustcorp.com.au>
Sat, 13 Jun 2009 04:16:35 +0000 (22:16 -0600)
committerRusty Russell <rusty@rustcorp.com.au>
Fri, 12 Jun 2009 12:46:35 +0000 (22:16 +0930)
Virtio devices are supposed to negotiate features before they start using
the device, but the current code doesn't do this.  This is because the
driver's probe() function invariably has to add buffers to a virtqueue,
or probe the disk (virtio_blk).

This currently doesn't matter since no existing backend is strict about
the feature negotiation.  But it's possible to imagine a future feature
which completely changes how a device operates: in this case, we'd need
to acknowledge it before using the device.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
drivers/virtio/virtio.c

index 018c070a357f8138852a41fe4ec46d8cc4cf2f98..6b6810364860c858f62a778953b5e1399dfc6103 100644 (file)
@@ -118,13 +118,14 @@ static int virtio_dev_probe(struct device *_d)
                if (device_features & (1 << i))
                        set_bit(i, dev->features);
 
+       dev->config->finalize_features(dev);
+
        err = drv->probe(dev);
        if (err)
                add_status(dev, VIRTIO_CONFIG_S_FAILED);
-       else {
-               dev->config->finalize_features(dev);
+       else
                add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
-       }
+
        return err;
 }