• Wu Fengguang's avatar
    writeback: skip new or to-be-freed inodes · 84a89245
    Wu Fengguang authored
    1) I_FREEING tests should be coupled with I_CLEAR
    
    The two I_FREEING tests are racy because clear_inode() can set i_state to
    I_CLEAR between the clear of I_SYNC and the test of I_FREEING.
    
    2) skip I_WILL_FREE inodes in generic_sync_sb_inodes() to avoid possible
       races with generic_forget_inode()
    
    generic_forget_inode() sets I_WILL_FREE call writeback on its own, so
    generic_sync_sb_inodes() shall not try to step in and create possible races:
    
      generic_forget_inode
        inode->i_state |= I_WILL_FREE;
        spin_unlock(&inode_lock);
                                           generic_sync_sb_inodes()
                                             spin_lock(&inode_lock);
                                             __iget(inode);
                                             __writeback_single_inode
                                               // see non zero i_count
     may WARN here ==>                         WARN_ON(inode->i_state & I_WILL_FREE);
                                             spin_unlock(&inode_lock);
     may call generic_forget_inode again ==> iput(inode);
    
    The above race and warning didn't turn up because writeback_inodes() holds
    the s_umount lock, so generic_forget_inode() finds MS_ACTIVE and returns
    early.  But we are not sure the UBIFS calls and future callers will
    guarantee that.  So skip I_WILL_FREE inodes for the sake of safety.
    
    Cc: Eric Sandeen <sandeen@sandeen.net>
    Acked-by: default avatarJeff Layton <jlayton@redhat.com>
    Cc: Masayoshi MIZUMA <m.mizuma@jp.fujitsu.com>
    Signed-off-by: default avatarWu Fengguang <fengguang.wu@intel.com>
    Cc: Artem Bityutskiy <dedekind1@gmail.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Acked-by: default avatarJan Kara <jack@suse.cz>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    84a89245
fs-writeback.c 22.2 KB