btrfs: simplify adding pages in btrfs_add_compressed_bio_pages
authorChristoph Hellwig <hch@lst.de>
Tue, 14 Mar 2023 16:51:10 +0000 (17:51 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 17 Apr 2023 16:01:18 +0000 (18:01 +0200)
btrfs_add_compressed_bio_pages is needlessly complicated.  Instead
of iterating over the logic disk offset just to add pages to the bio
use a simple offset starting at 0, which also removes most of the
claiming.  Additionally __bio_add_pages already takes care of the
assert that the bio is always properly sized, and btrfs_submit_bio
called right after asserts that the bio size is non-zero.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/compression.c

index 1487c94..44c4276 100644 (file)
@@ -258,37 +258,17 @@ static void end_compressed_bio_write(struct btrfs_bio *bbio)
 
 static void btrfs_add_compressed_bio_pages(struct compressed_bio *cb)
 {
-       struct btrfs_fs_info *fs_info = cb->bbio.inode->root->fs_info;
        struct bio *bio = &cb->bbio.bio;
-       u64 disk_bytenr = bio->bi_iter.bi_sector << SECTOR_SHIFT;
-       u64 cur_disk_byte = disk_bytenr;
+       u32 offset = 0;
 
-       while (cur_disk_byte < disk_bytenr + cb->compressed_len) {
-               u64 offset = cur_disk_byte - disk_bytenr;
-               unsigned int index = offset >> PAGE_SHIFT;
-               unsigned int real_size;
-               unsigned int added;
-               struct page *page = cb->compressed_pages[index];
+       while (offset < cb->compressed_len) {
+               u32 len = min_t(u32, cb->compressed_len - offset, PAGE_SIZE);
 
-               /*
-                * We have various limit on the real read size:
-                * - page boundary
-                * - compressed length boundary
-                */
-               real_size = min_t(u64, U32_MAX, PAGE_SIZE - offset_in_page(offset));
-               real_size = min_t(u64, real_size, cb->compressed_len - offset);
-               ASSERT(IS_ALIGNED(real_size, fs_info->sectorsize));
-
-               added = bio_add_page(bio, page, real_size, offset_in_page(offset));
-               /*
-                * Maximum compressed extent is smaller than bio size limit,
-                * thus bio_add_page() should always success.
-                */
-               ASSERT(added == real_size);
-               cur_disk_byte += added;
+               /* Maximum compressed extent is smaller than bio size limit. */
+               __bio_add_page(bio, cb->compressed_pages[offset >> PAGE_SHIFT],
+                              len, 0);
+               offset += len;
        }
-
-       ASSERT(bio->bi_iter.bi_size);
 }
 
 /*