lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 412/717] fs: Handle I_DONTCACHE in iput_final() instead of generic_drop_inode()
    Date
    From: Hao Li <lihao2018.fnst@cn.fujitsu.com>

    [ Upstream commit 88149082bb8ef31b289673669e080ec6a00c2e59 ]

    If generic_drop_inode() returns true, it means iput_final() can evict
    this inode regardless of whether it is dirty or not. If we check
    I_DONTCACHE in generic_drop_inode(), any inode with this bit set will be
    evicted unconditionally. This is not the desired behavior because
    I_DONTCACHE only means the inode shouldn't be cached on the LRU list.
    As for whether we need to evict this inode, this is what
    generic_drop_inode() should do. This patch corrects the usage of
    I_DONTCACHE.

    This patch was proposed in [1].

    [1]: https://lore.kernel.org/linux-fsdevel/20200831003407.GE12096@dread.disaster.area/

    Fixes: dae2f8ed7992 ("fs: Lift XFS_IDONTCACHE to the VFS layer")
    Signed-off-by: Hao Li <lihao2018.fnst@cn.fujitsu.com>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>
    Reviewed-by: Ira Weiny <ira.weiny@intel.com>
    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/inode.c | 4 +++-
    include/linux/fs.h | 3 +--
    2 files changed, 4 insertions(+), 3 deletions(-)

    diff --git a/fs/inode.c b/fs/inode.c
    index 9d78c37b00b81..5eea9912a0b9d 100644
    --- a/fs/inode.c
    +++ b/fs/inode.c
    @@ -1627,7 +1627,9 @@ static void iput_final(struct inode *inode)
    else
    drop = generic_drop_inode(inode);

    - if (!drop && (sb->s_flags & SB_ACTIVE)) {
    + if (!drop &&
    + !(inode->i_state & I_DONTCACHE) &&
    + (sb->s_flags & SB_ACTIVE)) {
    inode_add_lru(inode);
    spin_unlock(&inode->i_lock);
    return;
    diff --git a/include/linux/fs.h b/include/linux/fs.h
    index 8667d0cdc71e7..8bde32cf97115 100644
    --- a/include/linux/fs.h
    +++ b/include/linux/fs.h
    @@ -2878,8 +2878,7 @@ extern int inode_needs_sync(struct inode *inode);
    extern int generic_delete_inode(struct inode *inode);
    static inline int generic_drop_inode(struct inode *inode)
    {
    - return !inode->i_nlink || inode_unhashed(inode) ||
    - (inode->i_state & I_DONTCACHE);
    + return !inode->i_nlink || inode_unhashed(inode);
    }
    extern void d_mark_dontcache(struct inode *inode);

    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 15:51    [W:4.021 / U:2.464 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site