Luís Henriques cfbffb
From: Jiachen Zhang <zhangjiachen.jaycee@bytedance.com>
Luís Henriques cfbffb
Date: Wed, 28 Sep 2022 20:19:34 +0800
Luís Henriques cfbffb
Subject: fuse: always revalidate rename target dentry
Luís Henriques cfbffb
Git-commit: ccc031e26afe60d2a5a3d93dabd9c978210825fb
Luís Henriques cfbffb
Patch-mainline: v6.2-rc1
Luís Henriques cfbffb
References: bsc#1211808
Luís Henriques cfbffb
Luís Henriques cfbffb
The previous commit df8629af2934 ("fuse: always revalidate if exclusive
Luís Henriques cfbffb
create") ensures that the dentries are revalidated on O_EXCL creates.  This
Luís Henriques cfbffb
commit complements it by also performing revalidation for rename target
Luís Henriques cfbffb
dentries.  Otherwise, a rename target file that only exists in kernel
Luís Henriques cfbffb
dentry cache but not in the filesystem will result in EEXIST if
Luís Henriques cfbffb
RENAME_NOREPLACE flag is used.
Luís Henriques cfbffb
Luís Henriques cfbffb
Signed-off-by: Jiachen Zhang <zhangjiachen.jaycee@bytedance.com>
Luís Henriques cfbffb
Signed-off-by: Zhang Tianci <zhangtianci.1997@bytedance.com>
Luís Henriques cfbffb
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Luís Henriques cfbffb
Acked-by: Luís Henriques <lhenriques@suse.de>
Luís Henriques cfbffb
Luís Henriques cfbffb
---
Luís Henriques cfbffb
 fs/fuse/dir.c | 2 +-
Luís Henriques cfbffb
 1 file changed, 1 insertion(+), 1 deletion(-)
Luís Henriques cfbffb
Luís Henriques cfbffb
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
Luís Henriques cfbffb
index d092c7d75929..2c4b08a6ec81 100644
Luís Henriques cfbffb
--- a/fs/fuse/dir.c
Luís Henriques cfbffb
+++ b/fs/fuse/dir.c
Luís Henriques cfbffb
@@ -214,7 +214,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
Luís Henriques cfbffb
 	if (inode && fuse_is_bad(inode))
Luís Henriques cfbffb
 		goto invalid;
Luís Henriques cfbffb
 	else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
Luís Henriques cfbffb
-		 (flags & (LOOKUP_EXCL | LOOKUP_REVAL))) {
Luís Henriques cfbffb
+		 (flags & (LOOKUP_EXCL | LOOKUP_REVAL | LOOKUP_RENAME_TARGET))) {
Luís Henriques cfbffb
 		struct fuse_entry_out outarg;
Luís Henriques cfbffb
 		FUSE_ARGS(args);
Luís Henriques cfbffb
 		struct fuse_forget_link *forget;
Luís Henriques cfbffb