@@ -85,13 +85,15 @@ struct btrfs_dio_private {
85
85
*/
86
86
refcount_t refs ;
87
87
88
- /* dio_bio came from fs/direct-io.c */
89
- struct bio * dio_bio ;
90
-
91
88
/* Array of checksums */
92
- u8 csums [];
89
+ u8 * csums ;
90
+
91
+ /* This must be last */
92
+ struct bio bio ;
93
93
};
94
94
95
+ static struct bio_set btrfs_dio_bioset ;
96
+
95
97
struct btrfs_rename_ctx {
96
98
/* Output field. Stores the index number of the old directory entry. */
97
99
u64 index ;
@@ -7828,19 +7830,19 @@ static void btrfs_dio_private_put(struct btrfs_dio_private *dip)
7828
7830
if (!refcount_dec_and_test (& dip -> refs ))
7829
7831
return ;
7830
7832
7831
- if (btrfs_op (dip -> dio_bio ) == BTRFS_MAP_WRITE ) {
7833
+ if (btrfs_op (& dip -> bio ) == BTRFS_MAP_WRITE ) {
7832
7834
__endio_write_update_ordered (BTRFS_I (dip -> inode ),
7833
7835
dip -> file_offset ,
7834
7836
dip -> bytes ,
7835
- !dip -> dio_bio -> bi_status );
7837
+ !dip -> bio . bi_status );
7836
7838
} else {
7837
7839
unlock_extent (& BTRFS_I (dip -> inode )-> io_tree ,
7838
7840
dip -> file_offset ,
7839
7841
dip -> file_offset + dip -> bytes - 1 );
7840
7842
}
7841
7843
7842
- bio_endio (dip -> dio_bio );
7843
- kfree ( dip );
7844
+ kfree (dip -> csums );
7845
+ bio_endio ( & dip -> bio );
7844
7846
}
7845
7847
7846
7848
static void submit_dio_repair_bio (struct inode * inode , struct bio * bio ,
@@ -7942,7 +7944,7 @@ static void btrfs_end_dio_bio(struct bio *bio)
7942
7944
err = btrfs_check_read_dio_bio (dip , bbio , !err );
7943
7945
7944
7946
if (err )
7945
- dip -> dio_bio -> bi_status = err ;
7947
+ dip -> bio . bi_status = err ;
7946
7948
7947
7949
btrfs_record_physical_zoned (dip -> inode , bbio -> file_offset , bio );
7948
7950
@@ -7997,49 +7999,16 @@ static inline blk_status_t btrfs_submit_dio_bio(struct bio *bio,
7997
7999
return ret ;
7998
8000
}
7999
8001
8000
- /*
8001
- * If this succeeds, the btrfs_dio_private is responsible for cleaning up locked
8002
- * or ordered extents whether or not we submit any bios.
8003
- */
8004
- static struct btrfs_dio_private * btrfs_create_dio_private (struct bio * dio_bio ,
8005
- struct inode * inode ,
8006
- loff_t file_offset )
8007
- {
8008
- const bool write = (btrfs_op (dio_bio ) == BTRFS_MAP_WRITE );
8009
- const bool csum = !(BTRFS_I (inode )-> flags & BTRFS_INODE_NODATASUM );
8010
- size_t dip_size ;
8011
- struct btrfs_dio_private * dip ;
8012
-
8013
- dip_size = sizeof (* dip );
8014
- if (!write && csum ) {
8015
- struct btrfs_fs_info * fs_info = btrfs_sb (inode -> i_sb );
8016
- size_t nblocks ;
8017
-
8018
- nblocks = dio_bio -> bi_iter .bi_size >> fs_info -> sectorsize_bits ;
8019
- dip_size += fs_info -> csum_size * nblocks ;
8020
- }
8021
-
8022
- dip = kzalloc (dip_size , GFP_NOFS );
8023
- if (!dip )
8024
- return NULL ;
8025
-
8026
- dip -> inode = inode ;
8027
- dip -> file_offset = file_offset ;
8028
- dip -> bytes = dio_bio -> bi_iter .bi_size ;
8029
- dip -> dio_bio = dio_bio ;
8030
- refcount_set (& dip -> refs , 1 );
8031
- return dip ;
8032
- }
8033
-
8034
8002
static void btrfs_submit_direct (const struct iomap_iter * iter ,
8035
8003
struct bio * dio_bio , loff_t file_offset )
8036
8004
{
8005
+ struct btrfs_dio_private * dip =
8006
+ container_of (dio_bio , struct btrfs_dio_private , bio );
8037
8007
struct inode * inode = iter -> inode ;
8038
8008
const bool write = (btrfs_op (dio_bio ) == BTRFS_MAP_WRITE );
8039
8009
struct btrfs_fs_info * fs_info = btrfs_sb (inode -> i_sb );
8040
8010
const bool raid56 = (btrfs_data_alloc_profile (fs_info ) &
8041
8011
BTRFS_BLOCK_GROUP_RAID56_MASK );
8042
- struct btrfs_dio_private * dip ;
8043
8012
struct bio * bio ;
8044
8013
u64 start_sector ;
8045
8014
int async_submit = 0 ;
@@ -8053,24 +8022,25 @@ static void btrfs_submit_direct(const struct iomap_iter *iter,
8053
8022
struct btrfs_dio_data * dio_data = iter -> private ;
8054
8023
struct extent_map * em = NULL ;
8055
8024
8056
- dip = btrfs_create_dio_private (dio_bio , inode , file_offset );
8057
- if (!dip ) {
8058
- if (!write ) {
8059
- unlock_extent (& BTRFS_I (inode )-> io_tree , file_offset ,
8060
- file_offset + dio_bio -> bi_iter .bi_size - 1 );
8061
- }
8062
- dio_bio -> bi_status = BLK_STS_RESOURCE ;
8063
- bio_endio (dio_bio );
8064
- return ;
8065
- }
8025
+ dip -> inode = inode ;
8026
+ dip -> file_offset = file_offset ;
8027
+ dip -> bytes = dio_bio -> bi_iter .bi_size ;
8028
+ refcount_set (& dip -> refs , 1 );
8029
+ dip -> csums = NULL ;
8030
+
8031
+ if (!write && !(BTRFS_I (inode )-> flags & BTRFS_INODE_NODATASUM )) {
8032
+ unsigned int nr_sectors =
8033
+ (dio_bio -> bi_iter .bi_size >> fs_info -> sectorsize_bits );
8066
8034
8067
- if (!write ) {
8068
8035
/*
8069
8036
* Load the csums up front to reduce csum tree searches and
8070
8037
* contention when submitting bios.
8071
- *
8072
- * If we have csums disabled this will do nothing.
8073
8038
*/
8039
+ status = BLK_STS_RESOURCE ;
8040
+ dip -> csums = kcalloc (nr_sectors , fs_info -> csum_size , GFP_NOFS );
8041
+ if (!dip )
8042
+ goto out_err ;
8043
+
8074
8044
status = btrfs_lookup_bio_sums (inode , dio_bio , dip -> csums );
8075
8045
if (status != BLK_STS_OK )
8076
8046
goto out_err ;
@@ -8160,7 +8130,7 @@ static void btrfs_submit_direct(const struct iomap_iter *iter,
8160
8130
out_err_em :
8161
8131
free_extent_map (em );
8162
8132
out_err :
8163
- dip -> dio_bio -> bi_status = status ;
8133
+ dio_bio -> bi_status = status ;
8164
8134
btrfs_dio_private_put (dip );
8165
8135
}
8166
8136
@@ -8171,6 +8141,7 @@ static const struct iomap_ops btrfs_dio_iomap_ops = {
8171
8141
8172
8142
static const struct iomap_dio_ops btrfs_dio_ops = {
8173
8143
.submit_io = btrfs_submit_direct ,
8144
+ .bio_set = & btrfs_dio_bioset ,
8174
8145
};
8175
8146
8176
8147
ssize_t btrfs_dio_rw (struct kiocb * iocb , struct iov_iter * iter , size_t done_before )
@@ -8991,6 +8962,7 @@ void __cold btrfs_destroy_cachep(void)
8991
8962
* destroy cache.
8992
8963
*/
8993
8964
rcu_barrier ();
8965
+ bioset_exit (& btrfs_dio_bioset );
8994
8966
kmem_cache_destroy (btrfs_inode_cachep );
8995
8967
kmem_cache_destroy (btrfs_trans_handle_cachep );
8996
8968
kmem_cache_destroy (btrfs_path_cachep );
@@ -9031,6 +9003,11 @@ int __init btrfs_init_cachep(void)
9031
9003
if (!btrfs_free_space_bitmap_cachep )
9032
9004
goto fail ;
9033
9005
9006
+ if (bioset_init (& btrfs_dio_bioset , BIO_POOL_SIZE ,
9007
+ offsetof(struct btrfs_dio_private , bio ),
9008
+ BIOSET_NEED_BVECS ))
9009
+ goto fail ;
9010
+
9034
9011
return 0 ;
9035
9012
fail :
9036
9013
btrfs_destroy_cachep ();
0 commit comments