[PATCH] fix race in pagevec_strip?
authorChristoph Lameter <clameter@sgi.com>
Fri, 17 Mar 2006 07:04:07 +0000 (23:04 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 17 Mar 2006 15:51:25 +0000 (07:51 -0800)
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>
mm/swap.c

index e9ec06d845e808a36702c6fa64af986ece2f56a1..b524ea90bddb93554b7ace67af24af59fc657d17 100644 (file)
--- 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);
                }
        }