Commit 280254b6 authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Clean up xs_tcp_setup_sock()

Move the error handling into a single switch statement for clarity.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent ea9afca8
...@@ -2158,7 +2158,6 @@ static void xs_tcp_set_connect_timeout(struct rpc_xprt *xprt, ...@@ -2158,7 +2158,6 @@ static void xs_tcp_set_connect_timeout(struct rpc_xprt *xprt,
static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
{ {
struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
int ret = -ENOTCONN;
if (!transport->inet) { if (!transport->inet) {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
...@@ -2202,7 +2201,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) ...@@ -2202,7 +2201,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
} }
if (!xprt_bound(xprt)) if (!xprt_bound(xprt))
goto out; return -ENOTCONN;
xs_set_memalloc(xprt); xs_set_memalloc(xprt);
...@@ -2210,22 +2209,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) ...@@ -2210,22 +2209,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
/* Tell the socket layer to start connecting... */ /* Tell the socket layer to start connecting... */
set_bit(XPRT_SOCK_CONNECTING, &transport->sock_state); set_bit(XPRT_SOCK_CONNECTING, &transport->sock_state);
ret = kernel_connect(sock, xs_addr(xprt), xprt->addrlen, O_NONBLOCK); return kernel_connect(sock, xs_addr(xprt), xprt->addrlen, O_NONBLOCK);
switch (ret) {
case 0:
xs_set_srcport(transport, sock);
fallthrough;
case -EINPROGRESS:
/* SYN_SENT! */
if (xprt->reestablish_timeout < XS_TCP_INIT_REEST_TO)
xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO;
break;
case -EADDRNOTAVAIL:
/* Source port number is unavailable. Try a new one! */
transport->srcport = 0;
}
out:
return ret;
} }
/** /**
...@@ -2240,14 +2224,14 @@ static void xs_tcp_setup_socket(struct work_struct *work) ...@@ -2240,14 +2224,14 @@ static void xs_tcp_setup_socket(struct work_struct *work)
container_of(work, struct sock_xprt, connect_worker.work); container_of(work, struct sock_xprt, connect_worker.work);
struct socket *sock = transport->sock; struct socket *sock = transport->sock;
struct rpc_xprt *xprt = &transport->xprt; struct rpc_xprt *xprt = &transport->xprt;
int status = -EIO; int status;
if (!sock) { if (!sock) {
sock = xs_create_sock(xprt, transport, sock = xs_create_sock(xprt, transport,
xs_addr(xprt)->sa_family, SOCK_STREAM, xs_addr(xprt)->sa_family, SOCK_STREAM,
IPPROTO_TCP, true); IPPROTO_TCP, true);
if (IS_ERR(sock)) { if (IS_ERR(sock)) {
status = PTR_ERR(sock); xprt_wake_pending_tasks(xprt, PTR_ERR(sock));
goto out; goto out;
} }
} }
...@@ -2264,21 +2248,21 @@ static void xs_tcp_setup_socket(struct work_struct *work) ...@@ -2264,21 +2248,21 @@ static void xs_tcp_setup_socket(struct work_struct *work)
xprt, -status, xprt_connected(xprt), xprt, -status, xprt_connected(xprt),
sock->sk->sk_state); sock->sk->sk_state);
switch (status) { switch (status) {
default:
printk("%s: connect returned unhandled error %d\n",
__func__, status);
fallthrough;
case -EADDRNOTAVAIL:
/* We're probably in TIME_WAIT. Get rid of existing socket,
* and retry
*/
xs_tcp_force_close(xprt);
break;
case 0: case 0:
xs_set_srcport(transport, sock);
fallthrough;
case -EINPROGRESS: case -EINPROGRESS:
/* SYN_SENT! */
if (xprt->reestablish_timeout < XS_TCP_INIT_REEST_TO)
xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO;
fallthrough;
case -EALREADY: case -EALREADY:
xprt_unlock_connect(xprt, transport); goto out_unlock;
return; case -EADDRNOTAVAIL:
/* Source port number is unavailable. Try a new one! */
transport->srcport = 0;
status = -EAGAIN;
break;
case -EINVAL: case -EINVAL:
/* Happens, for instance, if the user specified a link /* Happens, for instance, if the user specified a link
* local IPv6 address without a scope-id. * local IPv6 address without a scope-id.
...@@ -2290,18 +2274,22 @@ static void xs_tcp_setup_socket(struct work_struct *work) ...@@ -2290,18 +2274,22 @@ static void xs_tcp_setup_socket(struct work_struct *work)
case -EHOSTUNREACH: case -EHOSTUNREACH:
case -EADDRINUSE: case -EADDRINUSE:
case -ENOBUFS: case -ENOBUFS:
/* xs_tcp_force_close() wakes tasks with a fixed error code. break;
* We need to wake them first to ensure the correct error code. default:
*/ printk("%s: connect returned unhandled error %d\n",
xprt_wake_pending_tasks(xprt, status); __func__, status);
xs_tcp_force_close(xprt); status = -EAGAIN;
goto out;
} }
status = -EAGAIN;
/* xs_tcp_force_close() wakes tasks with a fixed error code.
* We need to wake them first to ensure the correct error code.
*/
xprt_wake_pending_tasks(xprt, status);
xs_tcp_force_close(xprt);
out: out:
xprt_clear_connecting(xprt); xprt_clear_connecting(xprt);
out_unlock:
xprt_unlock_connect(xprt, transport); xprt_unlock_connect(xprt, transport);
xprt_wake_pending_tasks(xprt, status);
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment