@@ -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-
551543static 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
920912static 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 )
0 commit comments