]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fuse: don't unhash root
authorMiklos Szeredi <mszeredi@redhat.com>
Wed, 28 Feb 2024 15:50:49 +0000 (16:50 +0100)
committerMiklos Szeredi <mszeredi@redhat.com>
Tue, 5 Mar 2024 12:40:43 +0000 (13:40 +0100)
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>
fs/fuse/fuse_i.h
fs/fuse/inode.c

index 7bd3552b1e80abc3fe8996fc8ca84dd7d7985663..4ef6087f0e5cc4e2c98e12de67e850cf70aa2880 100644 (file)
@@ -994,7 +994,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 0186df5fc9ea38f7e9a9145519ceef84d713f44a..065b84efb6630321328761cd3945fd2974015f1f 100644 (file)
@@ -475,8 +475,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);