]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - queue-5.10/fuse-don-t-unhash-root.patch
5.10-stable patches
[thirdparty/kernel/stable-queue.git] / queue-5.10 / fuse-don-t-unhash-root.patch
CommitLineData
b7ca0ba0
SL
1From 1d1a3dcaabf48c515ec575726aa68829983e4861 Mon Sep 17 00:00:00 2001
2From: Sasha Levin <sashal@kernel.org>
3Date: Wed, 28 Feb 2024 16:50:49 +0100
4Subject: fuse: don't unhash root
5
6From: Miklos Szeredi <mszeredi@redhat.com>
7
8[ Upstream commit b1fe686a765e6c0d71811d825b5a1585a202b777 ]
9
10The root inode is assumed to be always hashed. Do not unhash the root
11inode even if it is marked BAD.
12
13Fixes: 5d069dbe8aaf ("fuse: fix bad inode")
14Cc: <stable@vger.kernel.org> # v5.11
15Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
16Signed-off-by: Sasha Levin <sashal@kernel.org>
17---
18 fs/fuse/fuse_i.h | 1 -
19 fs/fuse/inode.c | 7 +++++--
20 2 files changed, 5 insertions(+), 3 deletions(-)
21
22diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
23index ceaa6868386e6..33eb5fefc06b4 100644
24--- a/fs/fuse/fuse_i.h
25+++ b/fs/fuse/fuse_i.h
26@@ -873,7 +873,6 @@ static inline bool fuse_stale_inode(const struct inode *inode, int generation,
27
28 static inline void fuse_make_bad(struct inode *inode)
29 {
30- remove_inode_hash(inode);
31 set_bit(FUSE_I_BAD, &get_fuse_inode(inode)->state);
32 }
33
34diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
35index 9ea175ff9c8e6..4a7ebccd359ee 100644
36--- a/fs/fuse/inode.c
37+++ b/fs/fuse/inode.c
38@@ -352,8 +352,11 @@ struct inode *fuse_iget(struct super_block *sb, u64 nodeid,
39 } else if (fuse_stale_inode(inode, generation, attr)) {
40 /* nodeid was reused, any I/O on the old inode should fail */
41 fuse_make_bad(inode);
42- iput(inode);
43- goto retry;
44+ if (inode != d_inode(sb->s_root)) {
45+ remove_inode_hash(inode);
46+ iput(inode);
47+ goto retry;
48+ }
49 }
50 done:
51 fi = get_fuse_inode(inode);
52--
532.43.0
54