summaryrefslogtreecommitdiffstats
path: root/block/ioctl.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2008-08-25 19:30:16 +0900
committerJens Axboe <jens.axboe@oracle.com>2008-10-09 08:56:04 +0200
commit88e341261ca4d39eec21b212961c77eff51105f7 (patch)
treeb65315c446ce592e6a0dc521eab9acd92ae61c5e /block/ioctl.c
parentec2cdedf798385a9397ac50dd0405dd658f8529c (diff)
downloadlinux-stable-88e341261ca4d39eec21b212961c77eff51105f7.tar.gz
linux-stable-88e341261ca4d39eec21b212961c77eff51105f7.tar.bz2
linux-stable-88e341261ca4d39eec21b212961c77eff51105f7.zip
block: update add_partition() error handling
d805dda4 tried to fix error case handling in add_partition() but had a few problems. * disk->part[] entry is set early and left dangling if operation fails. * Once device initialized, the last put_device() is responsible for freeing all the resources. The failure path freed part_stats and p regardless of put_device() causing double free. * holders subdir holds reference to the disk device, so failure path should remove it to release resources properly which was missing. This patch fixes the above problems and while at it move partition slot busy check into add_partition() for completeness and inlines holders subdirectory creation. Using separate function for it just obfuscates the code. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Abdel Benamrouche <draconux@gmail.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block/ioctl.c')
-rw-r--r--block/ioctl.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/block/ioctl.c b/block/ioctl.c
index c722de0ef2ee..eb046aeede8a 100644
--- a/block/ioctl.c
+++ b/block/ioctl.c
@@ -43,12 +43,9 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
|| pstart < 0 || plength < 0)
return -EINVAL;
}
- /* partition number in use? */
+
mutex_lock(&bdev->bd_mutex);
- if (disk->part[part - 1]) {
- mutex_unlock(&bdev->bd_mutex);
- return -EBUSY;
- }
+
/* overlap? */
for (i = 0; i < disk->minors - 1; i++) {
struct hd_struct *s = disk->part[i];