| From af46566885a373b0a526932484cd8fef8de7b598 Mon Sep 17 00:00:00 2001 |
| From: Namhyung Kim <namhyung@gmail.com> |
| Date: Thu, 26 May 2011 21:06:50 +0200 |
| Subject: brd: handle on-demand devices correctly |
| |
| From: Namhyung Kim <namhyung@gmail.com> |
| |
| commit af46566885a373b0a526932484cd8fef8de7b598 upstream. |
| |
| When finding or allocating a ram disk device, brd_probe() did not take |
| partition numbers into account so that it can result to a different |
| device. Consider following example (I set CONFIG_BLK_DEV_RAM_COUNT=4 |
| for simplicity) : |
| |
| $ sudo modprobe brd max_part=15 |
| $ ls -l /dev/ram* |
| brw-rw---- 1 root disk 1, 0 2011-05-25 15:41 /dev/ram0 |
| brw-rw---- 1 root disk 1, 16 2011-05-25 15:41 /dev/ram1 |
| brw-rw---- 1 root disk 1, 32 2011-05-25 15:41 /dev/ram2 |
| brw-rw---- 1 root disk 1, 48 2011-05-25 15:41 /dev/ram3 |
| $ sudo mknod /dev/ram4 b 1 64 |
| $ sudo dd if=/dev/zero of=/dev/ram4 bs=4k count=256 |
| 256+0 records in |
| 256+0 records out |
| 1048576 bytes (1.0 MB) copied, 0.00215578 s, 486 MB/s |
| namhyung@leonhard:linux$ ls -l /dev/ram* |
| brw-rw---- 1 root disk 1, 0 2011-05-25 15:41 /dev/ram0 |
| brw-rw---- 1 root disk 1, 16 2011-05-25 15:41 /dev/ram1 |
| brw-rw---- 1 root disk 1, 32 2011-05-25 15:41 /dev/ram2 |
| brw-rw---- 1 root disk 1, 48 2011-05-25 15:41 /dev/ram3 |
| brw-r--r-- 1 root root 1, 64 2011-05-25 15:45 /dev/ram4 |
| brw-rw---- 1 root disk 1, 1024 2011-05-25 15:44 /dev/ram64 |
| |
| After this patch, /dev/ram4 - instead of /dev/ram64 - was |
| accessed correctly. |
| |
| In addition, 'range' passed to blk_register_region() should |
| include all range of dev_t that RAMDISK_MAJOR can address. |
| It does not need to be limited by partition numbers unless |
| 'rd_nr' param was specified. |
| |
| Signed-off-by: Namhyung Kim <namhyung@gmail.com> |
| Cc: Laurent Vivier <Laurent.Vivier@bull.net> |
| Signed-off-by: Jens Axboe <jaxboe@fusionio.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/block/brd.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/block/brd.c |
| +++ b/drivers/block/brd.c |
| @@ -498,7 +498,7 @@ static struct kobject *brd_probe(dev_t d |
| 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); |
| |
| @@ -539,10 +539,10 @@ static int __init brd_init(void) |
| |
| 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")) |
| @@ -581,7 +581,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); |