Commit 85d2c239 authored by Trond Myklebust's avatar Trond Myklebust Committed by Anna Schumaker
Browse files

NFSv2/v3: Fix error handling in nfs_atomic_open_v23()



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: default avatarStephen Abbene <sabbene87@gmail.com>
Link: https://bugzilla.kernel.org/show_bug.cgi?id=220710


Fixes: 7c6c5249 ("NFS: add atomic_open for NFSv3 to handle O_TRUNC correctly.")
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Reviewed-by: default avatarNeilBrown <neil@brown.name>
Signed-off-by: default avatarAnna Schumaker <anna.schumaker@oracle.com>
parent 6a218b9c
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -2268,11 +2268,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)
			return error;
		if (!error) {
			file->f_mode |= FMODE_CREATED;
			return finish_open(file, dentry, NULL);
		} else if (error != -EEXIST || open_flags & O_EXCL)
			return error;
	}
	if (d_in_lookup(dentry)) {
		/* The only flags nfs_lookup considers are