From ca2dbcd710902fae0004c21fd423bd3593d0b14b Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Mon, 26 Nov 2012 16:29:51 -0800 Subject: [PATCH] --- yaml --- r: 336040 b: refs/heads/master c: 4eff96dd5283a102e0c1cac95247090be74a38ed h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/fs-writeback.c | 2 ++ trunk/fs/inode.c | 16 ++++++++++++++-- trunk/fs/internal.h | 1 + 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 160a77c55532..fa3ebee182c4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 50694c28f1e1dbea18272980d265742a5027fb63 +refs/heads/master: 4eff96dd5283a102e0c1cac95247090be74a38ed diff --git a/trunk/fs/fs-writeback.c b/trunk/fs/fs-writeback.c index 51ea267d444c..3e3422f7f0a4 100644 --- a/trunk/fs/fs-writeback.c +++ b/trunk/fs/fs-writeback.c @@ -228,6 +228,8 @@ static void requeue_io(struct inode *inode, struct bdi_writeback *wb) static void inode_sync_complete(struct inode *inode) { inode->i_state &= ~I_SYNC; + /* If inode is clean an unused, put it into LRU now... */ + inode_add_lru(inode); /* Waiters must see I_SYNC cleared before being woken up */ smp_mb(); wake_up_bit(&inode->i_state, __I_SYNC); diff --git a/trunk/fs/inode.c b/trunk/fs/inode.c index b03c71957246..64999f144153 100644 --- a/trunk/fs/inode.c +++ b/trunk/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; } diff --git a/trunk/fs/internal.h b/trunk/fs/internal.h index 916b7cbf3e3e..2f6af7f645eb 100644 --- a/trunk/fs/internal.h +++ b/trunk/fs/internal.h @@ -110,6 +110,7 @@ extern int open_check_o_direct(struct file *f); * inode.c */ extern spinlock_t inode_sb_list_lock; +extern void inode_add_lru(struct inode *inode); /* * fs-writeback.c