@@ -7546,10 +7546,11 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
7546
7546
loff_t length , unsigned int flags , struct iomap * iomap ,
7547
7547
struct iomap * srcmap )
7548
7548
{
7549
+ struct iomap_iter * iter = container_of (iomap , struct iomap_iter , iomap );
7549
7550
struct btrfs_fs_info * fs_info = btrfs_sb (inode -> i_sb );
7550
7551
struct extent_map * em ;
7551
7552
struct extent_state * cached_state = NULL ;
7552
- struct btrfs_dio_data * dio_data = NULL ;
7553
+ struct btrfs_dio_data * dio_data = iter -> private ;
7553
7554
u64 lockstart , lockend ;
7554
7555
const bool write = !!(flags & IOMAP_WRITE );
7555
7556
int ret = 0 ;
@@ -7595,17 +7596,7 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
7595
7596
}
7596
7597
}
7597
7598
7598
- if (flags & IOMAP_NOWAIT ) {
7599
- dio_data = kzalloc (sizeof (* dio_data ), GFP_NOWAIT );
7600
- if (!dio_data )
7601
- return - EAGAIN ;
7602
- } else {
7603
- dio_data = kzalloc (sizeof (* dio_data ), GFP_NOFS );
7604
- if (!dio_data )
7605
- return - ENOMEM ;
7606
- }
7607
-
7608
- iomap -> private = dio_data ;
7599
+ memset (dio_data , 0 , sizeof (* dio_data ));
7609
7600
7610
7601
/*
7611
7602
* We always try to allocate data space and must do it before locking
@@ -7769,23 +7760,22 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
7769
7760
extent_changeset_free (dio_data -> data_reserved );
7770
7761
}
7771
7762
7772
- kfree (dio_data );
7773
-
7774
7763
return ret ;
7775
7764
}
7776
7765
7777
7766
static int btrfs_dio_iomap_end (struct inode * inode , loff_t pos , loff_t length ,
7778
7767
ssize_t written , unsigned int flags , struct iomap * iomap )
7779
7768
{
7780
- int ret = 0 ;
7781
- struct btrfs_dio_data * dio_data = iomap -> private ;
7769
+ struct iomap_iter * iter = container_of ( iomap , struct iomap_iter , iomap ) ;
7770
+ struct btrfs_dio_data * dio_data = iter -> private ;
7782
7771
size_t submitted = dio_data -> submitted ;
7783
7772
const bool write = !!(flags & IOMAP_WRITE );
7773
+ int ret = 0 ;
7784
7774
7785
7775
if (!write && (iomap -> type == IOMAP_HOLE )) {
7786
7776
/* If reading from a hole, unlock and return */
7787
7777
unlock_extent (& BTRFS_I (inode )-> io_tree , pos , pos + length - 1 );
7788
- goto out ;
7778
+ return 0 ;
7789
7779
}
7790
7780
7791
7781
if (submitted < length ) {
@@ -7802,10 +7792,6 @@ static int btrfs_dio_iomap_end(struct inode *inode, loff_t pos, loff_t length,
7802
7792
7803
7793
if (write )
7804
7794
extent_changeset_free (dio_data -> data_reserved );
7805
- out :
7806
- kfree (dio_data );
7807
- iomap -> private = NULL ;
7808
-
7809
7795
return ret ;
7810
7796
}
7811
7797
@@ -8041,7 +8027,7 @@ static void btrfs_submit_direct(const struct iomap_iter *iter,
8041
8027
int ret ;
8042
8028
blk_status_t status ;
8043
8029
struct btrfs_io_geometry geom ;
8044
- struct btrfs_dio_data * dio_data = iter -> iomap . private ;
8030
+ struct btrfs_dio_data * dio_data = iter -> private ;
8045
8031
struct extent_map * em = NULL ;
8046
8032
8047
8033
dip = btrfs_create_dio_private (dio_bio , inode , file_offset );
@@ -8166,8 +8152,10 @@ static const struct iomap_dio_ops btrfs_dio_ops = {
8166
8152
8167
8153
ssize_t btrfs_dio_rw (struct kiocb * iocb , struct iov_iter * iter , size_t done_before )
8168
8154
{
8155
+ struct btrfs_dio_data data ;
8156
+
8169
8157
return iomap_dio_rw (iocb , iter , & btrfs_dio_iomap_ops , & btrfs_dio_ops ,
8170
- IOMAP_DIO_PARTIAL , NULL , done_before );
8158
+ IOMAP_DIO_PARTIAL , & data , done_before );
8171
8159
}
8172
8160
8173
8161
static int btrfs_fiemap (struct inode * inode , struct fiemap_extent_info * fieinfo ,
0 commit comments