loop: handle on-demand devices correctly
[linux-flexiantxendom0-natty.git] / drivers / block / loop.c
index 8684c72..f49e43f 100644 (file)
@@ -1674,7 +1674,7 @@ static struct kobject *loop_probe(dev_t dev, int *part, void *data)
        struct kobject *kobj;
 
        mutex_lock(&loop_devices_mutex);
-       lo = loop_init_one(dev & MINORMASK);
+       lo = loop_init_one(MINOR(dev) >> part_shift);
        kobj = lo ? get_disk(lo->lo_disk) : ERR_PTR(-ENOMEM);
        mutex_unlock(&loop_devices_mutex);
 
@@ -1715,10 +1715,10 @@ static int __init loop_init(void)
 
        if (max_loop) {
                nr = max_loop;
-               range = max_loop;
+               range = max_loop << part_shift;
        } else {
                nr = 8;
-               range = 1UL << (MINORBITS - part_shift);
+               range = 1UL << MINORBITS;
        }
 
        if (register_blkdev(LOOP_MAJOR, "loop"))
@@ -1757,7 +1757,7 @@ static void __exit loop_exit(void)
        unsigned long range;
        struct loop_device *lo, *next;
 
-       range = max_loop ? max_loop :  1UL << (MINORBITS - part_shift);
+       range = max_loop ? max_loop << part_shift : 1UL << MINORBITS;
 
        list_for_each_entry_safe(lo, next, &loop_devices, lo_list)
                loop_del_one(lo);