|
@@ -423,7 +423,14 @@ EXPORT_SYMBOL(remove_inode_hash);
|
|
|
void end_writeback(struct inode *inode)
|
|
|
{
|
|
|
might_sleep();
|
|
|
+ /*
|
|
|
+ * We have to cycle tree_lock here because reclaim can be still in the
|
|
|
+ * process of removing the last page (in __delete_from_page_cache())
|
|
|
+ * and we must not free mapping under it.
|
|
|
+ */
|
|
|
+ spin_lock_irq(&inode->i_data.tree_lock);
|
|
|
BUG_ON(inode->i_data.nrpages);
|
|
|
+ spin_unlock_irq(&inode->i_data.tree_lock);
|
|
|
BUG_ON(!list_empty(&inode->i_data.private_list));
|
|
|
BUG_ON(!(inode->i_state & I_FREEING));
|
|
|
BUG_ON(inode->i_state & I_CLEAR);
|