Commit 32586c5b authored by Christoph Hellwig's avatar Christoph Hellwig Committed by David Sterba

btrfs: factor out a btrfs_free_compressed_pages helper

Share the code to free the compressed pages and the array to hold them
into a common helper.
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
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 10e924bc
...@@ -159,30 +159,29 @@ static int compression_decompress(int type, struct list_head *ws, ...@@ -159,30 +159,29 @@ static int compression_decompress(int type, struct list_head *ws,
} }
} }
static void btrfs_free_compressed_pages(struct compressed_bio *cb)
{
for (unsigned int i = 0; i < cb->nr_pages; i++) {
struct page *page = cb->compressed_pages[i];
page->mapping = NULL;
put_page(page);
}
kfree(cb->compressed_pages);
}
static int btrfs_decompress_bio(struct compressed_bio *cb); static int btrfs_decompress_bio(struct compressed_bio *cb);
static void end_compressed_bio_read(struct btrfs_bio *bbio) static void end_compressed_bio_read(struct btrfs_bio *bbio)
{ {
struct compressed_bio *cb = to_compressed_bio(bbio); struct compressed_bio *cb = to_compressed_bio(bbio);
blk_status_t status = bbio->bio.bi_status; blk_status_t status = bbio->bio.bi_status;
unsigned int index;
struct page *page;
if (!status) if (!status)
status = errno_to_blk_status(btrfs_decompress_bio(cb)); status = errno_to_blk_status(btrfs_decompress_bio(cb));
/* Release the compressed pages */ btrfs_free_compressed_pages(cb);
for (index = 0; index < cb->nr_pages; index++) {
page = cb->compressed_pages[index];
page->mapping = NULL;
put_page(page);
}
/* Do io completion on the original bio */
btrfs_bio_end_io(btrfs_bio(cb->orig_bio), status); btrfs_bio_end_io(btrfs_bio(cb->orig_bio), status);
/* Finally free the cb struct */
kfree(cb->compressed_pages);
bio_put(&bbio->bio); bio_put(&bbio->bio);
} }
...@@ -227,8 +226,6 @@ static noinline void end_compressed_writeback(const struct compressed_bio *cb) ...@@ -227,8 +226,6 @@ static noinline void end_compressed_writeback(const struct compressed_bio *cb)
static void finish_compressed_bio_write(struct compressed_bio *cb) static void finish_compressed_bio_write(struct compressed_bio *cb)
{ {
unsigned int index;
/* /*
* Ok, we're the last bio for this extent, step one is to call back * Ok, we're the last bio for this extent, step one is to call back
* into the FS and do all the end_io operations. * into the FS and do all the end_io operations.
...@@ -241,19 +238,7 @@ static void finish_compressed_bio_write(struct compressed_bio *cb) ...@@ -241,19 +238,7 @@ static void finish_compressed_bio_write(struct compressed_bio *cb)
end_compressed_writeback(cb); end_compressed_writeback(cb);
/* Note, our inode could be gone now */ /* Note, our inode could be gone now */
/* btrfs_free_compressed_pages(cb);
* Release the compressed pages, these came from alloc_page and
* are not attached to the inode at all
*/
for (index = 0; index < cb->nr_pages; index++) {
struct page *page = cb->compressed_pages[index];
page->mapping = NULL;
put_page(page);
}
/* Finally free the cb struct */
kfree(cb->compressed_pages);
bio_put(&cb->bbio.bio); bio_put(&cb->bbio.bio);
} }
......
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