diff options
author | Keith Busch <keith.busch@intel.com> | 2014-08-26 09:05:36 -0600 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2014-09-03 15:01:02 -0600 |
commit | 2da78092dda13f1efd26edbbf99a567776913750 (patch) | |
tree | 9f245a022542d626c948ebfb886106ce3f7e62ae /block/partition-generic.c | |
parent | 5676e7b6db02b80eafc2e3ad316d5f2fee817ecb (diff) | |
download | lwn-2da78092dda13f1efd26edbbf99a567776913750.tar.gz lwn-2da78092dda13f1efd26edbbf99a567776913750.zip |
block: Fix dev_t minor allocation lifetime
Releases the dev_t minor when all references are closed to prevent
another device from acquiring the same major/minor.
Since the partition's release may be invoked from call_rcu's soft-irq
context, the ext_dev_idr's mutex had to be replaced with a spinlock so
as not so sleep.
Signed-off-by: Keith Busch <keith.busch@intel.com>
Cc: stable@kernel.org
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/partition-generic.c')
-rw-r--r-- | block/partition-generic.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/block/partition-generic.c b/block/partition-generic.c index 789cdea05893..0d9e5f97f0a8 100644 --- a/block/partition-generic.c +++ b/block/partition-generic.c @@ -211,6 +211,7 @@ static const struct attribute_group *part_attr_groups[] = { static void part_release(struct device *dev) { struct hd_struct *p = dev_to_part(dev); + blk_free_devt(dev->devt); free_part_stats(p); free_part_info(p); kfree(p); @@ -253,7 +254,6 @@ void delete_partition(struct gendisk *disk, int partno) rcu_assign_pointer(ptbl->last_lookup, NULL); kobject_put(part->holder_dir); device_del(part_to_dev(part)); - blk_free_devt(part_devt(part)); hd_struct_put(part); } |