提交 af465668 编写于 作者: N Namhyung Kim 提交者: Jens Axboe

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: NNamhyung Kim <namhyung@gmail.com>
Cc: Laurent Vivier <Laurent.Vivier@bull.net>
Cc: stable@kernel.org
Signed-off-by: NJens Axboe <jaxboe@fusionio.com>
上级 315980c8
...@@ -548,7 +548,7 @@ static struct kobject *brd_probe(dev_t dev, int *part, void *data) ...@@ -548,7 +548,7 @@ static struct kobject *brd_probe(dev_t dev, int *part, void *data)
struct kobject *kobj; struct kobject *kobj;
mutex_lock(&brd_devices_mutex); 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); kobj = brd ? get_disk(brd->brd_disk) : ERR_PTR(-ENOMEM);
mutex_unlock(&brd_devices_mutex); mutex_unlock(&brd_devices_mutex);
...@@ -589,10 +589,10 @@ static int __init brd_init(void) ...@@ -589,10 +589,10 @@ static int __init brd_init(void)
if (rd_nr) { if (rd_nr) {
nr = rd_nr; nr = rd_nr;
range = rd_nr; range = rd_nr << part_shift;
} else { } else {
nr = CONFIG_BLK_DEV_RAM_COUNT; nr = CONFIG_BLK_DEV_RAM_COUNT;
range = 1UL << (MINORBITS - part_shift); range = 1UL << MINORBITS;
} }
if (register_blkdev(RAMDISK_MAJOR, "ramdisk")) if (register_blkdev(RAMDISK_MAJOR, "ramdisk"))
...@@ -631,7 +631,7 @@ static void __exit brd_exit(void) ...@@ -631,7 +631,7 @@ static void __exit brd_exit(void)
unsigned long range; unsigned long range;
struct brd_device *brd, *next; 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) list_for_each_entry_safe(brd, next, &brd_devices, brd_list)
brd_del_one(brd); brd_del_one(brd);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册