Commit 3ef0f720e47e895b613b0305eb0a483e3ec11f23

Authored by Miklos Szeredi
Committed by Linus Torvalds
1 parent 3b73a22366

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 d00806b183152af6d24f46f0c33f14162ca1262a
   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: Miklos Szeredi <mszeredi@suse.cz>
Cc: Nick Piggin <npiggin@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 5 additions and 0 deletions Side-by-side Diff

... ... @@ -1461,6 +1461,11 @@
1461 1461 */
1462 1462 ClearPageError(page);
1463 1463 error = mapping->a_ops->readpage(file, page);
  1464 + if (!error) {
  1465 + wait_on_page_locked(page);
  1466 + if (!PageUptodate(page))
  1467 + error = -EIO;
  1468 + }
1464 1469 page_cache_release(page);
1465 1470  
1466 1471 if (!error || error == AOP_TRUNCATED_PAGE)