X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=fs%2Fblock_dev.c;h=c7bda5cd3da74daa998d1fda16c3e78240d7e872;hb=868f6fea8fa63f09acbfa93256d0d2abdcabff79;hp=bb43ce081d6ecef40b552d27f2b846a0d1a7606c;hpb=7644a448ccf200d95ad4426e84a486dec5cc1703;p=~andy%2Flinux diff --git a/fs/block_dev.c b/fs/block_dev.c index bb43ce081d6..c7bda5cd3da 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -58,17 +58,24 @@ static void bdev_inode_switch_bdi(struct inode *inode, struct backing_dev_info *dst) { struct backing_dev_info *old = inode->i_data.backing_dev_info; + bool wakeup_bdi = false; if (unlikely(dst == old)) /* deadlock avoidance */ return; bdi_lock_two(&old->wb, &dst->wb); spin_lock(&inode->i_lock); inode->i_data.backing_dev_info = dst; - if (inode->i_state & I_DIRTY) + if (inode->i_state & I_DIRTY) { + if (bdi_cap_writeback_dirty(dst) && !wb_has_dirty_io(&dst->wb)) + wakeup_bdi = true; list_move(&inode->i_wb_list, &dst->wb.b_dirty); + } spin_unlock(&inode->i_lock); spin_unlock(&old->wb.list_lock); spin_unlock(&dst->wb.list_lock); + + if (wakeup_bdi) + bdi_wakeup_thread_delayed(dst); } /* Kill _all_ buffers and pagecache , dirty or not.. */