if (!TestSetPageDirty(page)) {
write_lock(&mapping->page_lock);
- list_del(&page->list);
- list_add(&page->list, &mapping->dirty_pages);
+ if (page->mapping) { /* Race with truncate? */
+ list_del(&page->list);
+ list_add(&page->list, &mapping->dirty_pages);
+ }
write_unlock(&mapping->page_lock);
__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
}
if (mapping) {
write_lock(&mapping->page_lock);
- list_del(&page->list);
- list_add(&page->list, &mapping->dirty_pages);
+ if (page->mapping) { /* Race with truncate? */
+ list_del(&page->list);
+ list_add(&page->list, &mapping->dirty_pages);
+ }
write_unlock(&mapping->page_lock);
__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
}