@@ -717,6 +717,13 @@ int bdev_permission(dev_t dev, blk_mode_t mode, void *holder)
717
717
if (mode & BLK_OPEN_RESTRICT_WRITES && !holder )
718
718
return - EINVAL ;
719
719
720
+ /*
721
+ * We're using error pointers to indicate to ->release() when we
722
+ * failed to open that block device. Also this doesn't make sense.
723
+ */
724
+ if (WARN_ON_ONCE (IS_ERR (holder )))
725
+ return - EINVAL ;
726
+
720
727
return 0 ;
721
728
}
722
729
@@ -799,7 +806,7 @@ static void bdev_claim_write_access(struct block_device *bdev, blk_mode_t mode)
799
806
bdev -> bd_writers ++ ;
800
807
}
801
808
802
- static void bdev_yield_write_access (struct file * bdev_file , blk_mode_t mode )
809
+ static void bdev_yield_write_access (struct file * bdev_file )
803
810
{
804
811
struct block_device * bdev ;
805
812
@@ -808,7 +815,7 @@ static void bdev_yield_write_access(struct file *bdev_file, blk_mode_t mode)
808
815
809
816
bdev = file_bdev (bdev_file );
810
817
/* Yield exclusive or shared write access. */
811
- if (mode & BLK_OPEN_WRITE ) {
818
+ if (bdev_file -> f_mode & FMODE_WRITE ) {
812
819
if (bdev_writes_blocked (bdev ))
813
820
bdev_unblock_writes (bdev );
814
821
else
@@ -836,25 +843,18 @@ static void bdev_yield_write_access(struct file *bdev_file, blk_mode_t mode)
836
843
int bdev_open (struct block_device * bdev , blk_mode_t mode , void * holder ,
837
844
const struct blk_holder_ops * hops , struct file * bdev_file )
838
845
{
839
- struct bdev_handle * handle ;
840
846
bool unblock_events = true;
841
847
struct gendisk * disk = bdev -> bd_disk ;
842
848
int ret ;
843
849
844
- handle = kmalloc (sizeof (struct bdev_handle ), GFP_KERNEL );
845
- if (!handle )
846
- return - ENOMEM ;
847
-
848
850
if (holder ) {
849
851
mode |= BLK_OPEN_EXCL ;
850
852
ret = bd_prepare_to_claim (bdev , holder , hops );
851
853
if (ret )
852
- goto free_handle ;
854
+ return ret ;
853
855
} else {
854
- if (WARN_ON_ONCE (mode & BLK_OPEN_EXCL )) {
855
- ret = - EIO ;
856
- goto free_handle ;
857
- }
856
+ if (WARN_ON_ONCE (mode & BLK_OPEN_EXCL ))
857
+ return - EIO ;
858
858
}
859
859
860
860
disk_block_events (disk );
@@ -895,16 +895,14 @@ int bdev_open(struct block_device *bdev, blk_mode_t mode, void *holder,
895
895
896
896
if (unblock_events )
897
897
disk_unblock_events (disk );
898
- handle -> holder = holder ;
899
- handle -> mode = mode ;
900
898
901
899
bdev_file -> f_flags |= O_LARGEFILE ;
902
900
bdev_file -> f_mode |= FMODE_BUF_RASYNC | FMODE_CAN_ODIRECT ;
903
901
if (bdev_nowait (bdev ))
904
902
bdev_file -> f_mode |= FMODE_NOWAIT ;
905
903
bdev_file -> f_mapping = bdev -> bd_inode -> i_mapping ;
906
904
bdev_file -> f_wb_err = filemap_sample_wb_err (bdev_file -> f_mapping );
907
- bdev_file -> private_data = handle ;
905
+ bdev_file -> private_data = holder ;
908
906
909
907
return 0 ;
910
908
put_module :
@@ -914,8 +912,6 @@ int bdev_open(struct block_device *bdev, blk_mode_t mode, void *holder,
914
912
bd_abort_claiming (bdev , holder );
915
913
mutex_unlock (& disk -> open_mutex );
916
914
disk_unblock_events (disk );
917
- free_handle :
918
- kfree (handle );
919
915
return ret ;
920
916
}
921
917
@@ -976,7 +972,8 @@ struct file *bdev_file_open_by_dev(dev_t dev, blk_mode_t mode, void *holder,
976
972
977
973
ret = bdev_open (bdev , mode , holder , hops , bdev_file );
978
974
if (ret ) {
979
- blkdev_put_no_open (bdev );
975
+ /* We failed to open the block device. Let ->release() know. */
976
+ bdev_file -> private_data = ERR_PTR (ret );
980
977
fput (bdev_file );
981
978
return ERR_PTR (ret );
982
979
}
@@ -1011,9 +1008,13 @@ EXPORT_SYMBOL(bdev_file_open_by_path);
1011
1008
void bdev_release (struct file * bdev_file )
1012
1009
{
1013
1010
struct block_device * bdev = file_bdev (bdev_file );
1014
- struct bdev_handle * handle = bdev_file -> private_data ;
1011
+ void * holder = bdev_file -> private_data ;
1015
1012
struct gendisk * disk = bdev -> bd_disk ;
1016
1013
1014
+ /* We failed to open that block device. */
1015
+ if (IS_ERR (holder ))
1016
+ goto put_no_open ;
1017
+
1017
1018
/*
1018
1019
* Sync early if it looks like we're the last one. If someone else
1019
1020
* opens the block device between now and the decrement of bd_openers
@@ -1025,10 +1026,10 @@ void bdev_release(struct file *bdev_file)
1025
1026
sync_blockdev (bdev );
1026
1027
1027
1028
mutex_lock (& disk -> open_mutex );
1028
- bdev_yield_write_access (bdev_file , handle -> mode );
1029
+ bdev_yield_write_access (bdev_file );
1029
1030
1030
- if (handle -> holder )
1031
- bd_end_claim (bdev , handle -> holder );
1031
+ if (holder )
1032
+ bd_end_claim (bdev , holder );
1032
1033
1033
1034
/*
1034
1035
* Trigger event checking and tell drivers to flush MEDIA_CHANGE
@@ -1044,8 +1045,8 @@ void bdev_release(struct file *bdev_file)
1044
1045
mutex_unlock (& disk -> open_mutex );
1045
1046
1046
1047
module_put (disk -> fops -> owner );
1048
+ put_no_open :
1047
1049
blkdev_put_no_open (bdev );
1048
- kfree (handle );
1049
1050
}
1050
1051
1051
1052
/**
0 commit comments