virtio_blk: fix race at module removal
authorMichael S. Tsirkin <mst@redhat.com>
Sun, 9 Nov 2014 23:04:29 +0000 (09:34 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 11 Nov 2014 06:39:57 +0000 (17:09 +1030)
If a device appears while module is being removed,
driver will get a callback after we've given up
on the major number.

In theory this means this major number can get reused
by something else, resulting in a conflict.

To fix, cleanup in reverse order of initialization.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Ming Lei <ming.lei@canonical.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
drivers/block/virtio_blk.c

index c6a27d54ad620b5ea25ae674d6b9a358b0f312fa..ce848ac1e9a660cfd0a1ba550ee7ebb32cdab1b9 100644 (file)
@@ -871,8 +871,8 @@ out_destroy_workqueue:
 
 static void __exit fini(void)
 {
-       unregister_blkdev(major, "virtblk");
        unregister_virtio_driver(&virtio_blk);
+       unregister_blkdev(major, "virtblk");
        destroy_workqueue(virtblk_wq);
 }
 module_init(init);