[PATCH v2 10/26] btrfs: introduce submit_compressed_bio() for compression

Qu Wenruo
2021-08-29T05:25:20Z

The new helper, submit_compressed_bio(), will aggregate the following
work:

- Increase compressed_bio::pending_bios
- Remap the endio function
- Map and submit the bio

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
fs/btrfs/compression.c | 45 ++++++++++++++++++------------------------
1 file changed, 19 insertions(+), 26 deletions(-)

diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index ece4d9ab3c65..033ca1060567 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -422,6 +422,21 @@ static void end_compressed_bio_write(struct bio *bio)
bio_put(bio);
}

+static blk_status_t submit_compressed_bio(struct btrfs_fs_info *fs_info,
+ struct compressed_bio *cb,
+ struct bio *bio, int mirror_num)
+{
+ blk_status_t ret;
+
+ ASSERT(bio->bi_iter.bi_size);
+ atomic_inc(&cb->pending_bios);
+ ret = btrfs_bio_wq_end_io(fs_info, bio, BTRFS_WQ_ENDIO_DATA);
+ if (ret)
+ return ret;
+ ret = btrfs_map_bio(fs_info, bio, mirror_num);
+ return ret;
+}
+
/*
* worker function to build and submit bios for previously compressed pages.
* The corresponding pages in the inode should be marked for writeback
@@ -517,19 +532,13 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,

page->mapping = NULL;
if (submit || len < PAGE_SIZE) {
- atomic_inc(&cb->pending_bios);
- ret = btrfs_bio_wq_end_io(fs_info, bio,
- BTRFS_WQ_ENDIO_DATA);
- if (ret)
- goto finish_cb;
-
if (!skip_sum) {
ret = btrfs_csum_one_bio(inode, bio, start, 1);
if (ret)
goto finish_cb;
}

- ret = btrfs_map_bio(fs_info, bio, 0);
+ ret = submit_compressed_bio(fs_info, cb, bio, 0);
if (ret)
goto finish_cb;

@@ -555,18 +564,13 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
cond_resched();
}

- atomic_inc(&cb->pending_bios);
- ret = btrfs_bio_wq_end_io(fs_info, bio, BTRFS_WQ_ENDIO_DATA);
- if (ret)
- goto last_bio;
-
if (!skip_sum) {
ret = btrfs_csum_one_bio(inode, bio, start, 1);
if (ret)
goto last_bio;
}

- ret = btrfs_map_bio(fs_info, bio, 0);
+ ret = submit_compressed_bio(fs_info, cb, bio, 0);
if (ret)
goto last_bio;

@@ -872,12 +876,6 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
if (submit || bio_add_page(comp_bio, page, pg_len, 0) < pg_len) {
unsigned int nr_sectors;

- atomic_inc(&cb->pending_bios);
- ret = btrfs_bio_wq_end_io(fs_info, comp_bio,
- BTRFS_WQ_ENDIO_DATA);
- if (ret)
- goto finish_cb;
-
ret = btrfs_lookup_bio_sums(inode, comp_bio, sums);
if (ret)
goto finish_cb;
@@ -886,7 +884,7 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
fs_info->sectorsize);
sums += fs_info->csum_size * nr_sectors;

- ret = btrfs_map_bio(fs_info, comp_bio, mirror_num);
+ ret = submit_compressed_bio(fs_info, cb, comp_bio, mirror_num);
if (ret)
goto finish_cb;

@@ -900,16 +898,11 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
cur_disk_byte += pg_len;
}

- atomic_inc(&cb->pending_bios);
- ret = btrfs_bio_wq_end_io(fs_info, comp_bio, BTRFS_WQ_ENDIO_DATA);
- if (ret)
- goto last_bio;
-
ret = btrfs_lookup_bio_sums(inode, comp_bio, sums);
if (ret)
goto last_bio;

- ret = btrfs_map_bio(fs_info, comp_bio, mirror_num);
+ ret = submit_compressed_bio(fs_info, cb, comp_bio, mirror_num);
if (ret)
goto last_bio;

--
2.32.0