Commit cfbc246e authored by Chris Mason's avatar Chris Mason

Btrfs: walk compressed pages based on the nr_pages count instead of bytes

The byte walk counting was awkward and error prone.  This uses the
number of pages sent the higher layer to build bios.
Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 87ef2bb4
...@@ -296,7 +296,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, ...@@ -296,7 +296,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start,
/* create and submit bios for the compressed pages */ /* create and submit bios for the compressed pages */
bytes_left = compressed_len; bytes_left = compressed_len;
while(bytes_left > 0) { for (page_index = 0; page_index < cb->nr_pages; page_index++) {
page = compressed_pages[page_index]; page = compressed_pages[page_index];
page->mapping = inode->i_mapping; page->mapping = inode->i_mapping;
if (bio->bi_size) if (bio->bi_size)
...@@ -324,7 +324,10 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, ...@@ -324,7 +324,10 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start,
bio->bi_end_io = end_compressed_bio_write; bio->bi_end_io = end_compressed_bio_write;
bio_add_page(bio, page, PAGE_CACHE_SIZE, 0); bio_add_page(bio, page, PAGE_CACHE_SIZE, 0);
} }
page_index++; if (bytes_left < PAGE_CACHE_SIZE) {
printk("bytes left %lu compress len %lu nr %lu\n",
bytes_left, cb->compressed_len, cb->nr_pages);
}
bytes_left -= PAGE_CACHE_SIZE; bytes_left -= PAGE_CACHE_SIZE;
first_byte += PAGE_CACHE_SIZE; first_byte += PAGE_CACHE_SIZE;
} }
......
...@@ -338,7 +338,7 @@ static int cow_file_range(struct inode *inode, struct page *locked_page, ...@@ -338,7 +338,7 @@ static int cow_file_range(struct inode *inode, struct page *locked_page,
if (!btrfs_test_flag(inode, NOCOMPRESS) && if (!btrfs_test_flag(inode, NOCOMPRESS) &&
btrfs_test_opt(root, COMPRESS)) { btrfs_test_opt(root, COMPRESS)) {
WARN_ON(pages); WARN_ON(pages);
pages = kmalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS);
/* we want to make sure the amount of IO required to satisfy /* we want to make sure the amount of IO required to satisfy
* a random read is reasonably small, so we limit the size * a random read is reasonably small, so we limit the size
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment