Commit 237242bddc99041e15a4ca51b8439657cadaff17

Authored by Cornelia Huck
Committed by Rusty Russell
1 parent f6a79af8f3

virtio: Don't access index after unregister.

Virtio wants to release used indices after the corresponding
virtio device has been unregistered. However, virtio does not
hold an extra reference, giving up its last reference with
device_unregister(), making accessing dev->index afterwards
invalid.

I actually saw problems when testing my (not-yet-merged)
virtio-ccw code:

- device_add virtio-net,id=xxx
-> creates device virtio<n> with n>0

- device_del xxx
-> deletes virtio<n>, but calls ida_simple_remove with an
   index of 0

- device_add virtio-net,id=xxx
-> tries to add virtio0, which is still in use...

So let's save the index we want to release before calling
device_unregister().

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Acked-by: Sjur Brændeland <sjur.brandeland@stericsson.com>
Cc: stable@kernel.org
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

Showing 1 changed file with 3 additions and 1 deletions Side-by-side Diff

drivers/virtio/virtio.c
... ... @@ -225,8 +225,10 @@
225 225  
226 226 void unregister_virtio_device(struct virtio_device *dev)
227 227 {
  228 + int index = dev->index; /* save for after device release */
  229 +
228 230 device_unregister(&dev->dev);
229   - ida_simple_remove(&virtio_index_ida, dev->index);
  231 + ida_simple_remove(&virtio_index_ida, index);
230 232 }
231 233 EXPORT_SYMBOL_GPL(unregister_virtio_device);
232 234