]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
fuse: don't unhash root
authorMiklos Szeredi <mszeredi@redhat.com>
Wed, 28 Feb 2024 15:50:49 +0000 (16:50 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Apr 2024 13:11:16 +0000 (15:11 +0200)
[ Upstream commit b1fe686a765e6c0d71811d825b5a1585a202b777 ]

The root inode is assumed to be always hashed.  Do not unhash the root
inode even if it is marked BAD.

Fixes: 5d069dbe8aaf ("fuse: fix bad inode")
Cc: <stable@vger.kernel.org> # v5.11
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/fuse/fuse_i.h
fs/fuse/inode.c

index 1df83eebda92771d20a42ea2aaefa118effcbc77..b5c241e16964da82d75d90c5a9cb169f1744eeeb 100644 (file)
@@ -939,7 +939,6 @@ static inline bool fuse_stale_inode(const struct inode *inode, int generation,
 
 static inline void fuse_make_bad(struct inode *inode)
 {
-       remove_inode_hash(inode);
        set_bit(FUSE_I_BAD, &get_fuse_inode(inode)->state);
 }
 
index 2a6d44f91729bbd7e3bf1c955a952ecdd695bd0f..b676c72c62adfc27af2e9300216d55b7183820bd 100644 (file)
@@ -469,8 +469,11 @@ retry:
        } else if (fuse_stale_inode(inode, generation, attr)) {
                /* nodeid was reused, any I/O on the old inode should fail */
                fuse_make_bad(inode);
-               iput(inode);
-               goto retry;
+               if (inode != d_inode(sb->s_root)) {
+                       remove_inode_hash(inode);
+                       iput(inode);
+                       goto retry;
+               }
        }
        fi = get_fuse_inode(inode);
        spin_lock(&fi->lock);