linux/fs/nfsd
Chuck Lever d3d885507b NFSD: Fix verifier returned in stable WRITEs
commit f11ad7aa65 upstream.

RFC 8881 explains the purpose of the write verifier this way:

> The final portion of the result is the field writeverf. This field
> is the write verifier and is a cookie that the client can use to
> determine whether a server has changed instance state (e.g., server
> restart) between a call to WRITE and a subsequent call to either
> WRITE or COMMIT.

But then it says:

> This cookie MUST be unchanged during a single instance of the
> NFSv4.1 server and MUST be unique between instances of the NFSv4.1
> server. If the cookie changes, then the client MUST assume that
> any data written with an UNSTABLE4 value for committed and an old
> writeverf in the reply has been lost and will need to be
> recovered.

RFC 1813 has similar language for NFSv3. NFSv2 does not have a write
verifier since it doesn't implement the COMMIT procedure.

Since commit 19e0663ff9 ("nfsd: Ensure sampling of the write
verifier is atomic with the write"), the Linux NFS server has
returned a boot-time-based verifier for UNSTABLE WRITEs, but a zero
verifier for FILE_SYNC and DATA_SYNC WRITEs. FILE_SYNC and DATA_SYNC
WRITEs are not followed up with a COMMIT, so there's no need for
clients to compare verifiers for stable writes.

However, by returning a different verifier for stable and unstable
writes, the above commit puts the Linux NFS server a step farther
out of compliance with the first MUST above. At least one NFS client
(FreeBSD) noticed the difference, making this a potential
regression.

[Removed down_write to fix the conflict in the cherry-pick. The
down_write functionality was no longer needed there. Upstream commit
555dbf1a9a titled nfsd: Replace use of
rwsem with errseq_t removed those and replace it with new functionality
that was more scalable. This commit is already backported onto 5.10 and
so removing down_write ensures consistency with that change. Tested by
compiling and booting successfully. - kochera]

Reported-by: Rick Macklem <rmacklem@uoguelph.ca>
Link: https://lore.kernel.org/linux-nfs/YQXPR0101MB096857EEACF04A6DF1FC6D9BDD749@YQXPR0101MB0968.CANPRD01.PROD.OUTLOOK.COM/T/
Fixes: 19e0663ff9 ("nfsd: Ensure sampling of the write verifier is atomic with the write")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Michael Kochera <kochera@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-09-15 11:32:02 +02:00
..
acl.h
auth.c
auth.h
blocklayout.c
blocklayoutxdr.c
blocklayoutxdr.h
cache.h
current_stateid.h
export.c
export.h
fault_inject.c
filecache.c nfsd: Replace use of rwsem with errseq_t 2022-06-22 14:13:12 +02:00
filecache.h nfsd: Replace use of rwsem with errseq_t 2022-06-22 14:13:12 +02:00
flexfilelayout.c
flexfilelayoutxdr.c
flexfilelayoutxdr.h
idmap.h
Kconfig
lockd.c
Makefile
netns.h
nfs2acl.c
nfs3acl.c
nfs3proc.c NFSD: Clamp WRITE offsets 2022-02-16 12:54:17 +01:00
nfs3xdr.c
nfs4acl.c
nfs4callback.c NFSD: fix error handling in NFSv4.0 callbacks 2021-04-07 15:00:05 +02:00
nfs4idmap.c
nfs4layouts.c
nfs4proc.c nfsd: Replace use of rwsem with errseq_t 2022-06-22 14:13:12 +02:00
nfs4recover.c nfsd: Fix nsfd startup race (again) 2021-12-14 11:32:39 +01:00
nfs4state.c NFSD: Fix possible sleep during nfsd4_release_lockowner() 2022-06-06 08:42:45 +02:00
nfs4xdr.c nfsd4: Handle the NFSv4 READDIR 'dircount' hint being zero 2021-10-13 10:04:24 +02:00
nfscache.c
nfsctl.c fsnotify: fix fsnotify hooks in pseudo filesystems 2022-02-01 17:25:39 +01:00
nfsd.h
nfsfh.c
nfsfh.h
nfsproc.c NFSD: prevent underflow in nfssvc_decode_writeargs() 2022-04-08 14:39:51 +02:00
nfssvc.c
nfsxdr.c
pnfs.h
state.h
stats.c
stats.h
trace.c
trace.h NFSD: Fix offset type in I/O trace points 2022-02-16 12:54:17 +01:00
vfs.c NFSD: Fix verifier returned in stable WRITEs 2022-09-15 11:32:02 +02:00
vfs.h
xdr.h NFSD: prevent underflow in nfssvc_decode_writeargs() 2022-04-08 14:39:51 +02:00
xdr3.h
xdr4.h
xdr4cb.h