* [PATCH v1] NFSD: return NFS4ERR_EXIST for a guarded OPEN of a non-regular object
@ 2026-09-06 18:41 Chuck Lever
2026-09-07 7:23 ` NeilBrown
0 siblings, 1 reply; 2+ messages in thread
From: Chuck Lever @ 2026-09-06 18:41 UTC (permalink / raw)
To: NeilBrown; +Cc: Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey, linux-nfs
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()")
Signed-off-by: Chuck Lever <cel@kernel.org>
---
fs/nfsd/nfs4proc.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
Neil, I'll apply this to nfsd-testing. It should be in time to get
into nfsd-next before v7.4.
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index bb74eef43938..3a82af381a8d 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -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;
--
2.54.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v1] NFSD: return NFS4ERR_EXIST for a guarded OPEN of a non-regular object
2026-09-06 18:41 [PATCH v1] NFSD: return NFS4ERR_EXIST for a guarded OPEN of a non-regular object Chuck Lever
@ 2026-09-07 7:23 ` NeilBrown
0 siblings, 0 replies; 2+ messages in thread
From: NeilBrown @ 2026-09-07 7:23 UTC (permalink / raw)
To: Chuck Lever
Cc: Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey, linux-nfs
On Mon, 07 Sep 2026, Chuck Lever wrote:
> 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()")
> Signed-off-by: Chuck Lever <cel@kernel.org>
> ---
> fs/nfsd/nfs4proc.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> Neil, I'll apply this to nfsd-testing. It should be in time to get
> into nfsd-next before v7.4.
>
>
> diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
> index bb74eef43938..3a82af381a8d 100644
> --- a/fs/nfsd/nfs4proc.c
> +++ b/fs/nfsd/nfs4proc.c
> @@ -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);
Thanks but I don't think this is the best place to fix it.
I think it would be best to put the fix in do_lookup_open() so that
it's behaviour more closely matches vfs_lookup_open().
I'll send an alternate patch.
Thanks,
NeilBrown
> open->op_filp = NULL;
> if (status == nfserr_noent && create_status)
> status = create_status;
> --
> 2.54.0
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-09-07 7:23 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-06 18:41 [PATCH v1] NFSD: return NFS4ERR_EXIST for a guarded OPEN of a non-regular object Chuck Lever
2026-09-07 7:23 ` NeilBrown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox