diff options
author | Nick Piggin <nickpiggin@yahoo.com.au> | 2004-09-17 19:35:55 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-09-17 19:35:55 -0700 |
commit | db119cd45e34f7b37f6beec19602654d6d5d4954 (patch) | |
tree | 50eaf16713486b7e34c31f59fb209b42200182b2 /mm | |
parent | a35ed119e775f6a8c83c882c75e6d72f6347b051 (diff) | |
download | history-db119cd45e34f7b37f6beec19602654d6d5d4954.tar.gz |
[PATCH] fix missing unlock_page in mm/rmap.c
A required unlock_page will be missed in a very rare (but possible) race
condition. Acked by Hugh, who says:
It'll be hard to hit because of the additional page_mapped test above,
with truncate unmapping ptes from mms before it advances to removing
pages from cache; but nothing to prevent it happening.
Signed-off-by: Nick Piggin <nickpiggin@yahoo.com.au>
Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/rmap.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/mm/rmap.c b/mm/rmap.c index 19c159bf3c9831..f1c40c722fe6f8 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -405,8 +405,9 @@ int page_referenced(struct page *page, int is_locked) referenced += page_referenced_file(page); else if (TestSetPageLocked(page)) referenced++; - else if (page->mapping) { - referenced += page_referenced_file(page); + else { + if (page->mapping) + referenced += page_referenced_file(page); unlock_page(page); } } |