Skip to content

Commit 4678d1e

Browse files
author
Olga Kornievskaia
committed
NFSD: Force all NFSv4.2 COPY requests to be synchronous
JIRA: https://issues.redhat.com/browse/RHEL-64496 CVE: CVE-2024-49974 We're addressing this CVE by including an upstream fix that disables async copy because the fix for async copy upstream is still incomplete. Once async copy has been completely fixed upstream, we will include the upstream patch that re-enables it in RHEL and include all the fixes. commit 8d915bb Author: Chuck Lever <chuck.lever@oracle.com> Date: Tue May 7 09:37:14 2024 -0400 NFSD: Force all NFSv4.2 COPY requests to be synchronous We've discovered that delivering a CB_OFFLOAD operation can be unreliable in some pretty unremarkable situations. Examples include: - The server dropped the connection because it lost a forechannel NFSv4 request and wishes to force the client to retransmit - The GSS sequence number window under-flowed - A network partition occurred When that happens, all pending callback operations, including CB_OFFLOAD, are lost. NFSD does not retransmit them. Moreover, the Linux NFS client does not yet support sending an OFFLOAD_STATUS operation to probe whether an asynchronous COPY operation has finished. Thus, on Linux NFS clients, when a CB_OFFLOAD is lost, asynchronous COPY can hang until manually interrupted. I've tried a couple of remedies, but so far the side-effects are worse than the disease and they have had to be reverted. So temporarily force COPY operations to be synchronous so that the use of CB_OFFLOAD is avoided entirely. This is a fix that can easily be backported to LTS kernels. I am working on client patches that introduce an implementation of OFFLOAD_STATUS. Note that NFSD arbitrarily limits the size of a copy_file_range to 4MB to avoid indefinitely blocking an nfsd thread. A short COPY result is returned in that case, and the client can present a fresh COPY request for the remainder. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Olga Kornievskaia <okorniev@redhat.com>
1 parent 7653375 commit 4678d1e

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

fs/nfsd/nfs4proc.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1828,6 +1828,13 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
18281828
__be32 status;
18291829
struct nfsd4_copy *async_copy = NULL;
18301830

1831+
/*
1832+
* Currently, async COPY is not reliable. Force all COPY
1833+
* requests to be synchronous to avoid client application
1834+
* hangs waiting for COPY completion.
1835+
*/
1836+
nfsd4_copy_set_sync(copy, true);
1837+
18311838
copy->cp_clp = cstate->clp;
18321839
if (nfsd4_ssc_is_inter(copy)) {
18331840
trace_nfsd_copy_inter(copy);

0 commit comments

Comments
 (0)