Wu Fengguang 84a8924560 writeback: skip new or to-be-freed inodes
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: Jeff Layton <jlayton@redhat.com>
Cc: Masayoshi MIZUMA <m.mizuma@jp.fujitsu.com>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
Cc: Artem Bityutskiy <dedekind1@gmail.com>
Cc: Christoph Hellwig <hch@infradead.org>
Acked-by: Jan Kara <jack@suse.cz>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2009-06-16 19:47:45 -07:00
..
2009-06-11 21:36:14 -04:00
2009-06-11 21:36:14 -04:00
2009-06-11 21:36:07 -04:00
2009-06-11 21:36:01 -04:00
2009-06-11 21:36:01 -04:00
2009-06-11 21:36:07 -04:00
2009-06-11 21:36:14 -04:00
2009-06-11 21:36:07 -04:00
2009-05-15 11:24:59 -05:00
2009-06-11 21:36:07 -04:00
2009-06-12 10:02:03 -05:00
2009-06-11 21:36:11 -04:00
2009-06-11 21:36:11 -04:00
2009-06-11 21:36:15 -04:00
2009-06-11 21:36:07 -04:00
2009-06-11 21:36:15 -04:00
2009-06-11 21:36:16 -04:00
2009-06-11 21:36:11 -04:00
2009-05-22 18:40:59 +10:00
2009-06-11 21:36:07 -04:00
2009-06-11 21:36:11 -04:00
2009-06-11 21:36:12 -04:00
2009-06-11 21:36:07 -04:00
2009-06-11 21:36:11 -04:00
2009-06-11 21:36:01 -04:00
2009-06-11 21:36:11 -04:00
2009-06-11 21:36:11 -04:00
2009-06-11 21:36:13 -04:00
2009-06-11 21:36:12 -04:00
2009-06-14 17:58:25 -07:00
2009-06-11 21:36:07 -04:00
2009-06-11 21:36:07 -04:00
2009-06-11 21:36:16 -04:00
2009-06-11 21:36:11 -04:00
2009-06-11 21:36:13 -04:00
2009-06-11 21:36:16 -04:00
2009-06-11 21:36:06 -04:00
2009-06-11 21:36:07 -04:00
2009-06-11 21:36:11 -04:00
2009-06-11 21:36:01 -04:00
2009-06-11 21:36:08 -04:00
2009-06-11 21:36:02 -04:00
2009-06-11 21:36:11 -04:00
2009-06-11 21:36:02 -04:00