]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
NFSv2/v3: Fix error handling in nfs_atomic_open_v23()
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 28 Oct 2025 21:27:43 +0000 (17:27 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Nov 2025 09:35:54 +0000 (10:35 +0100)
[ Upstream commit 85d2c2392ac6348e1171d627497034a341a250c1 ]

When nfs_do_create() returns an EEXIST error, it means that a regular
file could not be created. That could mean that a symlink needs to be
resolved. If that's the case, a lookup needs to be kicked off.

Reported-by: Stephen Abbene <sabbene87@gmail.com>
Link: https://bugzilla.kernel.org/show_bug.cgi?id=220710
Fixes: 7c6c5249f061 ("NFS: add atomic_open for NFSv3 to handle O_TRUNC correctly.")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Reviewed-by: NeilBrown <neil@brown.name>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfs/dir.c

index c05c737ac5282bf02ec7d487fff19ed944993a2b..048ce25ebfb705cad83c614e22d0d5757f7b8ddb 100644 (file)
@@ -2280,11 +2280,12 @@ int nfs_atomic_open_v23(struct inode *dir, struct dentry *dentry,
                return -ENAMETOOLONG;
 
        if (open_flags & O_CREAT) {
-               file->f_mode |= FMODE_CREATED;
                error = nfs_do_create(dir, dentry, mode, open_flags);
-               if (error)
+               if (!error) {
+                       file->f_mode |= FMODE_CREATED;
+                       return finish_open(file, dentry, NULL);
+               } else if (error != -EEXIST || open_flags & O_EXCL)
                        return error;
-               return finish_open(file, dentry, NULL);
        }
        if (d_in_lookup(dentry)) {
                /* The only flags nfs_lookup considers are