All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hao Li <lihao2018.fnst@cn.fujitsu.com>
To: <viro@zeniv.linux.org.uk>
Cc: <david@fromorbit.com>, <ira.weiny@intel.com>,
	<linux-fsdevel@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-xfs@vger.kernel.org>, <lihao2018.fnst@cn.fujitsu.com>,
	<y-goto@fujitsu.com>
Subject: [PATCH] fs: Handle I_DONTCACHE in iput_final() instead of generic_drop_inode()
Date: Mon, 31 Aug 2020 18:13:13 +0800	[thread overview]
Message-ID: <20200831101313.168889-1-lihao2018.fnst@cn.fujitsu.com> (raw)

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/

Signed-off-by: Hao Li <lihao2018.fnst@cn.fujitsu.com>
---
 fs/inode.c         | 3 ++-
 include/linux/fs.h | 3 +--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/fs/inode.c b/fs/inode.c
index 72c4c347afb7..4e45d5ea3d0f 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -1625,7 +1625,8 @@ 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 e019ea2f1347..93caee80ce47 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2922,8 +2922,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.28.0




             reply	other threads:[~2020-08-31 10:13 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-31 10:13 Hao Li [this message]
2020-08-31 17:12 ` [PATCH] fs: Handle I_DONTCACHE in iput_final() instead of generic_drop_inode() Ira Weiny
2020-09-01  3:48   ` Li, Hao
2020-09-03 21:58 ` Dave Chinner
2020-09-04  7:07   ` Li, Hao
2020-11-10  2:56 Hao Li
2020-12-08  2:08 Hao Li

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200831101313.168889-1-lihao2018.fnst@cn.fujitsu.com \
    --to=lihao2018.fnst@cn.fujitsu.com \
    --cc=david@fromorbit.com \
    --cc=ira.weiny@intel.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    --cc=y-goto@fujitsu.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.