Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

svcrdma: Use passed-in net namespace when creating RDMA listener

Ensure each RDMA listener and its children transports are created in
the same net namespace as the user that started the NFS service.
This is similar to how listener sockets are created in
svc_create_socket, required for enabling support for containers.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>

authored by

Chuck Lever and committed by
J. Bruce Fields
8dafcbee bcf3ffd4

+17 -18
+17 -18
net/sunrpc/xprtrdma/svc_rdma_transport.c
··· 60 60 #define RPCDBG_FACILITY RPCDBG_SVCXPRT 61 61 62 62 static int svc_rdma_post_recv(struct svcxprt_rdma *xprt); 63 - static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *, int); 63 + static struct svcxprt_rdma *svc_rdma_create_xprt(struct svc_serv *serv, 64 + struct net *net); 64 65 static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, 65 66 struct net *net, 66 67 struct sockaddr *sa, int salen, ··· 125 124 struct svcxprt_rdma *cma_xprt; 126 125 struct svc_xprt *xprt; 127 126 128 - cma_xprt = rdma_create_xprt(serv, 0); 127 + cma_xprt = svc_rdma_create_xprt(serv, net); 129 128 if (!cma_xprt) 130 129 return ERR_PTR(-ENOMEM); 131 130 xprt = &cma_xprt->sc_xprt; ··· 375 374 svc_xprt_put(&xprt->sc_xprt); 376 375 } 377 376 378 - static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv, 379 - int listener) 377 + static struct svcxprt_rdma *svc_rdma_create_xprt(struct svc_serv *serv, 378 + struct net *net) 380 379 { 381 380 struct svcxprt_rdma *cma_xprt = kzalloc(sizeof *cma_xprt, GFP_KERNEL); 382 381 383 - if (!cma_xprt) 382 + if (!cma_xprt) { 383 + dprintk("svcrdma: failed to create new transport\n"); 384 384 return NULL; 385 - svc_xprt_init(&init_net, &svc_rdma_class, &cma_xprt->sc_xprt, serv); 385 + } 386 + svc_xprt_init(net, &svc_rdma_class, &cma_xprt->sc_xprt, serv); 386 387 INIT_LIST_HEAD(&cma_xprt->sc_accept_q); 387 388 INIT_LIST_HEAD(&cma_xprt->sc_rq_dto_q); 388 389 INIT_LIST_HEAD(&cma_xprt->sc_read_complete_q); ··· 404 401 * transports are suitable here. 405 402 */ 406 403 set_bit(XPT_CONG_CTRL, &cma_xprt->sc_xprt.xpt_flags); 407 - 408 - if (listener) { 409 - strcpy(cma_xprt->sc_xprt.xpt_remotebuf, "listener"); 410 - set_bit(XPT_LISTENER, &cma_xprt->sc_xprt.xpt_flags); 411 - } 412 404 413 405 return cma_xprt; 414 406 } ··· 503 505 struct sockaddr *sa; 504 506 505 507 /* Create a new transport */ 506 - newxprt = rdma_create_xprt(listen_xprt->sc_xprt.xpt_server, 0); 507 - if (!newxprt) { 508 - dprintk("svcrdma: failed to create new transport\n"); 508 + newxprt = svc_rdma_create_xprt(listen_xprt->sc_xprt.xpt_server, 509 + listen_xprt->sc_xprt.xpt_net); 510 + if (!newxprt) 509 511 return; 510 - } 511 512 newxprt->sc_cm_id = new_cma_id; 512 513 new_cma_id->context = newxprt; 513 514 dprintk("svcrdma: Creating newxprt=%p, cm_id=%p, listenxprt=%p\n", ··· 632 635 struct svcxprt_rdma *cma_xprt; 633 636 int ret; 634 637 635 - dprintk("svcrdma: Creating RDMA socket\n"); 638 + dprintk("svcrdma: Creating RDMA listener\n"); 636 639 if ((sa->sa_family != AF_INET) && (sa->sa_family != AF_INET6)) { 637 640 dprintk("svcrdma: Address family %d is not supported.\n", sa->sa_family); 638 641 return ERR_PTR(-EAFNOSUPPORT); 639 642 } 640 - cma_xprt = rdma_create_xprt(serv, 1); 643 + cma_xprt = svc_rdma_create_xprt(serv, net); 641 644 if (!cma_xprt) 642 645 return ERR_PTR(-ENOMEM); 646 + set_bit(XPT_LISTENER, &cma_xprt->sc_xprt.xpt_flags); 647 + strcpy(cma_xprt->sc_xprt.xpt_remotebuf, "listener"); 643 648 644 - listen_id = rdma_create_id(&init_net, rdma_listen_handler, cma_xprt, 649 + listen_id = rdma_create_id(net, rdma_listen_handler, cma_xprt, 645 650 RDMA_PS_TCP, IB_QPT_RC); 646 651 if (IS_ERR(listen_id)) { 647 652 ret = PTR_ERR(listen_id);