From 3e42620b5b79170ec219e52d2a7e915559addba4 Mon Sep 17 00:00:00 2001 From: Mr NeilBrown Date: Fri, 7 Feb 2020 13:05:56 +1100 Subject: [PATCH] LU-10391 lnet: change various function to return pointer Rather than returning an error code, and using a by-ref arg to return the socket pointer, the functions lnet_connect() lnet_sock_listen() lnet_sock_connect() now return the socket pointer or an ERR_PTR() with the error encoded. This is more in-keeping with kernel style. Signed-off-by: Mr NeilBrown Change-Id: Ic09d3bf38a89920a1298848d5c8a9017428cb752 Reviewed-on: https://review.whamcloud.com/37701 Reviewed-by: Aurelien Degremont Reviewed-by: James Simmons Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- lnet/include/lnet/lib-lnet.h | 13 ++++----- lnet/klnds/socklnd/socklnd_cb.c | 12 ++++---- lnet/lnet/acceptor.c | 29 ++++++++++--------- lnet/lnet/lib-socket.c | 63 ++++++++++++++++++++--------------------- 4 files changed, 59 insertions(+), 58 deletions(-) diff --git a/lnet/include/lnet/lib-lnet.h b/lnet/include/lnet/lib-lnet.h index c2fec37..031f9af 100644 --- a/lnet/include/lnet/lib-lnet.h +++ b/lnet/include/lnet/lib-lnet.h @@ -774,8 +774,8 @@ unsigned int lnet_get_lnd_timeout(void); void lnet_register_lnd(const struct lnet_lnd *lnd); void lnet_unregister_lnd(const struct lnet_lnd *lnd); -int lnet_connect(struct socket **sockp, lnet_nid_t peer_nid, - __u32 local_ip, __u32 peer_ip, int peer_port, struct net *ns); +struct socket *lnet_connect(lnet_nid_t peer_nid, __u32 local_ip, __u32 peer_ip, + int peer_port, struct net *ns); void lnet_connect_console_error(int rc, lnet_nid_t peer_nid, __u32 peer_ip, int port); int lnet_count_acceptor_nets(void); @@ -799,11 +799,10 @@ int lnet_sock_getaddr(struct socket *socket, bool remote, __u32 *ip, int *port); int lnet_sock_write(struct socket *sock, void *buffer, int nob, int timeout); int lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout); -int lnet_sock_listen(struct socket **sockp, __u32 ip, int port, int backlog, - struct net *ns); -int lnet_sock_connect(struct socket **sockp, - __u32 local_ip, int local_port, - __u32 peer_ip, int peer_port, struct net *ns); +struct socket *lnet_sock_listen(__u32 ip, int port, int backlog, + struct net *ns); +struct socket *lnet_sock_connect(__u32 local_ip, int local_port, + __u32 peer_ip, int peer_port, struct net *ns); int lnet_peers_start_down(void); int lnet_peer_buffer_credits(struct lnet_net *net); diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index acaa6b9..39cd22b 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -1985,12 +1985,14 @@ ksocknal_connect(struct ksock_route *route) goto failed; } - rc = lnet_connect(&sock, peer_ni->ksnp_id.nid, - route->ksnr_myipaddr, - route->ksnr_ipaddr, route->ksnr_port, - peer_ni->ksnp_ni->ni_net_ns); - if (rc != 0) + sock = lnet_connect(peer_ni->ksnp_id.nid, + route->ksnr_myipaddr, + route->ksnr_ipaddr, route->ksnr_port, + peer_ni->ksnp_ni->ni_net_ns); + if (IS_ERR(sock)) { + rc = PTR_ERR(sock); goto failed; + } rc = ksocknal_create_conn(peer_ni->ksnp_ni, route, sock, type); if (rc < 0) { diff --git a/lnet/lnet/acceptor.c b/lnet/lnet/acceptor.c index e1a18a4..1209b18 100644 --- a/lnet/lnet/acceptor.c +++ b/lnet/lnet/acceptor.c @@ -144,9 +144,9 @@ lnet_connect_console_error (int rc, lnet_nid_t peer_nid, } EXPORT_SYMBOL(lnet_connect_console_error); -int -lnet_connect(struct socket **sockp, lnet_nid_t peer_nid, - __u32 local_ip, __u32 peer_ip, int peer_port, struct net *ns) +struct socket * +lnet_connect(lnet_nid_t peer_nid, __u32 local_ip, __u32 peer_ip, + int peer_port, struct net *ns) { struct lnet_acceptor_connreq cr; struct socket *sock; @@ -160,10 +160,10 @@ lnet_connect(struct socket **sockp, lnet_nid_t peer_nid, --port) { /* Iterate through reserved ports. */ - rc = lnet_sock_connect(&sock, - local_ip, port, - peer_ip, peer_port, ns); - if (rc) { + sock = lnet_sock_connect(local_ip, port, + peer_ip, peer_port, ns); + if (IS_ERR(sock)) { + rc = PTR_ERR(sock); if (rc == -EADDRINUSE || rc == -EADDRNOTAVAIL) continue; goto failed; @@ -188,8 +188,7 @@ lnet_connect(struct socket **sockp, lnet_nid_t peer_nid, if (rc != 0) goto failed_sock; - *sockp = sock; - return 0; + return sock; } rc = -EADDRINUSE; @@ -199,7 +198,7 @@ failed_sock: sock_release(sock); failed: lnet_connect_console_error(rc, peer_nid, peer_ip, peer_port); - return rc; + return ERR_PTR(rc); } EXPORT_SYMBOL(lnet_connect); @@ -356,10 +355,11 @@ lnet_acceptor(void *arg) LASSERT(lnet_acceptor_state.pta_sock == NULL); - rc = lnet_sock_listen(&lnet_acceptor_state.pta_sock, - 0, accept_port, accept_backlog, - lnet_acceptor_state.pta_ns); - if (rc != 0) { + lnet_acceptor_state.pta_sock = + lnet_sock_listen(0, accept_port, accept_backlog, + lnet_acceptor_state.pta_ns); + if (IS_ERR(lnet_acceptor_state.pta_sock)) { + rc = PTR_ERR(lnet_acceptor_state.pta_sock); if (rc == -EADDRINUSE) LCONSOLE_ERROR_MSG(0x122, "Can't start acceptor on port" " %d: port already in use\n", @@ -371,6 +371,7 @@ lnet_acceptor(void *arg) lnet_acceptor_state.pta_sock = NULL; } else { + rc = 0; LCONSOLE(0, "Accept %s, port %d\n", accept_type, accept_port); init_waitqueue_head(&lnet_acceptor_state.pta_waitq); lnet_acceptor_state.pta_odata = diff --git a/lnet/lnet/lib-socket.c b/lnet/lnet/lib-socket.c index 70397ee..7c7406c 100644 --- a/lnet/lnet/lib-socket.c +++ b/lnet/lnet/lib-socket.c @@ -175,9 +175,8 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout) } EXPORT_SYMBOL(lnet_sock_read); -static int -lnet_sock_create(struct socket **sockp, - __u32 local_ip, int local_port, struct net *ns) +static struct socket * +lnet_sock_create(__u32 local_ip, int local_port, struct net *ns) { struct sockaddr_in locaddr; struct socket *sock; @@ -189,16 +188,15 @@ lnet_sock_create(struct socket **sockp, #else rc = sock_create_kern(PF_INET, SOCK_STREAM, 0, &sock); #endif - *sockp = sock; - if (rc != 0) { + if (rc) { CERROR("Can't create socket: %d\n", rc); - return rc; + return ERR_PTR(rc); } option = 1; rc = kernel_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&option, sizeof(option)); - if (rc != 0) { + if (rc) { CERROR("Can't set SO_REUSEADDR for socket: %d\n", rc); goto failed; } @@ -222,11 +220,11 @@ lnet_sock_create(struct socket **sockp, goto failed; } } - return 0; + return sock; failed: sock_release(sock); - return rc; + return ERR_PTR(rc); } int @@ -304,51 +302,52 @@ lnet_sock_getbuf(struct socket *sock, int *txbufsize, int *rxbufsize) } EXPORT_SYMBOL(lnet_sock_getbuf); -int -lnet_sock_listen(struct socket **sockp, - __u32 local_ip, int local_port, int backlog, struct net *ns) +struct socket * +lnet_sock_listen(__u32 local_ip, int local_port, int backlog, struct net *ns) { - int rc; + struct socket *sock; + int rc; - rc = lnet_sock_create(sockp, local_ip, local_port, ns); - if (rc != 0) { + sock = lnet_sock_create(local_ip, local_port, ns); + if (IS_ERR(sock)) { + rc = PTR_ERR(sock); if (rc == -EADDRINUSE) CERROR("Can't create socket: port %d already in use\n", local_port); - return rc; + return ERR_PTR(rc); } - rc = kernel_listen(*sockp, backlog); + rc = kernel_listen(sock, backlog); if (rc == 0) - return 0; + return sock; CERROR("Can't set listen backlog %d: %d\n", backlog, rc); - sock_release(*sockp); - return rc; + sock_release(sock); + return ERR_PTR(rc); } -int -lnet_sock_connect(struct socket **sockp, - __u32 local_ip, int local_port, +struct socket * +lnet_sock_connect(__u32 local_ip, int local_port, __u32 peer_ip, int peer_port, struct net *ns) { - struct sockaddr_in srvaddr; - int rc; + struct socket *sock; + struct sockaddr_in srvaddr; + int rc; - rc = lnet_sock_create(sockp, local_ip, local_port, ns); - if (rc != 0) - return rc; + sock = lnet_sock_create(local_ip, local_port, ns); + if (IS_ERR(sock)) + return sock; memset(&srvaddr, 0, sizeof(srvaddr)); srvaddr.sin_family = AF_INET; srvaddr.sin_port = htons(peer_port); srvaddr.sin_addr.s_addr = htonl(peer_ip); - rc = kernel_connect(*sockp, (struct sockaddr *)&srvaddr, + rc = kernel_connect(sock, (struct sockaddr *)&srvaddr, sizeof(srvaddr), 0); if (rc == 0) - return 0; + return sock; /* EADDRNOTAVAIL probably means we're already connected to the same * peer/port on the same local port on a differently typed @@ -359,6 +358,6 @@ lnet_sock_connect(struct socket **sockp, "Error %d connecting %pI4h/%d -> %pI4h/%d\n", rc, &local_ip, local_port, &peer_ip, peer_port); - sock_release(*sockp); - return rc; + sock_release(sock); + return ERR_PTR(rc); } -- 1.8.3.1