static xpram_device_t xpram_devices[XPRAM_MAX_DEVS];
 static unsigned int xpram_sizes[XPRAM_MAX_DEVS];
 static struct gendisk *xpram_disks[XPRAM_MAX_DEVS];
+static struct request_queue *xpram_queues[XPRAM_MAX_DEVS];
 static unsigned int xpram_pages;
 static int xpram_devs;
 
        return 0;
 }
 
-static struct request_queue *xpram_queue;
-
 static int __init xpram_setup_blkdev(void)
 {
        unsigned long offset;
        int i, rc = -ENOMEM;
 
        for (i = 0; i < xpram_devs; i++) {
-               struct gendisk *disk = alloc_disk(1);
-               if (!disk)
+               xpram_disks[i] = alloc_disk(1);
+               if (!xpram_disks[i])
+                       goto out;
+               xpram_queues[i] = blk_alloc_queue(GFP_KERNEL);
+               if (!xpram_queues[i]) {
+                       put_disk(xpram_disks[i]);
                        goto out;
-               xpram_disks[i] = disk;
+               }
+               blk_queue_make_request(xpram_queues[i], xpram_make_request);
+               blk_queue_hardsect_size(xpram_queues[i], 4096);
        }
 
        /*
        if (rc < 0)
                goto out;
 
-       /*
-        * Assign the other needed values: make request function, sizes and
-        * hardsect size. All the minor devices feature the same value.
-        */
-       xpram_queue = blk_alloc_queue(GFP_KERNEL);
-       if (!xpram_queue) {
-               rc = -ENOMEM;
-               goto out_unreg;
-       }
-       blk_queue_make_request(xpram_queue, xpram_make_request);
-       blk_queue_hardsect_size(xpram_queue, 4096);
-
        /*
         * Setup device structures.
         */
                disk->first_minor = i;
                disk->fops = &xpram_devops;
                disk->private_data = &xpram_devices[i];
-               disk->queue = xpram_queue;
+               disk->queue = xpram_queues[i];
                sprintf(disk->disk_name, "slram%d", i);
                set_capacity(disk, xpram_sizes[i] << 1);
                add_disk(disk);
        }
 
        return 0;
-out_unreg:
-       unregister_blkdev(XPRAM_MAJOR, XPRAM_NAME);
 out:
-       while (i--)
+       while (i--) {
+               blk_cleanup_queue(xpram_queues[i]);
                put_disk(xpram_disks[i]);
+       }
        return rc;
 }
 
        int i;
        for (i = 0; i < xpram_devs; i++) {
                del_gendisk(xpram_disks[i]);
+               blk_cleanup_queue(xpram_queues[i]);
                put_disk(xpram_disks[i]);
        }
        unregister_blkdev(XPRAM_MAJOR, XPRAM_NAME);
-       blk_cleanup_queue(xpram_queue);
 }
 
 static int __init xpram_init(void)