Hugh Dickins 59a16ead57 tmpfs: fix spurious ENOSPC when racing with unswap
Testing the shmem_swaplist replacements for igrab() revealed another bug:
writes to /dev/loop0 on a tmpfs file which fills its filesystem were
sometimes failing with "Buffer I/O error"s.

These came from ENOSPC failures of shmem_getpage(), when racing with
swapoff: the same could happen when racing with another shmem_getpage(),
pulling the page in from swap in between our find_lock_page() and our
taking the info->lock (though not in the single-threaded loop case).

This is unacceptable, and surprising that I've not noticed it before:
it dates back many years, but (presumably) was made a lot easier to
reproduce in 2.6.36, which sited a page preallocation in the race window.

Fix it by rechecking the page cache before settling on an ENOSPC error.

Signed-off-by: Hugh Dickins <hughd@google.com>
Cc: Konstantin Khlebnikov <khlebnikov@openvz.org>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2011-05-11 18:50:45 -07:00
..
2011-03-31 11:26:23 -03:00
2009-04-01 08:59:13 -07:00
2011-03-31 11:26:23 -03:00
2011-03-31 11:26:23 -03:00
2011-03-31 11:26:23 -03:00
2011-03-31 11:26:23 -03:00
2011-03-31 11:26:23 -03:00
2011-03-31 11:26:23 -03:00
2011-03-31 11:26:23 -03:00
2009-09-22 07:17:35 -07:00
2011-03-31 11:26:23 -03:00
2010-03-24 16:31:21 -07:00
2011-01-13 17:32:46 -08:00
2010-05-21 18:31:21 -04:00
2011-03-31 11:26:23 -03:00
2011-03-29 14:05:12 +01:00
2011-04-28 11:28:21 -07:00
2011-05-11 18:50:45 -07:00
2011-03-10 08:52:27 +01:00
2011-03-31 11:26:23 -03:00
2011-03-10 08:52:26 +01:00
2011-03-31 11:26:23 -03:00
2011-03-31 11:26:23 -03:00
2011-03-10 08:52:07 +01:00
2009-06-23 12:50:05 -07:00
2011-03-22 17:44:03 -07:00
2011-03-31 11:26:23 -03:00