--- linux-2.6.0-test10-mm1.ddm/mm/filemap.c 2003-12-05 17:14:57.000000000 -0800 +++ linux-2.6.0-test10-mm1.ddm.DIO/mm/filemap.c 2003-12-16 17:03:02.801786218 -0800 @@ -188,6 +188,20 @@ restart: struct page *page; page = list_entry(mapping->locked_pages.next,struct page,list); + /* + * If the page is locked, it might be in process of being + * setup for writeback but without PG_writeback set + * and with PG_dirty cleared. + * (PG_dirty is cleared BEFORE PG_writeback is set) + * So, wait for the PG_locked to clear, then start over. + */ + if (PageLocked(page)) { + page_cache_get(page); + spin_unlock(&mapping->page_lock); + wait_on_page_locked(page); + page_cache_release(page); + goto restart; + } list_del(&page->list); if (PageDirty(page)) list_add(&page->list, &mapping->dirty_pages);