On Sat, Sep 16, 2023 at 2:19 PM <gregkh@xxxxxxxxxxxxxxxxxxx> wrote: > > > The patch below does not apply to the 4.19-stable tree. > If someone wants it applied there, or to any other stable or longterm > tree, then please email the backport, including the original git commit > id to <stable@xxxxxxxxxxxxxxx>. > > To reproduce the conflict and resubmit, you may use the following commands: > > git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-4.19.y > git checkout FETCH_HEAD > git cherry-pick -x b8bd342d50cbf606666488488f9fea374aceb2d5 Attaching the backport. This applies cleanly to v4.14 and v4.19. Thanks, Miklos
From 1d720709fc1972e4c6c7e548a37cb38997339fca Mon Sep 17 00:00:00 2001 From: ruanmeisi <ruan.meisi@xxxxxxxxxx> Date: Tue, 25 Apr 2023 19:13:54 +0800 Subject: [PATCH] fuse: nlookup missing decrement in fuse_direntplus_link During our debugging of glusterfs, we found an Assertion failed error: inode_lookup >= nlookup, which was caused by the nlookup value in the kernel being greater than that in the FUSE file system. The issue was introduced by fuse_direntplus_link, where in the function, fuse_iget increments nlookup, and if d_splice_alias returns failure, fuse_direntplus_link returns failure without decrementing nlookup https://github.com/gluster/glusterfs/pull/4081 Signed-off-by: ruanmeisi <ruan.meisi@xxxxxxxxxx> Fixes: 0b05b18381ee ("fuse: implement NFS-like readdirplus support") Cc: <stable@xxxxxxxxxxxxxxx> # v3.9 Signed-off-by: Miklos Szeredi <mszeredi@xxxxxxxxxx> (cherry picked from commit b8bd342d50cbf606666488488f9fea374aceb2d5) --- fs/fuse/dir.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 8e5125904762..bd602b7e8e46 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1299,8 +1299,16 @@ static int fuse_direntplus_link(struct file *file, dput(dentry); dentry = alias; } - if (IS_ERR(dentry)) + if (IS_ERR(dentry)) { + if (!IS_ERR(inode)) { + struct fuse_inode *fi = get_fuse_inode(inode); + + spin_lock(&fc->lock); + fi->nlookup--; + spin_unlock(&fc->lock); + } return PTR_ERR(dentry); + } } if (fc->readdirplus_auto) set_bit(FUSE_I_INIT_RDPLUS, &get_fuse_inode(inode)->state); -- 2.43.0