]> Pileus Git - ~andy/linux/blobdiff - drivers/block/brd.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
[~andy/linux] / drivers / block / brd.c
index b7f51e4594f8660f0a54472d264d957dbe533312..dba1c32e1ddfc48229d93d014fedaa9c370e92e3 100644 (file)
  */
 struct brd_device {
        int             brd_number;
-       int             brd_refcnt;
-       loff_t          brd_offset;
-       loff_t          brd_sizelimit;
-       unsigned        brd_blocksize;
 
        struct request_queue    *brd_queue;
        struct gendisk          *brd_disk;
@@ -440,11 +436,11 @@ static int rd_nr;
 int rd_size = CONFIG_BLK_DEV_RAM_SIZE;
 static int max_part;
 static int part_shift;
-module_param(rd_nr, int, 0);
+module_param(rd_nr, int, S_IRUGO);
 MODULE_PARM_DESC(rd_nr, "Maximum number of brd devices");
-module_param(rd_size, int, 0);
+module_param(rd_size, int, S_IRUGO);
 MODULE_PARM_DESC(rd_size, "Size of each RAM disk in kbytes.");
-module_param(max_part, int, 0);
+module_param(max_part, int, S_IRUGO);
 MODULE_PARM_DESC(max_part, "Maximum number of partitions per RAM disk");
 MODULE_LICENSE("GPL");
 MODULE_ALIAS_BLOCKDEV_MAJOR(RAMDISK_MAJOR);
@@ -552,7 +548,7 @@ static struct kobject *brd_probe(dev_t dev, int *part, void *data)
        struct kobject *kobj;
 
        mutex_lock(&brd_devices_mutex);
-       brd = brd_init_one(dev & MINORMASK);
+       brd = brd_init_one(MINOR(dev) >> part_shift);
        kobj = brd ? get_disk(brd->brd_disk) : ERR_PTR(-ENOMEM);
        mutex_unlock(&brd_devices_mutex);
 
@@ -575,25 +571,39 @@ static int __init brd_init(void)
         *
         * (1) if rd_nr is specified, create that many upfront, and this
         *     also becomes a hard limit.
-        * (2) if rd_nr is not specified, create 1 rd device on module
-        *     load, user can further extend brd device by create dev node
-        *     themselves and have kernel automatically instantiate actual
-        *     device on-demand.
+        * (2) if rd_nr is not specified, create CONFIG_BLK_DEV_RAM_COUNT
+        *     (default 16) rd device on module load, user can further
+        *     extend brd device by create dev node themselves and have
+        *     kernel automatically instantiate actual device on-demand.
         */
 
        part_shift = 0;
-       if (max_part > 0)
+       if (max_part > 0) {
                part_shift = fls(max_part);
 
+               /*
+                * Adjust max_part according to part_shift as it is exported
+                * to user space so that user can decide correct minor number
+                * if [s]he want to create more devices.
+                *
+                * Note that -1 is required because partition 0 is reserved
+                * for the whole disk.
+                */
+               max_part = (1UL << part_shift) - 1;
+       }
+
+       if ((1UL << part_shift) > DISK_MAX_PARTS)
+               return -EINVAL;
+
        if (rd_nr > 1UL << (MINORBITS - part_shift))
                return -EINVAL;
 
        if (rd_nr) {
                nr = rd_nr;
-               range = rd_nr;
+               range = rd_nr << part_shift;
        } else {
                nr = CONFIG_BLK_DEV_RAM_COUNT;
-               range = 1UL << (MINORBITS - part_shift);
+               range = 1UL << MINORBITS;
        }
 
        if (register_blkdev(RAMDISK_MAJOR, "ramdisk"))
@@ -632,7 +642,7 @@ static void __exit brd_exit(void)
        unsigned long range;
        struct brd_device *brd, *next;
 
-       range = rd_nr ? rd_nr :  1UL << (MINORBITS - part_shift);
+       range = rd_nr ? rd_nr << part_shift : 1UL << MINORBITS;
 
        list_for_each_entry_safe(brd, next, &brd_devices, brd_list)
                brd_del_one(brd);