diff options
author | Mitch Harder <mitch.harder@sabayonlinux.org> | 2012-01-26 15:01:11 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2012-01-26 15:01:11 -0500 |
commit | 8bedd51b6121c4607784d75f852828d25d119c52 (patch) | |
tree | e9299eb7b70a1d2f0ea5a4e23b53c7a6496eea59 | |
parent | 6dd70ce4eb7429c2ba6dd9fa46f78a0a2a254038 (diff) |
Btrfs: Check for NULL page in extent_range_uptodate
A user has encountered a NULL pointer kernel oops in btrfs when
encountering media errors. The problem has been identified
as an unhandled NULL pointer returned from find_get_page().
This modification simply checks for a NULL page, and returns
with an error if found (the extent_range_uptodate() function
returns 1 on errors).
After testing this patch, the user reported that the error with
the NULL pointer oops was solved. However, there is still a
remaining problem with a thread becoming stuck in
wait_on_page_locked(page) in the read_extent_buffer_pages(...)
function in extent_io.c
for (i = start_i; i < num_pages; i++) {
page = extent_buffer_page(eb, i);
wait_on_page_locked(page);
if (!PageUptodate(page))
ret = -EIO;
}
This patch leaves the issue with the locked page yet to be resolved.
Signed-off-by: Mitch Harder <mitch.harder@sabayonlinux.org>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
-rw-r--r-- | fs/btrfs/extent_io.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 9d09a4f81875..fcf77e1ded40 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -3909,6 +3909,8 @@ int extent_range_uptodate(struct extent_io_tree *tree, | |||
3909 | while (start <= end) { | 3909 | while (start <= end) { |
3910 | index = start >> PAGE_CACHE_SHIFT; | 3910 | index = start >> PAGE_CACHE_SHIFT; |
3911 | page = find_get_page(tree->mapping, index); | 3911 | page = find_get_page(tree->mapping, index); |
3912 | if (!page) | ||
3913 | return 1; | ||
3912 | uptodate = PageUptodate(page); | 3914 | uptodate = PageUptodate(page); |
3913 | page_cache_release(page); | 3915 | page_cache_release(page); |
3914 | if (!uptodate) { | 3916 | if (!uptodate) { |