NFSD: return NFS4ERR_EXIST for a guarded OPEN of a non-regular object

Commit db8b567ffa98 ("nfsd: (almost) always open file in
nfsd4_create_file()") moved the regular-file type check ahead of the
createmode logic. A GUARDED4, EXCLUSIVE4, or EXCLUSIVE4_1 OPEN that
finds a directory or symbolic link under the requested name now fails
with NFS4ERR_ISDIR or NFS4ERR_SYMLINK instead of NFS4ERR_EXIST.

RFC 8881 Section 18.16.3 requires NFS4ERR_EXIST when a guarded create
finds any object under that name, or when an exclusive create's
verifier does not match. The type-specific errors in Section 18.16.4
apply to opening an existing file, which only UNCHECKED4 does.

Fixes: db8b567ffa98 ("nfsd: (almost) always open file in nfsd4_create_file()")
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20260906184141.3453309-1-cel@kernel.org
Signed-off-by: Chuck Lever <cel@kernel.org>
This commit is contained in:
Chuck Lever 2026-09-06 14:41:41 -04:00
parent 8d7859d165
commit 89318a02fe

View File

@ -430,7 +430,17 @@ nfsd4_create_file(struct svc_rqst *rqstp, struct svc_fh *fhp,
oflags,
open->op_iattr.ia_mode);
if (IS_ERR(open->op_filp)) {
status = nfserrno(PTR_ERR(open->op_filp));
int hosterr = PTR_ERR(open->op_filp);
if (open->op_createmode != NFS4_CREATE_UNCHECKED) {
switch (hosterr) {
case -EISDIR:
case -ELOOP:
case -EFTYPE:
hosterr = -EEXIST;
}
}
status = nfserrno(hosterr);
open->op_filp = NULL;
if (status == nfserr_noent && create_status)
status = create_status;