aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/xprtsock.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc/xprtsock.c')
-rw-r--r--net/sunrpc/xprtsock.c381
1 files changed, 245 insertions, 136 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 568330eebbfe..e18596146013 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -49,6 +49,9 @@ unsigned int xprt_tcp_slot_table_entries = RPC_DEF_SLOT_TABLE;
49unsigned int xprt_min_resvport = RPC_DEF_MIN_RESVPORT; 49unsigned int xprt_min_resvport = RPC_DEF_MIN_RESVPORT;
50unsigned int xprt_max_resvport = RPC_DEF_MAX_RESVPORT; 50unsigned int xprt_max_resvport = RPC_DEF_MAX_RESVPORT;
51 51
52#define XS_TCP_LINGER_TO (15U * HZ)
53static unsigned int xs_tcp_fin_timeout __read_mostly = XS_TCP_LINGER_TO;
54
52/* 55/*
53 * We can register our own files under /proc/sys/sunrpc by 56 * We can register our own files under /proc/sys/sunrpc by
54 * calling register_sysctl_table() again. The files in that 57 * calling register_sysctl_table() again. The files in that
@@ -117,6 +120,14 @@ static ctl_table xs_tunables_table[] = {
117 .extra2 = &xprt_max_resvport_limit 120 .extra2 = &xprt_max_resvport_limit
118 }, 121 },
119 { 122 {
123 .procname = "tcp_fin_timeout",
124 .data = &xs_tcp_fin_timeout,
125 .maxlen = sizeof(xs_tcp_fin_timeout),
126 .mode = 0644,
127 .proc_handler = &proc_dointvec_jiffies,
128 .strategy = sysctl_jiffies
129 },
130 {
120 .ctl_name = 0, 131 .ctl_name = 0,
121 }, 132 },
122}; 133};
@@ -521,11 +532,12 @@ static void xs_nospace_callback(struct rpc_task *task)
521 * @task: task to put to sleep 532 * @task: task to put to sleep
522 * 533 *
523 */ 534 */
524static void xs_nospace(struct rpc_task *task) 535static int xs_nospace(struct rpc_task *task)
525{ 536{
526 struct rpc_rqst *req = task->tk_rqstp; 537 struct rpc_rqst *req = task->tk_rqstp;
527 struct rpc_xprt *xprt = req->rq_xprt; 538 struct rpc_xprt *xprt = req->rq_xprt;
528 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 539 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
540 int ret = 0;
529 541
530 dprintk("RPC: %5u xmit incomplete (%u left of %u)\n", 542 dprintk("RPC: %5u xmit incomplete (%u left of %u)\n",
531 task->tk_pid, req->rq_slen - req->rq_bytes_sent, 543 task->tk_pid, req->rq_slen - req->rq_bytes_sent,
@@ -537,6 +549,7 @@ static void xs_nospace(struct rpc_task *task)
537 /* Don't race with disconnect */ 549 /* Don't race with disconnect */
538 if (xprt_connected(xprt)) { 550 if (xprt_connected(xprt)) {
539 if (test_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags)) { 551 if (test_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags)) {
552 ret = -EAGAIN;
540 /* 553 /*
541 * Notify TCP that we're limited by the application 554 * Notify TCP that we're limited by the application
542 * window size 555 * window size
@@ -548,10 +561,11 @@ static void xs_nospace(struct rpc_task *task)
548 } 561 }
549 } else { 562 } else {
550 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags); 563 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags);
551 task->tk_status = -ENOTCONN; 564 ret = -ENOTCONN;
552 } 565 }
553 566
554 spin_unlock_bh(&xprt->transport_lock); 567 spin_unlock_bh(&xprt->transport_lock);
568 return ret;
555} 569}
556 570
557/** 571/**
@@ -594,6 +608,8 @@ static int xs_udp_send_request(struct rpc_task *task)
594 /* Still some bytes left; set up for a retry later. */ 608 /* Still some bytes left; set up for a retry later. */
595 status = -EAGAIN; 609 status = -EAGAIN;
596 } 610 }
611 if (!transport->sock)
612 goto out;
597 613
598 switch (status) { 614 switch (status) {
599 case -ENOTSOCK: 615 case -ENOTSOCK:
@@ -601,21 +617,19 @@ static int xs_udp_send_request(struct rpc_task *task)
601 /* Should we call xs_close() here? */ 617 /* Should we call xs_close() here? */
602 break; 618 break;
603 case -EAGAIN: 619 case -EAGAIN:
604 xs_nospace(task); 620 status = xs_nospace(task);
605 break; 621 break;
622 default:
623 dprintk("RPC: sendmsg returned unrecognized error %d\n",
624 -status);
606 case -ENETUNREACH: 625 case -ENETUNREACH:
607 case -EPIPE: 626 case -EPIPE:
608 case -ECONNREFUSED: 627 case -ECONNREFUSED:
609 /* When the server has died, an ICMP port unreachable message 628 /* When the server has died, an ICMP port unreachable message
610 * prompts ECONNREFUSED. */ 629 * prompts ECONNREFUSED. */
611 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags); 630 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags);
612 break;
613 default:
614 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags);
615 dprintk("RPC: sendmsg returned unrecognized error %d\n",
616 -status);
617 } 631 }
618 632out:
619 return status; 633 return status;
620} 634}
621 635
@@ -697,6 +711,8 @@ static int xs_tcp_send_request(struct rpc_task *task)
697 status = -EAGAIN; 711 status = -EAGAIN;
698 break; 712 break;
699 } 713 }
714 if (!transport->sock)
715 goto out;
700 716
701 switch (status) { 717 switch (status) {
702 case -ENOTSOCK: 718 case -ENOTSOCK:
@@ -704,23 +720,19 @@ static int xs_tcp_send_request(struct rpc_task *task)
704 /* Should we call xs_close() here? */ 720 /* Should we call xs_close() here? */
705 break; 721 break;
706 case -EAGAIN: 722 case -EAGAIN:
707 xs_nospace(task); 723 status = xs_nospace(task);
708 break; 724 break;
725 default:
726 dprintk("RPC: sendmsg returned unrecognized error %d\n",
727 -status);
709 case -ECONNRESET: 728 case -ECONNRESET:
729 case -EPIPE:
710 xs_tcp_shutdown(xprt); 730 xs_tcp_shutdown(xprt);
711 case -ECONNREFUSED: 731 case -ECONNREFUSED:
712 case -ENOTCONN: 732 case -ENOTCONN:
713 case -EPIPE:
714 status = -ENOTCONN;
715 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags);
716 break;
717 default:
718 dprintk("RPC: sendmsg returned unrecognized error %d\n",
719 -status);
720 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags); 733 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags);
721 xs_tcp_shutdown(xprt);
722 } 734 }
723 735out:
724 return status; 736 return status;
725} 737}
726 738
@@ -767,23 +779,13 @@ static void xs_restore_old_callbacks(struct sock_xprt *transport, struct sock *s
767 sk->sk_error_report = transport->old_error_report; 779 sk->sk_error_report = transport->old_error_report;
768} 780}
769 781
770/** 782static void xs_reset_transport(struct sock_xprt *transport)
771 * xs_close - close a socket
772 * @xprt: transport
773 *
774 * This is used when all requests are complete; ie, no DRC state remains
775 * on the server we want to save.
776 */
777static void xs_close(struct rpc_xprt *xprt)
778{ 783{
779 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
780 struct socket *sock = transport->sock; 784 struct socket *sock = transport->sock;
781 struct sock *sk = transport->inet; 785 struct sock *sk = transport->inet;
782 786
783 if (!sk) 787 if (sk == NULL)
784 goto clear_close_wait; 788 return;
785
786 dprintk("RPC: xs_close xprt %p\n", xprt);
787 789
788 write_lock_bh(&sk->sk_callback_lock); 790 write_lock_bh(&sk->sk_callback_lock);
789 transport->inet = NULL; 791 transport->inet = NULL;
@@ -797,14 +799,42 @@ static void xs_close(struct rpc_xprt *xprt)
797 sk->sk_no_check = 0; 799 sk->sk_no_check = 0;
798 800
799 sock_release(sock); 801 sock_release(sock);
800clear_close_wait: 802}
803
804/**
805 * xs_close - close a socket
806 * @xprt: transport
807 *
808 * This is used when all requests are complete; ie, no DRC state remains
809 * on the server we want to save.
810 *
811 * The caller _must_ be holding XPRT_LOCKED in order to avoid issues with
812 * xs_reset_transport() zeroing the socket from underneath a writer.
813 */
814static void xs_close(struct rpc_xprt *xprt)
815{
816 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
817
818 dprintk("RPC: xs_close xprt %p\n", xprt);
819
820 xs_reset_transport(transport);
821
801 smp_mb__before_clear_bit(); 822 smp_mb__before_clear_bit();
823 clear_bit(XPRT_CONNECTION_ABORT, &xprt->state);
802 clear_bit(XPRT_CLOSE_WAIT, &xprt->state); 824 clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
803 clear_bit(XPRT_CLOSING, &xprt->state); 825 clear_bit(XPRT_CLOSING, &xprt->state);
804 smp_mb__after_clear_bit(); 826 smp_mb__after_clear_bit();
805 xprt_disconnect_done(xprt); 827 xprt_disconnect_done(xprt);
806} 828}
807 829
830static void xs_tcp_close(struct rpc_xprt *xprt)
831{
832 if (test_and_clear_bit(XPRT_CONNECTION_CLOSE, &xprt->state))
833 xs_close(xprt);
834 else
835 xs_tcp_shutdown(xprt);
836}
837
808/** 838/**
809 * xs_destroy - prepare to shutdown a transport 839 * xs_destroy - prepare to shutdown a transport
810 * @xprt: doomed transport 840 * @xprt: doomed transport
@@ -1126,6 +1156,47 @@ out:
1126 read_unlock(&sk->sk_callback_lock); 1156 read_unlock(&sk->sk_callback_lock);
1127} 1157}
1128 1158
1159/*
1160 * Do the equivalent of linger/linger2 handling for dealing with
1161 * broken servers that don't close the socket in a timely
1162 * fashion
1163 */
1164static void xs_tcp_schedule_linger_timeout(struct rpc_xprt *xprt,
1165 unsigned long timeout)
1166{
1167 struct sock_xprt *transport;
1168
1169 if (xprt_test_and_set_connecting(xprt))
1170 return;
1171 set_bit(XPRT_CONNECTION_ABORT, &xprt->state);
1172 transport = container_of(xprt, struct sock_xprt, xprt);
1173 queue_delayed_work(rpciod_workqueue, &transport->connect_worker,
1174 timeout);
1175}
1176
1177static void xs_tcp_cancel_linger_timeout(struct rpc_xprt *xprt)
1178{
1179 struct sock_xprt *transport;
1180
1181 transport = container_of(xprt, struct sock_xprt, xprt);
1182
1183 if (!test_bit(XPRT_CONNECTION_ABORT, &xprt->state) ||
1184 !cancel_delayed_work(&transport->connect_worker))
1185 return;
1186 clear_bit(XPRT_CONNECTION_ABORT, &xprt->state);
1187 xprt_clear_connecting(xprt);
1188}
1189
1190static void xs_sock_mark_closed(struct rpc_xprt *xprt)
1191{
1192 smp_mb__before_clear_bit();
1193 clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
1194 clear_bit(XPRT_CLOSING, &xprt->state);
1195 smp_mb__after_clear_bit();
1196 /* Mark transport as closed and wake up all pending tasks */
1197 xprt_disconnect_done(xprt);
1198}
1199
1129/** 1200/**
1130 * xs_tcp_state_change - callback to handle TCP socket state changes 1201 * xs_tcp_state_change - callback to handle TCP socket state changes
1131 * @sk: socket whose state has changed 1202 * @sk: socket whose state has changed
@@ -1158,7 +1229,7 @@ static void xs_tcp_state_change(struct sock *sk)
1158 transport->tcp_flags = 1229 transport->tcp_flags =
1159 TCP_RCV_COPY_FRAGHDR | TCP_RCV_COPY_XID; 1230 TCP_RCV_COPY_FRAGHDR | TCP_RCV_COPY_XID;
1160 1231
1161 xprt_wake_pending_tasks(xprt, 0); 1232 xprt_wake_pending_tasks(xprt, -EAGAIN);
1162 } 1233 }
1163 spin_unlock_bh(&xprt->transport_lock); 1234 spin_unlock_bh(&xprt->transport_lock);
1164 break; 1235 break;
@@ -1171,10 +1242,10 @@ static void xs_tcp_state_change(struct sock *sk)
1171 clear_bit(XPRT_CONNECTED, &xprt->state); 1242 clear_bit(XPRT_CONNECTED, &xprt->state);
1172 clear_bit(XPRT_CLOSE_WAIT, &xprt->state); 1243 clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
1173 smp_mb__after_clear_bit(); 1244 smp_mb__after_clear_bit();
1245 xs_tcp_schedule_linger_timeout(xprt, xs_tcp_fin_timeout);
1174 break; 1246 break;
1175 case TCP_CLOSE_WAIT: 1247 case TCP_CLOSE_WAIT:
1176 /* The server initiated a shutdown of the socket */ 1248 /* The server initiated a shutdown of the socket */
1177 set_bit(XPRT_CLOSING, &xprt->state);
1178 xprt_force_disconnect(xprt); 1249 xprt_force_disconnect(xprt);
1179 case TCP_SYN_SENT: 1250 case TCP_SYN_SENT:
1180 xprt->connect_cookie++; 1251 xprt->connect_cookie++;
@@ -1187,40 +1258,35 @@ static void xs_tcp_state_change(struct sock *sk)
1187 xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO; 1258 xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO;
1188 break; 1259 break;
1189 case TCP_LAST_ACK: 1260 case TCP_LAST_ACK:
1261 set_bit(XPRT_CLOSING, &xprt->state);
1262 xs_tcp_schedule_linger_timeout(xprt, xs_tcp_fin_timeout);
1190 smp_mb__before_clear_bit(); 1263 smp_mb__before_clear_bit();
1191 clear_bit(XPRT_CONNECTED, &xprt->state); 1264 clear_bit(XPRT_CONNECTED, &xprt->state);
1192 smp_mb__after_clear_bit(); 1265 smp_mb__after_clear_bit();
1193 break; 1266 break;
1194 case TCP_CLOSE: 1267 case TCP_CLOSE:
1195 smp_mb__before_clear_bit(); 1268 xs_tcp_cancel_linger_timeout(xprt);
1196 clear_bit(XPRT_CLOSE_WAIT, &xprt->state); 1269 xs_sock_mark_closed(xprt);
1197 clear_bit(XPRT_CLOSING, &xprt->state);
1198 smp_mb__after_clear_bit();
1199 /* Mark transport as closed and wake up all pending tasks */
1200 xprt_disconnect_done(xprt);
1201 } 1270 }
1202 out: 1271 out:
1203 read_unlock(&sk->sk_callback_lock); 1272 read_unlock(&sk->sk_callback_lock);
1204} 1273}
1205 1274
1206/** 1275/**
1207 * xs_tcp_error_report - callback mainly for catching RST events 1276 * xs_error_report - callback mainly for catching socket errors
1208 * @sk: socket 1277 * @sk: socket
1209 */ 1278 */
1210static void xs_tcp_error_report(struct sock *sk) 1279static void xs_error_report(struct sock *sk)
1211{ 1280{
1212 struct rpc_xprt *xprt; 1281 struct rpc_xprt *xprt;
1213 1282
1214 read_lock(&sk->sk_callback_lock); 1283 read_lock(&sk->sk_callback_lock);
1215 if (sk->sk_err != ECONNRESET || sk->sk_state != TCP_ESTABLISHED)
1216 goto out;
1217 if (!(xprt = xprt_from_sock(sk))) 1284 if (!(xprt = xprt_from_sock(sk)))
1218 goto out; 1285 goto out;
1219 dprintk("RPC: %s client %p...\n" 1286 dprintk("RPC: %s client %p...\n"
1220 "RPC: error %d\n", 1287 "RPC: error %d\n",
1221 __func__, xprt, sk->sk_err); 1288 __func__, xprt, sk->sk_err);
1222 1289 xprt_wake_pending_tasks(xprt, -EAGAIN);
1223 xprt_force_disconnect(xprt);
1224out: 1290out:
1225 read_unlock(&sk->sk_callback_lock); 1291 read_unlock(&sk->sk_callback_lock);
1226} 1292}
@@ -1494,6 +1560,7 @@ static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
1494 sk->sk_user_data = xprt; 1560 sk->sk_user_data = xprt;
1495 sk->sk_data_ready = xs_udp_data_ready; 1561 sk->sk_data_ready = xs_udp_data_ready;
1496 sk->sk_write_space = xs_udp_write_space; 1562 sk->sk_write_space = xs_udp_write_space;
1563 sk->sk_error_report = xs_error_report;
1497 sk->sk_no_check = UDP_CSUM_NORCV; 1564 sk->sk_no_check = UDP_CSUM_NORCV;
1498 sk->sk_allocation = GFP_ATOMIC; 1565 sk->sk_allocation = GFP_ATOMIC;
1499 1566
@@ -1526,9 +1593,10 @@ static void xs_udp_connect_worker4(struct work_struct *work)
1526 goto out; 1593 goto out;
1527 1594
1528 /* Start by resetting any existing state */ 1595 /* Start by resetting any existing state */
1529 xs_close(xprt); 1596 xs_reset_transport(transport);
1530 1597
1531 if ((err = sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock)) < 0) { 1598 err = sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
1599 if (err < 0) {
1532 dprintk("RPC: can't create UDP transport socket (%d).\n", -err); 1600 dprintk("RPC: can't create UDP transport socket (%d).\n", -err);
1533 goto out; 1601 goto out;
1534 } 1602 }
@@ -1545,8 +1613,8 @@ static void xs_udp_connect_worker4(struct work_struct *work)
1545 xs_udp_finish_connecting(xprt, sock); 1613 xs_udp_finish_connecting(xprt, sock);
1546 status = 0; 1614 status = 0;
1547out: 1615out:
1548 xprt_wake_pending_tasks(xprt, status);
1549 xprt_clear_connecting(xprt); 1616 xprt_clear_connecting(xprt);
1617 xprt_wake_pending_tasks(xprt, status);
1550} 1618}
1551 1619
1552/** 1620/**
@@ -1567,9 +1635,10 @@ static void xs_udp_connect_worker6(struct work_struct *work)
1567 goto out; 1635 goto out;
1568 1636
1569 /* Start by resetting any existing state */ 1637 /* Start by resetting any existing state */
1570 xs_close(xprt); 1638 xs_reset_transport(transport);
1571 1639
1572 if ((err = sock_create_kern(PF_INET6, SOCK_DGRAM, IPPROTO_UDP, &sock)) < 0) { 1640 err = sock_create_kern(PF_INET6, SOCK_DGRAM, IPPROTO_UDP, &sock);
1641 if (err < 0) {
1573 dprintk("RPC: can't create UDP transport socket (%d).\n", -err); 1642 dprintk("RPC: can't create UDP transport socket (%d).\n", -err);
1574 goto out; 1643 goto out;
1575 } 1644 }
@@ -1586,18 +1655,17 @@ static void xs_udp_connect_worker6(struct work_struct *work)
1586 xs_udp_finish_connecting(xprt, sock); 1655 xs_udp_finish_connecting(xprt, sock);
1587 status = 0; 1656 status = 0;
1588out: 1657out:
1589 xprt_wake_pending_tasks(xprt, status);
1590 xprt_clear_connecting(xprt); 1658 xprt_clear_connecting(xprt);
1659 xprt_wake_pending_tasks(xprt, status);
1591} 1660}
1592 1661
1593/* 1662/*
1594 * We need to preserve the port number so the reply cache on the server can 1663 * We need to preserve the port number so the reply cache on the server can
1595 * find our cached RPC replies when we get around to reconnecting. 1664 * find our cached RPC replies when we get around to reconnecting.
1596 */ 1665 */
1597static void xs_tcp_reuse_connection(struct rpc_xprt *xprt) 1666static void xs_abort_connection(struct rpc_xprt *xprt, struct sock_xprt *transport)
1598{ 1667{
1599 int result; 1668 int result;
1600 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
1601 struct sockaddr any; 1669 struct sockaddr any;
1602 1670
1603 dprintk("RPC: disconnecting xprt %p to reuse port\n", xprt); 1671 dprintk("RPC: disconnecting xprt %p to reuse port\n", xprt);
@@ -1609,11 +1677,24 @@ static void xs_tcp_reuse_connection(struct rpc_xprt *xprt)
1609 memset(&any, 0, sizeof(any)); 1677 memset(&any, 0, sizeof(any));
1610 any.sa_family = AF_UNSPEC; 1678 any.sa_family = AF_UNSPEC;
1611 result = kernel_connect(transport->sock, &any, sizeof(any), 0); 1679 result = kernel_connect(transport->sock, &any, sizeof(any), 0);
1612 if (result) 1680 if (!result)
1681 xs_sock_mark_closed(xprt);
1682 else
1613 dprintk("RPC: AF_UNSPEC connect return code %d\n", 1683 dprintk("RPC: AF_UNSPEC connect return code %d\n",
1614 result); 1684 result);
1615} 1685}
1616 1686
1687static void xs_tcp_reuse_connection(struct rpc_xprt *xprt, struct sock_xprt *transport)
1688{
1689 unsigned int state = transport->inet->sk_state;
1690
1691 if (state == TCP_CLOSE && transport->sock->state == SS_UNCONNECTED)
1692 return;
1693 if ((1 << state) & (TCPF_ESTABLISHED|TCPF_SYN_SENT))
1694 return;
1695 xs_abort_connection(xprt, transport);
1696}
1697
1617static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) 1698static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
1618{ 1699{
1619 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1700 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
@@ -1629,7 +1710,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
1629 sk->sk_data_ready = xs_tcp_data_ready; 1710 sk->sk_data_ready = xs_tcp_data_ready;
1630 sk->sk_state_change = xs_tcp_state_change; 1711 sk->sk_state_change = xs_tcp_state_change;
1631 sk->sk_write_space = xs_tcp_write_space; 1712 sk->sk_write_space = xs_tcp_write_space;
1632 sk->sk_error_report = xs_tcp_error_report; 1713 sk->sk_error_report = xs_error_report;
1633 sk->sk_allocation = GFP_ATOMIC; 1714 sk->sk_allocation = GFP_ATOMIC;
1634 1715
1635 /* socket options */ 1716 /* socket options */
@@ -1657,37 +1738,42 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
1657} 1738}
1658 1739
1659/** 1740/**
1660 * xs_tcp_connect_worker4 - connect a TCP socket to a remote endpoint 1741 * xs_tcp_setup_socket - create a TCP socket and connect to a remote endpoint
1661 * @work: RPC transport to connect 1742 * @xprt: RPC transport to connect
1743 * @transport: socket transport to connect
1744 * @create_sock: function to create a socket of the correct type
1662 * 1745 *
1663 * Invoked by a work queue tasklet. 1746 * Invoked by a work queue tasklet.
1664 */ 1747 */
1665static void xs_tcp_connect_worker4(struct work_struct *work) 1748static void xs_tcp_setup_socket(struct rpc_xprt *xprt,
1749 struct sock_xprt *transport,
1750 struct socket *(*create_sock)(struct rpc_xprt *,
1751 struct sock_xprt *))
1666{ 1752{
1667 struct sock_xprt *transport =
1668 container_of(work, struct sock_xprt, connect_worker.work);
1669 struct rpc_xprt *xprt = &transport->xprt;
1670 struct socket *sock = transport->sock; 1753 struct socket *sock = transport->sock;
1671 int err, status = -EIO; 1754 int status = -EIO;
1672 1755
1673 if (xprt->shutdown) 1756 if (xprt->shutdown)
1674 goto out; 1757 goto out;
1675 1758
1676 if (!sock) { 1759 if (!sock) {
1677 /* start from scratch */ 1760 clear_bit(XPRT_CONNECTION_ABORT, &xprt->state);
1678 if ((err = sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock)) < 0) { 1761 sock = create_sock(xprt, transport);
1679 dprintk("RPC: can't create TCP transport socket (%d).\n", -err); 1762 if (IS_ERR(sock)) {
1763 status = PTR_ERR(sock);
1680 goto out; 1764 goto out;
1681 } 1765 }
1682 xs_reclassify_socket4(sock); 1766 } else {
1767 int abort_and_exit;
1683 1768
1684 if (xs_bind4(transport, sock) < 0) { 1769 abort_and_exit = test_and_clear_bit(XPRT_CONNECTION_ABORT,
1685 sock_release(sock); 1770 &xprt->state);
1686 goto out;
1687 }
1688 } else
1689 /* "close" the socket, preserving the local port */ 1771 /* "close" the socket, preserving the local port */
1690 xs_tcp_reuse_connection(xprt); 1772 xs_tcp_reuse_connection(xprt, transport);
1773
1774 if (abort_and_exit)
1775 goto out_eagain;
1776 }
1691 1777
1692 dprintk("RPC: worker connecting xprt %p to address: %s\n", 1778 dprintk("RPC: worker connecting xprt %p to address: %s\n",
1693 xprt, xprt->address_strings[RPC_DISPLAY_ALL]); 1779 xprt, xprt->address_strings[RPC_DISPLAY_ALL]);
@@ -1696,83 +1782,109 @@ static void xs_tcp_connect_worker4(struct work_struct *work)
1696 dprintk("RPC: %p connect status %d connected %d sock state %d\n", 1782 dprintk("RPC: %p connect status %d connected %d sock state %d\n",
1697 xprt, -status, xprt_connected(xprt), 1783 xprt, -status, xprt_connected(xprt),
1698 sock->sk->sk_state); 1784 sock->sk->sk_state);
1699 if (status < 0) { 1785 switch (status) {
1700 switch (status) { 1786 default:
1701 case -EINPROGRESS: 1787 printk("%s: connect returned unhandled error %d\n",
1702 case -EALREADY: 1788 __func__, status);
1703 goto out_clear; 1789 case -EADDRNOTAVAIL:
1704 case -ECONNREFUSED: 1790 /* We're probably in TIME_WAIT. Get rid of existing socket,
1705 case -ECONNRESET: 1791 * and retry
1706 /* retry with existing socket, after a delay */ 1792 */
1707 break; 1793 set_bit(XPRT_CONNECTION_CLOSE, &xprt->state);
1708 default: 1794 xprt_force_disconnect(xprt);
1709 /* get rid of existing socket, and retry */ 1795 case -ECONNREFUSED:
1710 xs_tcp_shutdown(xprt); 1796 case -ECONNRESET:
1711 } 1797 case -ENETUNREACH:
1798 /* retry with existing socket, after a delay */
1799 case 0:
1800 case -EINPROGRESS:
1801 case -EALREADY:
1802 xprt_clear_connecting(xprt);
1803 return;
1712 } 1804 }
1805out_eagain:
1806 status = -EAGAIN;
1713out: 1807out:
1714 xprt_wake_pending_tasks(xprt, status);
1715out_clear:
1716 xprt_clear_connecting(xprt); 1808 xprt_clear_connecting(xprt);
1809 xprt_wake_pending_tasks(xprt, status);
1810}
1811
1812static struct socket *xs_create_tcp_sock4(struct rpc_xprt *xprt,
1813 struct sock_xprt *transport)
1814{
1815 struct socket *sock;
1816 int err;
1817
1818 /* start from scratch */
1819 err = sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock);
1820 if (err < 0) {
1821 dprintk("RPC: can't create TCP transport socket (%d).\n",
1822 -err);
1823 goto out_err;
1824 }
1825 xs_reclassify_socket4(sock);
1826
1827 if (xs_bind4(transport, sock) < 0) {
1828 sock_release(sock);
1829 goto out_err;
1830 }
1831 return sock;
1832out_err:
1833 return ERR_PTR(-EIO);
1717} 1834}
1718 1835
1719/** 1836/**
1720 * xs_tcp_connect_worker6 - connect a TCP socket to a remote endpoint 1837 * xs_tcp_connect_worker4 - connect a TCP socket to a remote endpoint
1721 * @work: RPC transport to connect 1838 * @work: RPC transport to connect
1722 * 1839 *
1723 * Invoked by a work queue tasklet. 1840 * Invoked by a work queue tasklet.
1724 */ 1841 */
1725static void xs_tcp_connect_worker6(struct work_struct *work) 1842static void xs_tcp_connect_worker4(struct work_struct *work)
1726{ 1843{
1727 struct sock_xprt *transport = 1844 struct sock_xprt *transport =
1728 container_of(work, struct sock_xprt, connect_worker.work); 1845 container_of(work, struct sock_xprt, connect_worker.work);
1729 struct rpc_xprt *xprt = &transport->xprt; 1846 struct rpc_xprt *xprt = &transport->xprt;
1730 struct socket *sock = transport->sock;
1731 int err, status = -EIO;
1732 1847
1733 if (xprt->shutdown) 1848 xs_tcp_setup_socket(xprt, transport, xs_create_tcp_sock4);
1734 goto out; 1849}
1735 1850
1736 if (!sock) { 1851static struct socket *xs_create_tcp_sock6(struct rpc_xprt *xprt,
1737 /* start from scratch */ 1852 struct sock_xprt *transport)
1738 if ((err = sock_create_kern(PF_INET6, SOCK_STREAM, IPPROTO_TCP, &sock)) < 0) { 1853{
1739 dprintk("RPC: can't create TCP transport socket (%d).\n", -err); 1854 struct socket *sock;
1740 goto out; 1855 int err;
1741 } 1856
1742 xs_reclassify_socket6(sock); 1857 /* start from scratch */
1858 err = sock_create_kern(PF_INET6, SOCK_STREAM, IPPROTO_TCP, &sock);
1859 if (err < 0) {
1860 dprintk("RPC: can't create TCP transport socket (%d).\n",
1861 -err);
1862 goto out_err;
1863 }
1864 xs_reclassify_socket6(sock);
1743 1865
1744 if (xs_bind6(transport, sock) < 0) { 1866 if (xs_bind6(transport, sock) < 0) {
1745 sock_release(sock); 1867 sock_release(sock);
1746 goto out; 1868 goto out_err;
1747 } 1869 }
1748 } else 1870 return sock;
1749 /* "close" the socket, preserving the local port */ 1871out_err:
1750 xs_tcp_reuse_connection(xprt); 1872 return ERR_PTR(-EIO);
1873}
1751 1874
1752 dprintk("RPC: worker connecting xprt %p to address: %s\n", 1875/**
1753 xprt, xprt->address_strings[RPC_DISPLAY_ALL]); 1876 * xs_tcp_connect_worker6 - connect a TCP socket to a remote endpoint
1877 * @work: RPC transport to connect
1878 *
1879 * Invoked by a work queue tasklet.
1880 */
1881static void xs_tcp_connect_worker6(struct work_struct *work)
1882{
1883 struct sock_xprt *transport =
1884 container_of(work, struct sock_xprt, connect_worker.work);
1885 struct rpc_xprt *xprt = &transport->xprt;
1754 1886
1755 status = xs_tcp_finish_connecting(xprt, sock); 1887 xs_tcp_setup_socket(xprt, transport, xs_create_tcp_sock6);
1756 dprintk("RPC: %p connect status %d connected %d sock state %d\n",
1757 xprt, -status, xprt_connected(xprt), sock->sk->sk_state);
1758 if (status < 0) {
1759 switch (status) {
1760 case -EINPROGRESS:
1761 case -EALREADY:
1762 goto out_clear;
1763 case -ECONNREFUSED:
1764 case -ECONNRESET:
1765 /* retry with existing socket, after a delay */
1766 break;
1767 default:
1768 /* get rid of existing socket, and retry */
1769 xs_tcp_shutdown(xprt);
1770 }
1771 }
1772out:
1773 xprt_wake_pending_tasks(xprt, status);
1774out_clear:
1775 xprt_clear_connecting(xprt);
1776} 1888}
1777 1889
1778/** 1890/**
@@ -1817,9 +1929,6 @@ static void xs_tcp_connect(struct rpc_task *task)
1817{ 1929{
1818 struct rpc_xprt *xprt = task->tk_xprt; 1930 struct rpc_xprt *xprt = task->tk_xprt;
1819 1931
1820 /* Initiate graceful shutdown of the socket if not already done */
1821 if (test_bit(XPRT_CONNECTED, &xprt->state))
1822 xs_tcp_shutdown(xprt);
1823 /* Exit if we need to wait for socket shutdown to complete */ 1932 /* Exit if we need to wait for socket shutdown to complete */
1824 if (test_bit(XPRT_CLOSING, &xprt->state)) 1933 if (test_bit(XPRT_CLOSING, &xprt->state))
1825 return; 1934 return;
@@ -1901,7 +2010,7 @@ static struct rpc_xprt_ops xs_tcp_ops = {
1901 .buf_free = rpc_free, 2010 .buf_free = rpc_free,
1902 .send_request = xs_tcp_send_request, 2011 .send_request = xs_tcp_send_request,
1903 .set_retrans_timeout = xprt_set_retrans_timeout_def, 2012 .set_retrans_timeout = xprt_set_retrans_timeout_def,
1904 .close = xs_tcp_shutdown, 2013 .close = xs_tcp_close,
1905 .destroy = xs_destroy, 2014 .destroy = xs_destroy,
1906 .print_stats = xs_tcp_print_stats, 2015 .print_stats = xs_tcp_print_stats,
1907}; 2016};