• 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(...
    006a0973
fs-writeback.c 67.3 KB