diff options
Diffstat (limited to 'fs/btrfs/compression.c')
-rw-r--r-- | fs/btrfs/compression.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 43d1c5a3a030..c6467aa88bee 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c | |||
@@ -577,6 +577,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
577 | u64 em_start; | 577 | u64 em_start; |
578 | struct extent_map *em; | 578 | struct extent_map *em; |
579 | int ret = -ENOMEM; | 579 | int ret = -ENOMEM; |
580 | int faili = 0; | ||
580 | u32 *sums; | 581 | u32 *sums; |
581 | 582 | ||
582 | tree = &BTRFS_I(inode)->io_tree; | 583 | tree = &BTRFS_I(inode)->io_tree; |
@@ -626,9 +627,13 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
626 | for (pg_index = 0; pg_index < nr_pages; pg_index++) { | 627 | for (pg_index = 0; pg_index < nr_pages; pg_index++) { |
627 | cb->compressed_pages[pg_index] = alloc_page(GFP_NOFS | | 628 | cb->compressed_pages[pg_index] = alloc_page(GFP_NOFS | |
628 | __GFP_HIGHMEM); | 629 | __GFP_HIGHMEM); |
629 | if (!cb->compressed_pages[pg_index]) | 630 | if (!cb->compressed_pages[pg_index]) { |
631 | faili = pg_index - 1; | ||
632 | ret = -ENOMEM; | ||
630 | goto fail2; | 633 | goto fail2; |
634 | } | ||
631 | } | 635 | } |
636 | faili = nr_pages - 1; | ||
632 | cb->nr_pages = nr_pages; | 637 | cb->nr_pages = nr_pages; |
633 | 638 | ||
634 | add_ra_bio_pages(inode, em_start + em_len, cb); | 639 | add_ra_bio_pages(inode, em_start + em_len, cb); |
@@ -713,8 +718,10 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
713 | return 0; | 718 | return 0; |
714 | 719 | ||
715 | fail2: | 720 | fail2: |
716 | for (pg_index = 0; pg_index < nr_pages; pg_index++) | 721 | while (faili >= 0) { |
717 | free_page((unsigned long)cb->compressed_pages[pg_index]); | 722 | __free_page(cb->compressed_pages[faili]); |
723 | faili--; | ||
724 | } | ||
718 | 725 | ||
719 | kfree(cb->compressed_pages); | 726 | kfree(cb->compressed_pages); |
720 | fail1: | 727 | fail1: |