diff options
author | Tejun Heo <tj@kernel.org> | 2008-09-03 03:01:48 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2008-10-09 02:56:05 -0400 |
commit | f331c0296f2a9fee0d396a70598b954062603015 (patch) | |
tree | f74c467d58940131d97d90c4ea549843185e6ef0 /drivers/md/dm.c | |
parent | cf771cb5a7b716f3f9e532fd42a1e3a0a75adec5 (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 'drivers/md/dm.c')
-rw-r--r-- | drivers/md/dm.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index ace998ce59f6..a78caad29996 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -1146,7 +1146,7 @@ static void unlock_fs(struct mapped_device *md); | |||
1146 | 1146 | ||
1147 | static void free_dev(struct mapped_device *md) | 1147 | static void free_dev(struct mapped_device *md) |
1148 | { | 1148 | { |
1149 | int minor = md->disk->first_minor; | 1149 | int minor = MINOR(disk_devt(md->disk)); |
1150 | 1150 | ||
1151 | if (md->suspended_bdev) { | 1151 | if (md->suspended_bdev) { |
1152 | unlock_fs(md); | 1152 | unlock_fs(md); |
@@ -1267,7 +1267,7 @@ static struct mapped_device *dm_find_md(dev_t dev) | |||
1267 | 1267 | ||
1268 | md = idr_find(&_minor_idr, minor); | 1268 | md = idr_find(&_minor_idr, minor); |
1269 | if (md && (md == MINOR_ALLOCED || | 1269 | if (md && (md == MINOR_ALLOCED || |
1270 | (dm_disk(md)->first_minor != minor) || | 1270 | (MINOR(disk_devt(dm_disk(md))) != minor) || |
1271 | test_bit(DMF_FREEING, &md->flags))) { | 1271 | test_bit(DMF_FREEING, &md->flags))) { |
1272 | md = NULL; | 1272 | md = NULL; |
1273 | goto out; | 1273 | goto out; |
@@ -1318,7 +1318,8 @@ void dm_put(struct mapped_device *md) | |||
1318 | 1318 | ||
1319 | if (atomic_dec_and_lock(&md->holders, &_minor_lock)) { | 1319 | if (atomic_dec_and_lock(&md->holders, &_minor_lock)) { |
1320 | map = dm_get_table(md); | 1320 | map = dm_get_table(md); |
1321 | idr_replace(&_minor_idr, MINOR_ALLOCED, dm_disk(md)->first_minor); | 1321 | idr_replace(&_minor_idr, MINOR_ALLOCED, |
1322 | MINOR(disk_devt(dm_disk(md)))); | ||
1322 | set_bit(DMF_FREEING, &md->flags); | 1323 | set_bit(DMF_FREEING, &md->flags); |
1323 | spin_unlock(&_minor_lock); | 1324 | spin_unlock(&_minor_lock); |
1324 | if (!dm_suspended(md)) { | 1325 | if (!dm_suspended(md)) { |