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 /fs/btrfs | |
parent | 6dd70ce4eb7429c2ba6dd9fa46f78a0a2a254038 (diff) | |
download | linux-stable-8bedd51b6121c4607784d75f852828d25d119c52.tar.gz linux-stable-8bedd51b6121c4607784d75f852828d25d119c52.tar.bz2 linux-stable-8bedd51b6121c4607784d75f852828d25d119c52.zip |
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>
Diffstat (limited to 'fs/btrfs')
-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, while (start <= end) { index = start >> PAGE_CACHE_SHIFT; page = find_get_page(tree->mapping, index); + if (!page) + return 1; uptodate = PageUptodate(page); page_cache_release(page); if (!uptodate) { |