@@ -7546,10 +7546,11 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
75467546 loff_t length , unsigned int flags , struct iomap * iomap ,
75477547 struct iomap * srcmap )
75487548{
7549+ struct iomap_iter * iter = container_of (iomap , struct iomap_iter , iomap );
75497550 struct btrfs_fs_info * fs_info = btrfs_sb (inode -> i_sb );
75507551 struct extent_map * em ;
75517552 struct extent_state * cached_state = NULL ;
7552- struct btrfs_dio_data * dio_data = NULL ;
7553+ struct btrfs_dio_data * dio_data = iter -> private ;
75537554 u64 lockstart , lockend ;
75547555 const bool write = !!(flags & IOMAP_WRITE );
75557556 int ret = 0 ;
@@ -7595,17 +7596,7 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
75957596 }
75967597 }
75977598
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 ));
76097600
76107601 /*
76117602 * 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,
77697760 extent_changeset_free (dio_data -> data_reserved );
77707761 }
77717762
7772- kfree (dio_data );
7773-
77747763 return ret ;
77757764}
77767765
77777766static int btrfs_dio_iomap_end (struct inode * inode , loff_t pos , loff_t length ,
77787767 ssize_t written , unsigned int flags , struct iomap * iomap )
77797768{
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 ;
77827771 size_t submitted = dio_data -> submitted ;
77837772 const bool write = !!(flags & IOMAP_WRITE );
7773+ int ret = 0 ;
77847774
77857775 if (!write && (iomap -> type == IOMAP_HOLE )) {
77867776 /* If reading from a hole, unlock and return */
77877777 unlock_extent (& BTRFS_I (inode )-> io_tree , pos , pos + length - 1 );
7788- goto out ;
7778+ return 0 ;
77897779 }
77907780
77917781 if (submitted < length ) {
@@ -7802,10 +7792,6 @@ static int btrfs_dio_iomap_end(struct inode *inode, loff_t pos, loff_t length,
78027792
78037793 if (write )
78047794 extent_changeset_free (dio_data -> data_reserved );
7805- out :
7806- kfree (dio_data );
7807- iomap -> private = NULL ;
7808-
78097795 return ret ;
78107796}
78117797
@@ -8041,7 +8027,7 @@ static void btrfs_submit_direct(const struct iomap_iter *iter,
80418027 int ret ;
80428028 blk_status_t status ;
80438029 struct btrfs_io_geometry geom ;
8044- struct btrfs_dio_data * dio_data = iter -> iomap . private ;
8030+ struct btrfs_dio_data * dio_data = iter -> private ;
80458031 struct extent_map * em = NULL ;
80468032
80478033 dip = btrfs_create_dio_private (dio_bio , inode , file_offset );
@@ -8166,8 +8152,10 @@ static const struct iomap_dio_ops btrfs_dio_ops = {
81668152
81678153ssize_t btrfs_dio_rw (struct kiocb * iocb , struct iov_iter * iter , size_t done_before )
81688154{
8155+ struct btrfs_dio_data data ;
8156+
81698157 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 );
81718159}
81728160
81738161static int btrfs_fiemap (struct inode * inode , struct fiemap_extent_info * fieinfo ,
0 commit comments