Skip to content

Commit 0762b8b

Browse files
htejunJens Axboe
authored andcommitted
block: always set bdev->bd_part
Till now, bdev->bd_part is set only if the bdev was for parts other than part0. This patch makes bdev->bd_part always set so that code paths don't have to differenciate common handling. Signed-off-by: Tejun Heo <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 4c46501 commit 0762b8b

File tree

5 files changed

+35
-48
lines changed

5 files changed

+35
-48
lines changed

block/blk-core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1274,7 +1274,7 @@ __setup("fail_make_request=", setup_fail_make_request);
12741274
static int should_fail_request(struct bio *bio)
12751275
{
12761276
if ((bio->bi_bdev->bd_disk->flags & GENHD_FL_FAIL) ||
1277-
(bio->bi_bdev->bd_part && bio->bi_bdev->bd_part->make_it_fail))
1277+
bio->bi_bdev->bd_part->make_it_fail)
12781278
return should_fail(&fail_make_request, bio->bi_size);
12791279

12801280
return 0;

drivers/md/md.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,10 +1464,7 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
14641464
if ((err = kobject_add(&rdev->kobj, &mddev->kobj, "dev-%s", b)))
14651465
goto fail;
14661466

1467-
if (rdev->bdev->bd_part)
1468-
ko = &part_to_dev(rdev->bdev->bd_part)->kobj;
1469-
else
1470-
ko = &disk_to_dev(rdev->bdev->bd_disk)->kobj;
1467+
ko = &part_to_dev(rdev->bdev->bd_part)->kobj;
14711468
if ((err = sysfs_create_link(&rdev->kobj, ko, "block"))) {
14721469
kobject_del(&rdev->kobj);
14731470
goto fail;

fs/block_dev.c

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -540,14 +540,6 @@ EXPORT_SYMBOL(bd_release);
540540
* /sys/block/sda/holders/dm-0 --> /sys/block/dm-0
541541
*/
542542

543-
static struct kobject *bdev_get_kobj(struct block_device *bdev)
544-
{
545-
if (bdev->bd_contains != bdev)
546-
return kobject_get(&part_to_dev(bdev->bd_part)->kobj);
547-
else
548-
return kobject_get(&disk_to_dev(bdev->bd_disk)->kobj);
549-
}
550-
551543
static int add_symlink(struct kobject *from, struct kobject *to)
552544
{
553545
if (!from || !to)
@@ -596,7 +588,7 @@ static int bd_holder_grab_dirs(struct block_device *bdev,
596588
if (!bo->hdev)
597589
goto fail_put_sdir;
598590

599-
bo->sdev = bdev_get_kobj(bdev);
591+
bo->sdev = kobject_get(&part_to_dev(bdev->bd_part)->kobj);
600592
if (!bo->sdev)
601593
goto fail_put_hdev;
602594

@@ -919,7 +911,6 @@ static int __blkdev_put(struct block_device *bdev, int for_part);
919911

920912
static int do_open(struct block_device *bdev, struct file *file, int for_part)
921913
{
922-
struct module *owner = NULL;
923914
struct gendisk *disk;
924915
struct hd_struct *part = NULL;
925916
int ret;
@@ -941,25 +932,27 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
941932

942933
ret = -ENXIO;
943934
file->f_mapping = bdev->bd_inode->i_mapping;
935+
944936
lock_kernel();
937+
945938
disk = get_gendisk(bdev->bd_dev, &partno);
946-
if (!disk) {
947-
unlock_kernel();
948-
bdput(bdev);
949-
return ret;
950-
}
951-
owner = disk->fops->owner;
939+
if (!disk)
940+
goto out_unlock_kernel;
941+
part = disk_get_part(disk, partno);
942+
if (!part)
943+
goto out_unlock_kernel;
952944

953945
mutex_lock_nested(&bdev->bd_mutex, for_part);
954946
if (!bdev->bd_openers) {
955947
bdev->bd_disk = disk;
948+
bdev->bd_part = part;
956949
bdev->bd_contains = bdev;
957950
if (!partno) {
958951
struct backing_dev_info *bdi;
959952
if (disk->fops->open) {
960953
ret = disk->fops->open(bdev->bd_inode, file);
961954
if (ret)
962-
goto out_first;
955+
goto out_clear;
963956
}
964957
if (!bdev->bd_openers) {
965958
bd_set_size(bdev,(loff_t)get_capacity(disk)<<9);
@@ -975,31 +968,32 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
975968
whole = bdget_disk(disk, 0);
976969
ret = -ENOMEM;
977970
if (!whole)
978-
goto out_first;
971+
goto out_clear;
979972
BUG_ON(for_part);
980973
ret = __blkdev_get(whole, file->f_mode, file->f_flags, 1);
981974
if (ret)
982-
goto out_first;
975+
goto out_clear;
983976
bdev->bd_contains = whole;
984-
part = disk_get_part(disk, partno);
985977
bdev->bd_inode->i_data.backing_dev_info =
986978
whole->bd_inode->i_data.backing_dev_info;
987979
if (!(disk->flags & GENHD_FL_UP) ||
988980
!part || !part->nr_sects) {
989981
ret = -ENXIO;
990-
goto out_first;
982+
goto out_clear;
991983
}
992-
bdev->bd_part = part;
993984
bd_set_size(bdev, (loff_t)part->nr_sects << 9);
994985
}
995986
} else {
987+
disk_put_part(part);
996988
put_disk(disk);
997-
module_put(owner);
989+
module_put(disk->fops->owner);
990+
part = NULL;
991+
disk = NULL;
998992
if (bdev->bd_contains == bdev) {
999993
if (bdev->bd_disk->fops->open) {
1000994
ret = bdev->bd_disk->fops->open(bdev->bd_inode, file);
1001995
if (ret)
1002-
goto out;
996+
goto out_unlock_bdev;
1003997
}
1004998
if (bdev->bd_invalidated)
1005999
rescan_partitions(bdev->bd_disk, bdev);
@@ -1012,20 +1006,24 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
10121006
unlock_kernel();
10131007
return 0;
10141008

1015-
out_first:
1009+
out_clear:
10161010
bdev->bd_disk = NULL;
1011+
bdev->bd_part = NULL;
10171012
bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info;
10181013
if (bdev != bdev->bd_contains)
10191014
__blkdev_put(bdev->bd_contains, 1);
10201015
bdev->bd_contains = NULL;
1021-
put_disk(disk);
1022-
disk_put_part(part);
1023-
module_put(owner);
1024-
out:
1016+
out_unlock_bdev:
10251017
mutex_unlock(&bdev->bd_mutex);
1018+
out_unlock_kernel:
10261019
unlock_kernel();
1027-
if (ret)
1028-
bdput(bdev);
1020+
1021+
disk_put_part(part);
1022+
if (disk)
1023+
module_put(disk->fops->owner);
1024+
put_disk(disk);
1025+
bdput(bdev);
1026+
10291027
return ret;
10301028
}
10311029

@@ -1110,11 +1108,8 @@ static int __blkdev_put(struct block_device *bdev, int for_part)
11101108

11111109
put_disk(disk);
11121110
module_put(owner);
1113-
1114-
if (bdev->bd_contains != bdev) {
1115-
disk_put_part(bdev->bd_part);
1116-
bdev->bd_part = NULL;
1117-
}
1111+
disk_put_part(bdev->bd_part);
1112+
bdev->bd_part = NULL;
11181113
bdev->bd_disk = NULL;
11191114
bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info;
11201115
if (bdev != bdev->bd_contains)

fs/partitions/check.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,7 @@ char *disk_name(struct gendisk *hd, int partno, char *buf)
134134

135135
const char *bdevname(struct block_device *bdev, char *buf)
136136
{
137-
int partno = 0;
138-
139-
if (bdev->bd_part)
140-
partno = bdev->bd_part->partno;
141-
142-
return disk_name(bdev->bd_disk, partno, buf);
137+
return disk_name(bdev->bd_disk, bdev->bd_part->partno, buf);
143138
}
144139

145140
EXPORT_SYMBOL(bdevname);

include/linux/genhd.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ extern void rand_initialize_disk(struct gendisk *disk);
412412

413413
static inline sector_t get_start_sect(struct block_device *bdev)
414414
{
415-
return bdev->bd_contains == bdev ? 0 : bdev->bd_part->start_sect;
415+
return bdev->bd_part->start_sect;
416416
}
417417
static inline sector_t get_capacity(struct gendisk *disk)
418418
{

0 commit comments

Comments
 (0)