Commit 3ef0f720 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Linus Torvalds

mm: fix infinite loop in filemap_fault

filemap_fault will go into an infinite loop if ->readpage() fails
asynchronously.

AFAICS the bug was introduced by this commit, which removed the wait after the
final readpage:

   commit d00806b1
   Author: Nick Piggin <npiggin@suse.de>
   Date:   Thu Jul 19 01:46:57 2007 -0700

       mm: fix fault vs invalidate race for linear mappings

Fix by reintroducing the wait_on_page_locked() after ->readpage() to make sure
the page is up-to-date before jumping back to the beginning of the function.

I've noticed this while testing nfs exporting on fuse.  The patch
fixes it.
Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
Cc: Nick Piggin <npiggin@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 3b73a223
...@@ -1461,6 +1461,11 @@ page_not_uptodate: ...@@ -1461,6 +1461,11 @@ page_not_uptodate:
*/ */
ClearPageError(page); ClearPageError(page);
error = mapping->a_ops->readpage(file, page); error = mapping->a_ops->readpage(file, page);
if (!error) {
wait_on_page_locked(page);
if (!PageUptodate(page))
error = -EIO;
}
page_cache_release(page); page_cache_release(page);
if (!error || error == AOP_TRUNCATED_PAGE) if (!error || error == AOP_TRUNCATED_PAGE)
......
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