|
@@ -654,14 +654,16 @@ EXPORT_SYMBOL(mark_buffer_dirty_inode);
|
|
static void __set_page_dirty(struct page *page,
|
|
static void __set_page_dirty(struct page *page,
|
|
struct address_space *mapping, int warn)
|
|
struct address_space *mapping, int warn)
|
|
{
|
|
{
|
|
- spin_lock_irq(&mapping->tree_lock);
|
|
|
|
|
|
+ unsigned long flags;
|
|
|
|
+
|
|
|
|
+ spin_lock_irqsave(&mapping->tree_lock, flags);
|
|
if (page->mapping) { /* Race with truncate? */
|
|
if (page->mapping) { /* Race with truncate? */
|
|
WARN_ON_ONCE(warn && !PageUptodate(page));
|
|
WARN_ON_ONCE(warn && !PageUptodate(page));
|
|
account_page_dirtied(page, mapping);
|
|
account_page_dirtied(page, mapping);
|
|
radix_tree_tag_set(&mapping->page_tree,
|
|
radix_tree_tag_set(&mapping->page_tree,
|
|
page_index(page), PAGECACHE_TAG_DIRTY);
|
|
page_index(page), PAGECACHE_TAG_DIRTY);
|
|
}
|
|
}
|
|
- spin_unlock_irq(&mapping->tree_lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&mapping->tree_lock, flags);
|
|
__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
|
|
__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
|
|
}
|
|
}
|
|
|
|
|