• Tejun Heo's avatar
    writeback: sync_inodes_sb() must write out I_DIRTY_TIME inodes and always call wait_sb_inodes() · 006a0973
    Tejun Heo authored
    e7972912 ("writeback: don't issue wb_writeback_work if clean")
    updated writeback path to avoid kicking writeback work items if there
    are no inodes to be written out; unfortunately, the avoidance logic
    was too aggressive and broke sync_inodes_sb().
    
    * sync_inodes_sb() must write out I_DIRTY_TIME inodes but I_DIRTY_TIME
      inodes dont't contribute to bdi/wb_has_dirty_io() tests and were
      being skipped over.
    
    * inodes are taken off wb->b_dirty/io/more_io lists after writeback
      starts on them.  sync_inodes_sb() skipping wait_sb_inodes() when
      bdi_has_dirty_io() breaks it by making it return while writebacks
      are in-flight.
    
    This patch fixes the breakages by
    
    * Removing bdi_has_dirty_io() shortcut from bdi_split_work_to_wbs().
      The callers are already testing the condition.
    
    * Removing bdi_has_dirty_io() shortcut from sync_inodes_sb() so that
      it always calls into bdi_split_work_to_wbs() and wait_sb_inodes().
    
    * Making bdi_split_work_to_wbs() consider the b_dirty_time list for
      WB_SYNC_ALL writebacks.
    
    Kudos to Eryu, Dave and Jan for tracking down the issue.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Fixes: e7972912 ("writeback: don't issue wb_writeback_work if clean")
    Link: http://lkml.kernel.org/g/20150812101204.GE17933@dhcp-13-216.nay.redhat.comReported-and-bisected-by: default avatarEryu Guan <eguan@redhat.com>
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: Jan Kara <jack@suse.com>
    Cc: Ted Ts'o <tytso@google.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    006a0973
fs-writeback.c 67.3 KB