[patch 24/27] fix invalidate_inode_pages2() race

From: Andrew Morton (akpm@zip.com.au)
Date: Thu Jul 04 2002 - 18:55:19 EST


Fix a buglet in invalidate_list_pages2(): there is a small window in
which writeback could start against the page before this function locks
it.

The patch closes the race by performing the PageWriteback test inside
PageLocked.

Testing PageWriteback inside PageLocked is "definitive" - when a page
is locked, writeback cannot start against it.

 filemap.c | 16 +++++++++-------
 1 files changed, 9 insertions(+), 7 deletions(-)

--- 2.5.24/mm/filemap.c~invalidate-race Thu Jul 4 16:17:32 2002
+++ 2.5.24-akpm/mm/filemap.c Thu Jul 4 16:17:32 2002
@@ -367,16 +367,18 @@ static int invalidate_list_pages2(struct
         while (curr != head) {
                 page = list_entry(curr, struct page, list);
 
- if (PageWriteback(page)) {
- write_unlock(&mapping->page_lock);
- wait_on_page_writeback(page);
- unlocked = 1;
- write_lock(&mapping->page_lock);
- goto restart;
- }
                 if (!TestSetPageLocked(page)) {
                         int __unlocked;
 
+ if (PageWriteback(page)) {
+ write_unlock(&mapping->page_lock);
+ wait_on_page_writeback(page);
+ unlocked = 1;
+ write_lock(&mapping->page_lock);
+ unlock_page(page);
+ goto restart;
+ }
+
                         __unlocked = invalidate_this_page2(mapping, page, curr, head);
                         unlock_page(page);
                         unlocked |= __unlocked;

-
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Jul 07 2002 - 22:00:14 EST