summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2011-01-25 22:11:54 +0000
committerChris Mason <chris.mason@oracle.com>2011-01-28 16:42:34 -0500
commit7adf5dfbb3af65a00e20b3ead224c3a1b40e4ec4 (patch)
tree5723e9679a7926ea744c242cc8351e64ce7503e4
parentad0397a7a97f55fd7f70998ec208c5d8b90310ff (diff)
downloadlinux-7adf5dfbb3af65a00e20b3ead224c3a1b40e4ec4.tar.gz
linux-7adf5dfbb3af65a00e20b3ead224c3a1b40e4ec4.tar.bz2
linux-7adf5dfbb3af65a00e20b3ead224c3a1b40e4ec4.zip
Btrfs: handle no memory properly in prepare_pages
Instead of doing a BUG_ON(1) in prepare_pages if grab_cache_page() fails, just loop through the pages we've already grabbed and unlock and release them, then return -ENOMEM like we should. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
-rw-r--r--fs/btrfs/file.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 65b2424a4116..9e097fbfc78d 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -792,8 +792,12 @@ again:
for (i = 0; i < num_pages; i++) {
pages[i] = grab_cache_page(inode->i_mapping, index + i);
if (!pages[i]) {
- err = -ENOMEM;
- BUG_ON(1);
+ int c;
+ for (c = i - 1; c >= 0; c--) {
+ unlock_page(pages[c]);
+ page_cache_release(pages[c]);
+ }
+ return -ENOMEM;
}
wait_on_page_writeback(pages[i]);
}