mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
xprtrdma: Check frwr_wp_create() during connect
frwr_wp_create() creates the singleton Memory Region used to encode
padding for Write chunks whose payload length is not XDR-aligned. Its
failure paths return a negative errno and leave ep->re_write_pad_mr set
to NULL.
rpcrdma_xprt_connect() currently ignores that return value. If
frwr_wp_create() fails after the rest of the connection setup succeeds,
xprt_rdma_connect_worker() treats the connection attempt as successful
and sets XPRT_CONNECTED. A later NFS/RDMA read with a non-4-byte-aligned
receive page length reaches rpcrdma_encode_write_list(), passes the NULL
write-pad MR to encode_rdma_segment(), and dereferences it.
This is locally triggerable on an NFS/RDMA client after a connect or
reconnect hits a local MR allocation, DMA-map, MR-map, or post-send
failure; a remote peer alone cannot force the local MR setup failure.
Check the return value and fail the connect as -ENOTCONN, matching the
adjacent setup failures. This keeps XPRT_CONNECTED clear and lets the
normal reconnect path retry.
Fixes: 21037b8c22 ("xprtrdma: Provide a buffer to pad Write chunks of unaligned length")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <anna.schumaker@hammerspace.com>
This commit is contained in:
parent
bb7caa63e1
commit
0f13fc7c7d
|
|
@ -549,7 +549,17 @@ int rpcrdma_xprt_connect(struct rpcrdma_xprt *r_xprt)
|
|||
goto out;
|
||||
}
|
||||
rpcrdma_mrs_create(r_xprt);
|
||||
frwr_wp_create(r_xprt);
|
||||
|
||||
/*
|
||||
* rpcrdma_encode_write_list() dereferences the write-pad
|
||||
* MR with no NULL check, so fail the connect rather than
|
||||
* publish a transport whose write-pad MR is NULL.
|
||||
*/
|
||||
rc = frwr_wp_create(r_xprt);
|
||||
if (rc) {
|
||||
rc = -ENOTCONN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
trace_xprtrdma_connect(r_xprt, rc);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user