diff options
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index 72e0a2887cb7..2f2873b9a041 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -929,6 +929,7 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part) | |||
929 | { | 929 | { |
930 | struct module *owner = NULL; | 930 | struct module *owner = NULL; |
931 | struct gendisk *disk; | 931 | struct gendisk *disk; |
932 | struct hd_struct *part = NULL; | ||
932 | int ret; | 933 | int ret; |
933 | int partno; | 934 | int partno; |
934 | int perm = 0; | 935 | int perm = 0; |
@@ -978,7 +979,6 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part) | |||
978 | if (bdev->bd_invalidated) | 979 | if (bdev->bd_invalidated) |
979 | rescan_partitions(disk, bdev); | 980 | rescan_partitions(disk, bdev); |
980 | } else { | 981 | } else { |
981 | struct hd_struct *p; | ||
982 | struct block_device *whole; | 982 | struct block_device *whole; |
983 | whole = bdget_disk(disk, 0); | 983 | whole = bdget_disk(disk, 0); |
984 | ret = -ENOMEM; | 984 | ret = -ENOMEM; |
@@ -989,16 +989,16 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part) | |||
989 | if (ret) | 989 | if (ret) |
990 | goto out_first; | 990 | goto out_first; |
991 | bdev->bd_contains = whole; | 991 | bdev->bd_contains = whole; |
992 | p = disk->part[partno - 1]; | 992 | part = disk_get_part(disk, partno); |
993 | bdev->bd_inode->i_data.backing_dev_info = | 993 | bdev->bd_inode->i_data.backing_dev_info = |
994 | whole->bd_inode->i_data.backing_dev_info; | 994 | whole->bd_inode->i_data.backing_dev_info; |
995 | if (!(disk->flags & GENHD_FL_UP) || !p || !p->nr_sects) { | 995 | if (!(disk->flags & GENHD_FL_UP) || |
996 | !part || !part->nr_sects) { | ||
996 | ret = -ENXIO; | 997 | ret = -ENXIO; |
997 | goto out_first; | 998 | goto out_first; |
998 | } | 999 | } |
999 | kobject_get(&p->dev.kobj); | 1000 | bdev->bd_part = part; |
1000 | bdev->bd_part = p; | 1001 | bd_set_size(bdev, (loff_t)part->nr_sects << 9); |
1001 | bd_set_size(bdev, (loff_t) p->nr_sects << 9); | ||
1002 | } | 1002 | } |
1003 | } else { | 1003 | } else { |
1004 | put_disk(disk); | 1004 | put_disk(disk); |
@@ -1027,6 +1027,7 @@ out_first: | |||
1027 | __blkdev_put(bdev->bd_contains, 1); | 1027 | __blkdev_put(bdev->bd_contains, 1); |
1028 | bdev->bd_contains = NULL; | 1028 | bdev->bd_contains = NULL; |
1029 | put_disk(disk); | 1029 | put_disk(disk); |
1030 | disk_put_part(part); | ||
1030 | module_put(owner); | 1031 | module_put(owner); |
1031 | out: | 1032 | out: |
1032 | mutex_unlock(&bdev->bd_mutex); | 1033 | mutex_unlock(&bdev->bd_mutex); |
@@ -1119,7 +1120,7 @@ static int __blkdev_put(struct block_device *bdev, int for_part) | |||
1119 | module_put(owner); | 1120 | module_put(owner); |
1120 | 1121 | ||
1121 | if (bdev->bd_contains != bdev) { | 1122 | if (bdev->bd_contains != bdev) { |
1122 | kobject_put(&bdev->bd_part->dev.kobj); | 1123 | disk_put_part(bdev->bd_part); |
1123 | bdev->bd_part = NULL; | 1124 | bdev->bd_part = NULL; |
1124 | } | 1125 | } |
1125 | bdev->bd_disk = NULL; | 1126 | bdev->bd_disk = NULL; |