summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Lameter2006-03-17 08:04:07 +0100
committerLinus Torvalds2006-03-17 16:51:25 +0100
commit5b40dc780ed996162f3af8712eb03beb24dcdbef (patch)
tree17035c1d501390f00efac6895ee663c45d4fb699
parent[PATCH] dm stripe: Fix bounds (diff)
downloadkernel-qcow2-linux-5b40dc780ed996162f3af8712eb03beb24dcdbef.tar.gz
kernel-qcow2-linux-5b40dc780ed996162f3af8712eb03beb24dcdbef.tar.xz
kernel-qcow2-linux-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 e9ec06d845e8..b524ea90bddb 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);
}
}