aboutsummaryrefslogtreecommitdiffstats
path: root/block/ioctl.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2008-09-03 03:01:48 -0400
committerJens Axboe <jens.axboe@oracle.com>2008-10-09 02:56:05 -0400
commitf331c0296f2a9fee0d396a70598b954062603015 (patch)
treef74c467d58940131d97d90c4ea549843185e6ef0 /block/ioctl.c
parentcf771cb5a7b716f3f9e532fd42a1e3a0a75adec5 (diff)
block: don't depend on consecutive minor space
* Implement disk_devt() and part_devt() and use them to directly access devt instead of computing it from ->major and ->first_minor. Note that all references to ->major and ->first_minor outside of block layer is used to determine devt of the disk (the part0) and as ->major and ->first_minor will continue to represent devt for the disk, converting these users aren't strictly necessary. However, convert them for consistency. * Implement disk_max_parts() to avoid directly deferencing genhd->minors. * Update bdget_disk() such that it doesn't assume consecutive minor space. * Move devt computation from register_disk() to add_disk() and make it the only one (all other usages use the initially determined value). These changes clean up the code and will help disk->part dereference fix and extended block device numbers. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block/ioctl.c')
-rw-r--r--block/ioctl.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/block/ioctl.c b/block/ioctl.c
index d77f5e280a6e..403f7d7e0c28 100644
--- a/block/ioctl.c
+++ b/block/ioctl.c
@@ -29,7 +29,7 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
29 if (bdev != bdev->bd_contains) 29 if (bdev != bdev->bd_contains)
30 return -EINVAL; 30 return -EINVAL;
31 partno = p.pno; 31 partno = p.pno;
32 if (partno <= 0 || partno >= disk->minors) 32 if (partno <= 0 || partno > disk_max_parts(disk))
33 return -EINVAL; 33 return -EINVAL;
34 switch (a.op) { 34 switch (a.op) {
35 case BLKPG_ADD_PARTITION: 35 case BLKPG_ADD_PARTITION:
@@ -47,7 +47,7 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
47 mutex_lock(&bdev->bd_mutex); 47 mutex_lock(&bdev->bd_mutex);
48 48
49 /* overlap? */ 49 /* overlap? */
50 for (i = 0; i < disk->minors - 1; i++) { 50 for (i = 0; i < disk_max_parts(disk); i++) {
51 struct hd_struct *s = disk->part[i]; 51 struct hd_struct *s = disk->part[i];
52 52
53 if (!s) 53 if (!s)
@@ -96,7 +96,7 @@ static int blkdev_reread_part(struct block_device *bdev)
96 struct gendisk *disk = bdev->bd_disk; 96 struct gendisk *disk = bdev->bd_disk;
97 int res; 97 int res;
98 98
99 if (disk->minors == 1 || bdev != bdev->bd_contains) 99 if (!disk_max_parts(disk) || bdev != bdev->bd_contains)
100 return -EINVAL; 100 return -EINVAL;
101 if (!capable(CAP_SYS_ADMIN)) 101 if (!capable(CAP_SYS_ADMIN))
102 return -EACCES; 102 return -EACCES;