Commit 8bedd51b authored by Mitch Harder's avatar Mitch Harder Committed by Chris Mason

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: default avatarMitch Harder <mitch.harder@sabayonlinux.org>
Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 6dd70ce4
...@@ -3909,6 +3909,8 @@ int extent_range_uptodate(struct extent_io_tree *tree, ...@@ -3909,6 +3909,8 @@ int extent_range_uptodate(struct extent_io_tree *tree,
while (start <= end) { while (start <= end) {
index = start >> PAGE_CACHE_SHIFT; index = start >> PAGE_CACHE_SHIFT;
page = find_get_page(tree->mapping, index); page = find_get_page(tree->mapping, index);
if (!page)
return 1;
uptodate = PageUptodate(page); uptodate = PageUptodate(page);
page_cache_release(page); page_cache_release(page);
if (!uptodate) { if (!uptodate) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment