summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2006-03-16 23:04:07 -0800
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-17 07:51:25 -0800
commit5b40dc780ed996162f3af8712eb03beb24dcdbef (patch)
tree17035c1d501390f00efac6895ee663c45d4fb699
parent8ba32fde2c5be52865b2fd7e5e3752a46971fabe (diff)
downloadlinux-3.10-5b40dc780ed996162f3af8712eb03beb24dcdbef.tar.gz
linux-3.10-5b40dc780ed996162f3af8712eb03beb24dcdbef.tar.bz2
linux-3.10-5b40dc780ed996162f3af8712eb03beb24dcdbef.zip
[PATCH] fix race in pagevec_strip?
We can call try_to_release_page() with PagePrivate off and a valid page->mapping This may cause all sorts of trouble for the filesystem *_releasepage() handlers. XFS bombs out in that case. Lock the page before checking for page private. Signed-off-by: Christoph Lameter <clameter@sgi.com> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--mm/swap.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/mm/swap.c b/mm/swap.c
index e9ec06d845e..b524ea90bdd 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -393,7 +393,8 @@ void pagevec_strip(struct pagevec *pvec)
struct page *page = pvec->pages[i];
if (PagePrivate(page) && !TestSetPageLocked(page)) {
- try_to_release_page(page, 0);
+ if (PagePrivate(page))
+ try_to_release_page(page, 0);
unlock_page(page);
}
}