[patch 6/10] Fix SMP race in truncate

From: Andrew Morton (akpm@zip.com.au)
Date: Sun May 05 2002 - 15:56:47 EST


Closes a small race window: testing PageWriteback() outside the page
lock introduces the possibility that page could be redirtied and have
writeback started after we've inspected PageWriteback.

=====================================

--- 2.5.13/mm/filemap.c~truncate-race Sun May 5 13:32:00 2002
+++ 2.5.13-akpm/mm/filemap.c Sun May 5 13:32:35 2002
@@ -201,18 +201,18 @@ static int truncate_list_pages(struct ad
                         int failed;
 
                         page_cache_get(page);
- if (PageWriteback(page)) {
- /*
- * urgggh. This function is utterly foul,
- * and this addition doesn't help. Kill.
- */
+ failed = TestSetPageLocked(page);
+ if (!failed && PageWriteback(page)) {
+ unlock_page(page);
+ list_del(head);
+ list_add_tail(head, curr);
                                 write_unlock(&mapping->page_lock);
                                 wait_on_page_writeback(page);
+ page_cache_release(page);
                                 unlocked = 1;
                                 write_lock(&mapping->page_lock);
                                 goto restart;
                         }
- failed = TestSetPageLocked(page);
 
                         list_del(head);
                         if (!failed)

-
-
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 : Tue May 07 2002 - 22:00:25 EST