diff options
| author | Mateusz Guzik <mjguzik@gmail.com> | 2025-10-29 14:14:28 +0100 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2025-11-25 10:34:49 +0100 |
| commit | 4c6b40877b4dc83f61a762a3a35a09dcf744b585 (patch) | |
| tree | 3c2571d0bf7318a64387f92d2bcfefd7266fcaab /fs/inode.c | |
| parent | a27628f4363435beac84b55c749c41a005054d30 (diff) | |
fs: cosmetic fixes to lru handling
1. inode_bit_waitqueue() was somehow placed between __inode_add_lru() and
inode_add_lru(). move it up
2. assert ->i_lock is held in __inode_add_lru instead of just claiming it is
needed
3. s/__inode_add_lru/__inode_lru_list_add/ for consistency with itself
(inode_lru_list_del()) and similar routines for sb and io list
management
4. push list presence check into inode_lru_list_del(), just like sb and
io list
Signed-off-by: Mateusz Guzik <mjguzik@gmail.com>
Link: https://patch.msgid.link/20251029131428.654761-2-mjguzik@gmail.com
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
Diffstat (limited to 'fs/inode.c')
| -rw-r--r-- | fs/inode.c | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/fs/inode.c b/fs/inode.c index 80298f048117..7229a56732c6 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -530,23 +530,6 @@ void ihold(struct inode *inode) } EXPORT_SYMBOL(ihold); -static void __inode_add_lru(struct inode *inode, bool rotate) -{ - if (inode_state_read(inode) & (I_DIRTY_ALL | I_SYNC | I_FREEING | I_WILL_FREE)) - return; - if (icount_read(inode)) - return; - if (!(inode->i_sb->s_flags & SB_ACTIVE)) - return; - if (!mapping_shrinkable(&inode->i_data)) - return; - - if (list_lru_add_obj(&inode->i_sb->s_inode_lru, &inode->i_lru)) - this_cpu_inc(nr_unused); - else if (rotate) - inode_state_set(inode, I_REFERENCED); -} - struct wait_queue_head *inode_bit_waitqueue(struct wait_bit_queue_entry *wqe, struct inode *inode, u32 bit) { @@ -584,18 +567,38 @@ void wait_on_new_inode(struct inode *inode) } EXPORT_SYMBOL(wait_on_new_inode); +static void __inode_lru_list_add(struct inode *inode, bool rotate) +{ + lockdep_assert_held(&inode->i_lock); + + if (inode_state_read(inode) & (I_DIRTY_ALL | I_SYNC | I_FREEING | I_WILL_FREE)) + return; + if (icount_read(inode)) + return; + if (!(inode->i_sb->s_flags & SB_ACTIVE)) + return; + if (!mapping_shrinkable(&inode->i_data)) + return; + + if (list_lru_add_obj(&inode->i_sb->s_inode_lru, &inode->i_lru)) + this_cpu_inc(nr_unused); + else if (rotate) + inode_state_set(inode, I_REFERENCED); +} + /* * Add inode to LRU if needed (inode is unused and clean). - * - * Needs inode->i_lock held. */ -void inode_add_lru(struct inode *inode) +void inode_lru_list_add(struct inode *inode) { - __inode_add_lru(inode, false); + __inode_lru_list_add(inode, false); } static void inode_lru_list_del(struct inode *inode) { + if (list_empty(&inode->i_lru)) + return; + if (list_lru_del_obj(&inode->i_sb->s_inode_lru, &inode->i_lru)) this_cpu_dec(nr_unused); } @@ -1920,7 +1923,7 @@ static void iput_final(struct inode *inode) if (!drop && !(inode_state_read(inode) & I_DONTCACHE) && (sb->s_flags & SB_ACTIVE)) { - __inode_add_lru(inode, true); + __inode_lru_list_add(inode, true); spin_unlock(&inode->i_lock); return; } @@ -1944,8 +1947,7 @@ static void iput_final(struct inode *inode) inode_state_replace(inode, I_WILL_FREE, I_FREEING); } - if (!list_empty(&inode->i_lru)) - inode_lru_list_del(inode); + inode_lru_list_del(inode); spin_unlock(&inode->i_lock); evict(inode); |