On 22.11.18 г. 18:16 ч., David Sterba wrote:
> The end_io callback implemented as btrfs_io_bio_endio_readpage only
> calls kfree. Also the callback is set only in case the csum buffer is
> allocated and not pointing to the inline buffer. We can use that
> information to drop the indirection and call a helper that will free the
> csums only in the right case.
> 
> This shrinks struct btrfs_io_bio by 8 bytes.
> 
> Signed-off-by: David Sterba <dste...@suse.com>

Reviewed-by: Nikolay Borisov <nbori...@suse.com>

> ---
>  fs/btrfs/extent_io.c |  3 +--
>  fs/btrfs/file-item.c |  9 ---------
>  fs/btrfs/inode.c     |  7 ++-----
>  fs/btrfs/volumes.h   | 10 ++++++++--
>  4 files changed, 11 insertions(+), 18 deletions(-)
> 
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index 4ea808d6cfbc..aef3c9866ff0 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -2623,8 +2623,7 @@ static void end_bio_extent_readpage(struct bio *bio)
>       if (extent_len)
>               endio_readpage_release_extent(tree, extent_start, extent_len,
>                                             uptodate);
> -     if (io_bio->end_io)
> -             io_bio->end_io(io_bio, blk_status_to_errno(bio->bi_status));
> +     btrfs_io_bio_free_csum(io_bio);
>       bio_put(bio);
>  }
>  
> diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c
> index 1f2d0a6ab634..920bf3b4b0ef 100644
> --- a/fs/btrfs/file-item.c
> +++ b/fs/btrfs/file-item.c
> @@ -142,14 +142,6 @@ int btrfs_lookup_file_extent(struct btrfs_trans_handle 
> *trans,
>       return ret;
>  }
>  
> -static void btrfs_io_bio_endio_readpage(struct btrfs_io_bio *bio, int err)
> -{
> -     if (bio->csum != bio->csum_inline) {
> -             kfree(bio->csum);
> -             bio->csum = NULL;
> -     }
> -}
> -
>  static blk_status_t __btrfs_lookup_bio_sums(struct inode *inode, struct bio 
> *bio,
>                                  u64 logical_offset, u32 *dst, int dio)
>  {
> @@ -184,7 +176,6 @@ static blk_status_t __btrfs_lookup_bio_sums(struct inode 
> *inode, struct bio *bio
>                               btrfs_free_path(path);
>                               return BLK_STS_RESOURCE;
>                       }
> -                     btrfs_bio->end_io = btrfs_io_bio_endio_readpage;
>               } else {
>                       btrfs_bio->csum = btrfs_bio->csum_inline;
>               }
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 26b8bec7c2dc..6bfd37e58924 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -8017,9 +8017,7 @@ static void btrfs_endio_direct_read(struct bio *bio)
>  
>       dio_bio->bi_status = err;
>       dio_end_io(dio_bio);
> -
> -     if (io_bio->end_io)
> -             io_bio->end_io(io_bio, blk_status_to_errno(err));
> +     btrfs_io_bio_free_csum(io_bio);
>       bio_put(bio);
>  }
>  
> @@ -8372,8 +8370,7 @@ static void btrfs_submit_direct(struct bio *dio_bio, 
> struct inode *inode,
>       if (!ret)
>               return;
>  
> -     if (io_bio->end_io)
> -             io_bio->end_io(io_bio, ret);
> +     btrfs_io_bio_free_csum(io_bio);
>  
>  free_ordered:
>       /*
> diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
> index 9a764f2d462e..a13045fcfc45 100644
> --- a/fs/btrfs/volumes.h
> +++ b/fs/btrfs/volumes.h
> @@ -267,14 +267,12 @@ struct btrfs_fs_devices {
>   * we allocate are actually btrfs_io_bios.  We'll cram as much of
>   * struct btrfs_bio as we can into this over time.
>   */
> -typedef void (btrfs_io_bio_end_io_t) (struct btrfs_io_bio *bio, int err);
>  struct btrfs_io_bio {
>       unsigned int mirror_num;
>       unsigned int stripe_index;
>       u64 logical;
>       u8 *csum;
>       u8 csum_inline[BTRFS_BIO_INLINE_CSUM_SIZE];
> -     btrfs_io_bio_end_io_t *end_io;
>       struct bvec_iter iter;
>       /*
>        * This member must come last, bio_alloc_bioset will allocate enough
> @@ -288,6 +286,14 @@ static inline struct btrfs_io_bio *btrfs_io_bio(struct 
> bio *bio)
>       return container_of(bio, struct btrfs_io_bio, bio);
>  }
>  
> +static inline void btrfs_io_bio_free_csum(struct btrfs_io_bio *io_bio)
> +{
> +     if (io_bio->csum != io_bio->csum_inline) {
> +             kfree(io_bio->csum);
> +             io_bio->csum = NULL;
> +     }
> +}
> +
>  struct btrfs_bio_stripe {
>       struct btrfs_device *dev;
>       u64 physical;
> 

Reply via email to