]> 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:32:12 +0000 (15:32 +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 bcbe34488862752154ca2284386baacadf972744..20924e799c9f59aa261cf591a43044c02768689c 100644 (file)
@@ -940,7 +940,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 516ea2979a90ff2d0eff63a71dc6b8edc4c91b98..f73865751c7323f3cce3c7d7586f974ad623f0a2 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);