• Wu Fengguang's avatar
    writeback: don't busy retry writeback on new/freeing inodes · fcc5c222
    Wu Fengguang authored
    Fix a system hang bug introduced by commit b7a2441f ("writeback:
    remove writeback_control.more_io") and e8dfc305 ("writeback: elevate
    queue_io() into wb_writeback()") easily reproducible with high memory
    pressure and lots of file creation/deletions, for example, a kernel
    build in limited memory.
    
    It hangs when some inode is in the I_NEW, I_FREEING or I_WILL_FREE 
    state, the flusher will get stuck busy retrying that inode, never
    releasing wb->list_lock. The lock in turn blocks all kinds of other
    tasks when they are trying to grab it.
    
    As put by Jan, it's a safe change regarding data integrity. I_FREEING or
    I_WILL_FREE inodes are written back by iput_final() and it is reclaim
    code that is responsible for eventually removing them. So writeback code
    can safely ignore them. I_NEW inodes should move out of this state when
    they are fully set up and in the writeback round following that, we will
    consider them for writeback. So the change makes sense.                                                         
    
    CC: Jan Kara <jack@suse.cz> 
    Reported-by: default avatarHugh Dickins <hughd@google.com>
    Tested-by: default avatarHugh Dickins <hughd@google.com>
    Signed-off-by: default avatarWu Fengguang <fengguang.wu@intel.com>
    fcc5c222
fs-writeback.c 36.6 KB