diff options
Diffstat (limited to 'fs/inode.c')
| -rw-r--r-- | fs/inode.c | 16 | 
1 files changed, 14 insertions, 2 deletions
diff --git a/fs/inode.c b/fs/inode.c index b03c7195724..64999f14415 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -408,6 +408,19 @@ static void inode_lru_list_add(struct inode *inode)  	spin_unlock(&inode->i_sb->s_inode_lru_lock);  } +/* + * Add inode to LRU if needed (inode is unused and clean). + * + * Needs inode->i_lock held. + */ +void inode_add_lru(struct inode *inode) +{ +	if (!(inode->i_state & (I_DIRTY | I_SYNC | I_FREEING | I_WILL_FREE)) && +	    !atomic_read(&inode->i_count) && inode->i_sb->s_flags & MS_ACTIVE) +		inode_lru_list_add(inode); +} + +  static void inode_lru_list_del(struct inode *inode)  {  	spin_lock(&inode->i_sb->s_inode_lru_lock); @@ -1390,8 +1403,7 @@ static void iput_final(struct inode *inode)  	if (!drop && (sb->s_flags & MS_ACTIVE)) {  		inode->i_state |= I_REFERENCED; -		if (!(inode->i_state & (I_DIRTY|I_SYNC))) -			inode_lru_list_add(inode); +		inode_add_lru(inode);  		spin_unlock(&inode->i_lock);  		return;  	}  |