forked from luck/tmp_suning_uos_patched
Btrfs: cleanup pages properly when ENOMEM in compression
We were freeing non-existent pages which was causing a panic for a user who was suffering from ENOMEM. This patch fixes the problem. Thanks, Reported-by: Jérôme Poulin <jeromepoulin@gmail.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com>
This commit is contained in:
parent
5af3e8cce8
commit
15e3004a0e
|
@ -577,6 +577,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
|
|||
u64 em_start;
|
||||
struct extent_map *em;
|
||||
int ret = -ENOMEM;
|
||||
int faili = 0;
|
||||
u32 *sums;
|
||||
|
||||
tree = &BTRFS_I(inode)->io_tree;
|
||||
|
@ -626,9 +627,13 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
|
|||
for (pg_index = 0; pg_index < nr_pages; pg_index++) {
|
||||
cb->compressed_pages[pg_index] = alloc_page(GFP_NOFS |
|
||||
__GFP_HIGHMEM);
|
||||
if (!cb->compressed_pages[pg_index])
|
||||
if (!cb->compressed_pages[pg_index]) {
|
||||
faili = pg_index - 1;
|
||||
ret = -ENOMEM;
|
||||
goto fail2;
|
||||
}
|
||||
}
|
||||
faili = nr_pages - 1;
|
||||
cb->nr_pages = nr_pages;
|
||||
|
||||
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,
|
|||
return 0;
|
||||
|
||||
fail2:
|
||||
for (pg_index = 0; pg_index < nr_pages; pg_index++)
|
||||
free_page((unsigned long)cb->compressed_pages[pg_index]);
|
||||
while (faili >= 0) {
|
||||
__free_page(cb->compressed_pages[faili]);
|
||||
faili--;
|
||||
}
|
||||
|
||||
kfree(cb->compressed_pages);
|
||||
fail1:
|
||||
|
|
Loading…
Reference in New Issue
Block a user