diff options
author | Christoph Lameter <clameter@sgi.com> | 2006-03-16 23:04:07 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-17 07:51:25 -0800 |
commit | 5b40dc780ed996162f3af8712eb03beb24dcdbef (patch) | |
tree | 17035c1d501390f00efac6895ee663c45d4fb699 /mm/swap.c | |
parent | 8ba32fde2c5be52865b2fd7e5e3752a46971fabe (diff) | |
download | linux-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>
Diffstat (limited to 'mm/swap.c')
-rw-r--r-- | mm/swap.c | 3 |
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); } } |