Skip to content

Commit d1b586e

Browse files
committed
svcrdma: Handle ADDR_CHANGE CM event properly
Sagi tells me that when a bonded device reports an address change, the consumer must destroy its listener IDs and create new ones. See commit a032e4f ("nvmet-rdma: fix bonding failover possible NULL deref"). Suggested-by: Sagi Grimberg <[email protected]> Reviewed-by: Sagi Grimberg <[email protected]> Signed-off-by: Chuck Lever <[email protected]>
1 parent 283d285 commit d1b586e

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

net/sunrpc/xprtrdma/svc_rdma_transport.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,17 +284,31 @@ static void handle_connect_req(struct rdma_cm_id *new_cma_id,
284284
*
285285
* Return values:
286286
* %0: Do not destroy @cma_id
287-
* %1: Destroy @cma_id (never returned here)
287+
* %1: Destroy @cma_id
288288
*
289289
* NB: There is never a DEVICE_REMOVAL event for INADDR_ANY listeners.
290290
*/
291291
static int svc_rdma_listen_handler(struct rdma_cm_id *cma_id,
292292
struct rdma_cm_event *event)
293293
{
294+
struct sockaddr *sap = (struct sockaddr *)&cma_id->route.addr.src_addr;
295+
struct svcxprt_rdma *cma_xprt = cma_id->context;
296+
struct svc_xprt *cma_rdma = &cma_xprt->sc_xprt;
297+
struct rdma_cm_id *listen_id;
298+
294299
switch (event->event) {
295300
case RDMA_CM_EVENT_CONNECT_REQUEST:
296301
handle_connect_req(cma_id, &event->param.conn);
297302
break;
303+
case RDMA_CM_EVENT_ADDR_CHANGE:
304+
listen_id = svc_rdma_create_listen_id(cma_rdma->xpt_net,
305+
sap, cma_xprt);
306+
if (IS_ERR(listen_id)) {
307+
pr_err("Listener dead, address change failed for device %s\n",
308+
cma_id->device->name);
309+
} else
310+
cma_xprt->sc_cm_id = listen_id;
311+
return 1;
298312
default:
299313
break;
300314
}

0 commit comments

Comments
 (0)