kernel_samsung_a53x/fs/nfsd
Chuck Lever 2543173ec6 NFSD: Fix zero-length NFSv3 WRITEs
[ Upstream commit 6a2f774424bfdcc2df3e17de0cefe74a4269cad5 ]

The Linux NFS server currently responds to a zero-length NFSv3 WRITE
request with NFS3ERR_IO. It responds to a zero-length NFSv4 WRITE
with NFS4_OK and count of zero.

RFC 1813 says of the WRITE procedure's @count argument:

count
         The number of bytes of data to be written. If count is
         0, the WRITE will succeed and return a count of 0,
         barring errors due to permissions checking.

RFC 8881 has similar language for NFSv4, though NFSv4 removed the
explicit @count argument because that value is already contained in
the opaque payload array.

The synthetic client pynfs's WRT4 and WRT15 tests do emit zero-
length WRITEs to exercise this spec requirement. Commit fdec6114ee1f
("nfsd4: zero-length WRITE should succeed") addressed the same
problem there with the same fix.

But interestingly the Linux NFS client does not appear to emit zero-
length WRITEs, instead squelching them. I'm not aware of a test that
can generate such WRITEs for NFSv3, so I wrote a naive C program to
generate a zero-length WRITE and test this fix.

Fixes: 8154ef2776aa ("NFSD: Clean up legacy NFS WRITE argument XDR decoders")
Reported-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Cc: stable@vger.kernel.org
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-11-19 12:27:52 +01: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: simplify per-net file cache management 2024-11-19 12:27:51 +01:00
filecache.h
flexfilelayout.c
flexfilelayoutxdr.c
flexfilelayoutxdr.h
idmap.h
Kconfig NFSv4.2: Remove ifdef CONFIG_NFSD from NFSv4.2 client SSC code. 2024-11-19 12:27:37 +01:00
lockd.c Keep read and write fds with each nlm_file 2024-11-19 12:27:44 +01:00
Makefile
netns.h NFSD: simplify per-net file cache management 2024-11-19 12:27:51 +01:00
nfs2acl.c SUNRPC: Change return value type of .pc_encode 2024-11-19 12:27:48 +01:00
nfs3acl.c SUNRPC: Change return value type of .pc_encode 2024-11-19 12:27:48 +01:00
nfs3proc.c NFSD: Fix zero-length NFSv3 WRITEs 2024-11-19 12:27:52 +01:00
nfs3xdr.c SUNRPC: Change return value type of .pc_encode 2024-11-19 12:27:48 +01:00
nfs4acl.c
nfs4callback.c nfsd: rpc_peeraddr2str needs rcu lock 2024-11-19 12:27:39 +01:00
nfs4idmap.c
nfs4layouts.c
nfs4proc.c NFSD: Fix sparse warning 2024-11-19 12:27:50 +01:00
nfs4recover.c nfsd: Log client tracking type log message as info instead of warning 2024-11-19 12:27:36 +01:00
nfs4state.c nfsd4: add refcount for nfsd4_blocked_lock 2024-11-19 12:27:52 +01:00
nfs4xdr.c NFSD: De-duplicate nfsd4_decode_bitmap4() 2024-11-19 12:27:51 +01:00
nfscache.c NFSD: Remove be32_to_cpu() from DRC hash function 2024-11-19 12:27:51 +01:00
nfsctl.c NFSD: simplify locking for network notifier. 2024-11-19 12:27:50 +01:00
nfsd.h SUNRPC/NFSD: clean up get/put functions. 2024-11-19 12:27:50 +01:00
nfsfh.c
nfsfh.h NFSD: Constify @fh argument of knfsd_fh_hash() 2024-11-19 12:27:38 +01:00
nfsproc.c NFSD: Fix zero-length NFSv3 WRITEs 2024-11-19 12:27:52 +01:00
nfssvc.c NFSD: simplify locking for network notifier. 2024-11-19 12:27:50 +01:00
nfsxdr.c SUNRPC: Change return value type of .pc_encode 2024-11-19 12:27:48 +01:00
pnfs.h
state.h nfsd4: add refcount for nfsd4_blocked_lock 2024-11-19 12:27:52 +01:00
stats.c nfsd: make nfsd_stats.th_cnt atomic_t 2024-11-19 12:27:50 +01:00
stats.h nfsd: make nfsd_stats.th_cnt atomic_t 2024-11-19 12:27:50 +01:00
trace.c
trace.h NFSD: Combine XDR error tracepoints 2024-11-19 12:27:51 +01:00
vfs.c nfsd4: remove obselete comment 2024-11-19 12:27:48 +01:00
vfs.h
xdr.h SUNRPC: Change return value type of .pc_encode 2024-11-19 12:27:48 +01:00
xdr3.h SUNRPC: Change return value type of .pc_encode 2024-11-19 12:27:48 +01:00
xdr4.h SUNRPC: Change return value type of .pc_encode 2024-11-19 12:27:48 +01:00
xdr4cb.h