summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilipe Manana <fdmanana@gmail.com>2014-06-05 13:22:24 +0100
committerChris Mason <clm@fb.com>2014-06-09 17:21:12 -0700
commit91405151eb7005949072bee751343390757f8417 (patch)
tree09a10ab7a754d092e46bff6cd46d41847de439a4
parentc81d57679ee4b87a5b50e9afe4e5d1866d08b9ad (diff)
downloadkernel-common-91405151eb7005949072bee751343390757f8417.tar.gz
kernel-common-91405151eb7005949072bee751343390757f8417.tar.bz2
kernel-common-91405151eb7005949072bee751343390757f8417.zip
Btrfs: make sure we retry if we couldn't get the page
In inode.c:btrfs_page_exists_in_range(), if we can't get the page we need to retry. However we weren't retrying because we weren't setting page to NULL, which makes the while loop exit immediately and will make us call page_cache_release after exiting the loop which is incorrect because our page get didn't succeed. This could also make us return true when we shouldn't. Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com> Signed-off-by: Chris Mason <clm@fb.com>
-rw-r--r--fs/btrfs/inode.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 38d1e7b976d8..cdbd20e62bb6 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -6777,8 +6777,10 @@ bool btrfs_page_exists_in_range(struct inode *inode, loff_t start, loff_t end)
break; /* TODO: Is this relevant for this use case? */
}
- if (!page_cache_get_speculative(page))
+ if (!page_cache_get_speculative(page)) {
+ page = NULL;
continue;
+ }
/*
* Has the page moved?