brd: handle on-demand devices correctly
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> Cc: stable@kernel.org Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
This commit is contained in:
parent
315980c868
commit
af46566885
|
@ -548,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);
|
||||
|
||||
|
@ -589,10 +589,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"))
|
||||
|
@ -631,7 +631,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);
|
||||
|
|
Loading…
Reference in New Issue