diff options
author | Nick Piggin <npiggin@suse.de> | 2009-03-11 16:17:36 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2009-03-27 14:44:05 -0400 |
commit | aabb8fdb41128705fd1627f56fdd571e45fdbcdb (patch) | |
tree | bae6e9abf167cf20b9a2d3e5c38520d3f17b777d /fs/inode.c | |
parent | 1bd7903560f1f713e85188a5aaf4d2428b6c8b50 (diff) |
fs: avoid I_NEW inodes
To be on the safe side, it should be less fragile to exclude I_NEW inodes
from inode list scans by default (unless there is an important reason to
have them).
Normally they will get excluded (eg. by zero refcount or writecount etc),
however it is a bit fragile for list walkers to know exactly what parts of
the inode state is set up and valid to test when in I_NEW. So along these
lines, move I_NEW checks upward as well (sometimes taking I_FREEING etc
checks with them too -- this shouldn't be a problem should it?)
Signed-off-by: Nick Piggin <npiggin@suse.de>
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: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/inode.c')
-rw-r--r-- | fs/inode.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/inode.c b/fs/inode.c index 826fb0b9d1c3..06aa5a1fb61b 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -356,6 +356,8 @@ static int invalidate_list(struct list_head *head, struct list_head *dispose) | |||
356 | if (tmp == head) | 356 | if (tmp == head) |
357 | break; | 357 | break; |
358 | inode = list_entry(tmp, struct inode, i_sb_list); | 358 | inode = list_entry(tmp, struct inode, i_sb_list); |
359 | if (inode->i_state & I_NEW) | ||
360 | continue; | ||
359 | invalidate_inode_buffers(inode); | 361 | invalidate_inode_buffers(inode); |
360 | if (!atomic_read(&inode->i_count)) { | 362 | if (!atomic_read(&inode->i_count)) { |
361 | list_move(&inode->i_list, dispose); | 363 | list_move(&inode->i_list, dispose); |