]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/5.15.154/fuse-don-t-unhash-root.patch
Linux 5.15.154
[thirdparty/kernel/stable-queue.git] / releases / 5.15.154 / fuse-don-t-unhash-root.patch
1 From cb3e68017eeab61358f6313a558d774e2f490d19 Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Wed, 28 Feb 2024 16:50:49 +0100
4 Subject: fuse: don't unhash root
5
6 From: Miklos Szeredi <mszeredi@redhat.com>
7
8 [ Upstream commit b1fe686a765e6c0d71811d825b5a1585a202b777 ]
9
10 The root inode is assumed to be always hashed. Do not unhash the root
11 inode even if it is marked BAD.
12
13 Fixes: 5d069dbe8aaf ("fuse: fix bad inode")
14 Cc: <stable@vger.kernel.org> # v5.11
15 Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
16 Signed-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
22 diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
23 index 4b8f094345e12..55b7ca26fb8ab 100644
24 --- a/fs/fuse/fuse_i.h
25 +++ b/fs/fuse/fuse_i.h
26 @@ -899,7 +899,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
34 diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
35 index 97dc24557bf24..62b4143ccf26c 100644
36 --- a/fs/fuse/inode.c
37 +++ b/fs/fuse/inode.c
38 @@ -413,8 +413,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 fi = get_fuse_inode(inode);
51 spin_lock(&fi->lock);
52 --
53 2.43.0
54