Commit 43fa4219 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by David Sterba
Browse files

btrfs: simplify adding pages in btrfs_add_compressed_bio_pages



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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 4513cb0c
Loading
Loading
Loading
Loading
+7 −27
Original line number Diff line number Diff line
@@ -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);
}

/*