xprtsock.c (2a9e1cfa23fb62da37739af81127dab5af095d99) | xprtsock.c (b071195deba14b37ce896c26f20349b46e5f9fd2) |
---|---|
1/* 2 * linux/net/sunrpc/xprtsock.c 3 * 4 * Client-side transport implementation for sockets. 5 * 6 * TCP callback races fixes (C) 1998 Red Hat 7 * TCP send fixes (C) 1998 Red Hat 8 * TCP NFS related read + write fixes --- 235 unchanged lines hidden (view full) --- 244 sndsize; 245 246 /* 247 * Saved socket callback addresses 248 */ 249 void (*old_data_ready)(struct sock *, int); 250 void (*old_state_change)(struct sock *); 251 void (*old_write_space)(struct sock *); | 1/* 2 * linux/net/sunrpc/xprtsock.c 3 * 4 * Client-side transport implementation for sockets. 5 * 6 * TCP callback races fixes (C) 1998 Red Hat 7 * TCP send fixes (C) 1998 Red Hat 8 * TCP NFS related read + write fixes --- 235 unchanged lines hidden (view full) --- 244 sndsize; 245 246 /* 247 * Saved socket callback addresses 248 */ 249 void (*old_data_ready)(struct sock *, int); 250 void (*old_state_change)(struct sock *); 251 void (*old_write_space)(struct sock *); |
252 void (*old_error_report)(struct sock *); | |
253}; 254 255/* 256 * TCP receive state flags 257 */ 258#define TCP_RCV_LAST_FRAG (1UL << 0) 259#define TCP_RCV_COPY_FRAGHDR (1UL << 1) 260#define TCP_RCV_COPY_XID (1UL << 2) --- 100 unchanged lines hidden (view full) --- 361 snprintf(buf, 64, "addr="NIP6_FMT" port=%u proto=%s", 362 NIP6(addr->sin6_addr), 363 ntohs(addr->sin6_port), 364 protocol); 365 } 366 xprt->address_strings[RPC_DISPLAY_ALL] = buf; 367 368 buf = kzalloc(36, GFP_KERNEL); | 252}; 253 254/* 255 * TCP receive state flags 256 */ 257#define TCP_RCV_LAST_FRAG (1UL << 0) 258#define TCP_RCV_COPY_FRAGHDR (1UL << 1) 259#define TCP_RCV_COPY_XID (1UL << 2) --- 100 unchanged lines hidden (view full) --- 360 snprintf(buf, 64, "addr="NIP6_FMT" port=%u proto=%s", 361 NIP6(addr->sin6_addr), 362 ntohs(addr->sin6_port), 363 protocol); 364 } 365 xprt->address_strings[RPC_DISPLAY_ALL] = buf; 366 367 buf = kzalloc(36, GFP_KERNEL); |
369 if (buf) { 370 snprintf(buf, 36, NIP6_SEQFMT, 371 NIP6(addr->sin6_addr)); 372 } | 368 if (buf) 369 snprintf(buf, 36, "%#p6", &addr->sin6_addr); 370 |
373 xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = buf; 374 375 buf = kzalloc(8, GFP_KERNEL); 376 if (buf) { 377 snprintf(buf, 8, "%4hx", 378 ntohs(addr->sin6_port)); 379 } 380 xprt->address_strings[RPC_DISPLAY_HEX_PORT] = buf; --- 313 unchanged lines hidden (view full) --- 694 status = -EAGAIN; 695 break; 696 } 697 698 switch (status) { 699 case -EAGAIN: 700 xs_nospace(task); 701 break; | 371 xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = buf; 372 373 buf = kzalloc(8, GFP_KERNEL); 374 if (buf) { 375 snprintf(buf, 8, "%4hx", 376 ntohs(addr->sin6_port)); 377 } 378 xprt->address_strings[RPC_DISPLAY_HEX_PORT] = buf; --- 313 unchanged lines hidden (view full) --- 692 status = -EAGAIN; 693 break; 694 } 695 696 switch (status) { 697 case -EAGAIN: 698 xs_nospace(task); 699 break; |
702 case -ECONNRESET: 703 xs_tcp_shutdown(xprt); | |
704 case -ECONNREFUSED: | 700 case -ECONNREFUSED: |
701 case -ECONNRESET: |
|
705 case -ENOTCONN: 706 case -EPIPE: 707 status = -ENOTCONN; 708 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags); 709 break; 710 default: 711 dprintk("RPC: sendmsg returned unrecognized error %d\n", 712 -status); --- 26 unchanged lines hidden (view full) --- 739 goto out_release; 740 if (req->rq_bytes_sent == req->rq_snd_buf.len) 741 goto out_release; 742 set_bit(XPRT_CLOSE_WAIT, &task->tk_xprt->state); 743out_release: 744 xprt_release_xprt(xprt, task); 745} 746 | 702 case -ENOTCONN: 703 case -EPIPE: 704 status = -ENOTCONN; 705 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags); 706 break; 707 default: 708 dprintk("RPC: sendmsg returned unrecognized error %d\n", 709 -status); --- 26 unchanged lines hidden (view full) --- 736 goto out_release; 737 if (req->rq_bytes_sent == req->rq_snd_buf.len) 738 goto out_release; 739 set_bit(XPRT_CLOSE_WAIT, &task->tk_xprt->state); 740out_release: 741 xprt_release_xprt(xprt, task); 742} 743 |
747static void xs_save_old_callbacks(struct sock_xprt *transport, struct sock *sk) 748{ 749 transport->old_data_ready = sk->sk_data_ready; 750 transport->old_state_change = sk->sk_state_change; 751 transport->old_write_space = sk->sk_write_space; 752 transport->old_error_report = sk->sk_error_report; 753} 754 755static void xs_restore_old_callbacks(struct sock_xprt *transport, struct sock *sk) 756{ 757 sk->sk_data_ready = transport->old_data_ready; 758 sk->sk_state_change = transport->old_state_change; 759 sk->sk_write_space = transport->old_write_space; 760 sk->sk_error_report = transport->old_error_report; 761} 762 | |
763/** 764 * xs_close - close a socket 765 * @xprt: transport 766 * 767 * This is used when all requests are complete; ie, no DRC state remains 768 * on the server we want to save. 769 */ 770static void xs_close(struct rpc_xprt *xprt) --- 7 unchanged lines hidden (view full) --- 778 779 dprintk("RPC: xs_close xprt %p\n", xprt); 780 781 write_lock_bh(&sk->sk_callback_lock); 782 transport->inet = NULL; 783 transport->sock = NULL; 784 785 sk->sk_user_data = NULL; | 744/** 745 * xs_close - close a socket 746 * @xprt: transport 747 * 748 * This is used when all requests are complete; ie, no DRC state remains 749 * on the server we want to save. 750 */ 751static void xs_close(struct rpc_xprt *xprt) --- 7 unchanged lines hidden (view full) --- 759 760 dprintk("RPC: xs_close xprt %p\n", xprt); 761 762 write_lock_bh(&sk->sk_callback_lock); 763 transport->inet = NULL; 764 transport->sock = NULL; 765 766 sk->sk_user_data = NULL; |
786 787 xs_restore_old_callbacks(transport, sk); | 767 sk->sk_data_ready = transport->old_data_ready; 768 sk->sk_state_change = transport->old_state_change; 769 sk->sk_write_space = transport->old_write_space; |
788 write_unlock_bh(&sk->sk_callback_lock); 789 790 sk->sk_no_check = 0; 791 792 sock_release(sock); 793clear_close_wait: 794 smp_mb__before_clear_bit(); 795 clear_bit(XPRT_CLOSE_WAIT, &xprt->state); --- 396 unchanged lines hidden (view full) --- 1192 /* Mark transport as closed and wake up all pending tasks */ 1193 xprt_disconnect_done(xprt); 1194 } 1195 out: 1196 read_unlock(&sk->sk_callback_lock); 1197} 1198 1199/** | 770 write_unlock_bh(&sk->sk_callback_lock); 771 772 sk->sk_no_check = 0; 773 774 sock_release(sock); 775clear_close_wait: 776 smp_mb__before_clear_bit(); 777 clear_bit(XPRT_CLOSE_WAIT, &xprt->state); --- 396 unchanged lines hidden (view full) --- 1174 /* Mark transport as closed and wake up all pending tasks */ 1175 xprt_disconnect_done(xprt); 1176 } 1177 out: 1178 read_unlock(&sk->sk_callback_lock); 1179} 1180 1181/** |
1200 * xs_tcp_error_report - callback mainly for catching RST events 1201 * @sk: socket 1202 */ 1203static void xs_tcp_error_report(struct sock *sk) 1204{ 1205 struct rpc_xprt *xprt; 1206 1207 read_lock(&sk->sk_callback_lock); 1208 if (sk->sk_err != ECONNRESET || sk->sk_state != TCP_ESTABLISHED) 1209 goto out; 1210 if (!(xprt = xprt_from_sock(sk))) 1211 goto out; 1212 dprintk("RPC: %s client %p...\n" 1213 "RPC: error %d\n", 1214 __func__, xprt, sk->sk_err); 1215 1216 xprt_force_disconnect(xprt); 1217out: 1218 read_unlock(&sk->sk_callback_lock); 1219} 1220 1221/** | |
1222 * xs_udp_write_space - callback invoked when socket buffer space 1223 * becomes available 1224 * @sk: socket whose state has changed 1225 * 1226 * Called when more output buffer space is available for this socket. 1227 * We try not to wake our writers until they can make "significant" 1228 * progress, otherwise we'll waste resources thrashing kernel_sendmsg 1229 * with a bunch of small requests. --- 258 unchanged lines hidden (view full) --- 1488{ 1489 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1490 1491 if (!transport->inet) { 1492 struct sock *sk = sock->sk; 1493 1494 write_lock_bh(&sk->sk_callback_lock); 1495 | 1182 * xs_udp_write_space - callback invoked when socket buffer space 1183 * becomes available 1184 * @sk: socket whose state has changed 1185 * 1186 * Called when more output buffer space is available for this socket. 1187 * We try not to wake our writers until they can make "significant" 1188 * progress, otherwise we'll waste resources thrashing kernel_sendmsg 1189 * with a bunch of small requests. --- 258 unchanged lines hidden (view full) --- 1448{ 1449 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1450 1451 if (!transport->inet) { 1452 struct sock *sk = sock->sk; 1453 1454 write_lock_bh(&sk->sk_callback_lock); 1455 |
1496 xs_save_old_callbacks(transport, sk); 1497 | |
1498 sk->sk_user_data = xprt; | 1456 sk->sk_user_data = xprt; |
1457 transport->old_data_ready = sk->sk_data_ready; 1458 transport->old_state_change = sk->sk_state_change; 1459 transport->old_write_space = sk->sk_write_space; |
|
1499 sk->sk_data_ready = xs_udp_data_ready; 1500 sk->sk_write_space = xs_udp_write_space; 1501 sk->sk_no_check = UDP_CSUM_NORCV; 1502 sk->sk_allocation = GFP_ATOMIC; 1503 1504 xprt_set_connected(xprt); 1505 1506 /* Reset to new socket */ --- 115 unchanged lines hidden (view full) --- 1622{ 1623 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1624 1625 if (!transport->inet) { 1626 struct sock *sk = sock->sk; 1627 1628 write_lock_bh(&sk->sk_callback_lock); 1629 | 1460 sk->sk_data_ready = xs_udp_data_ready; 1461 sk->sk_write_space = xs_udp_write_space; 1462 sk->sk_no_check = UDP_CSUM_NORCV; 1463 sk->sk_allocation = GFP_ATOMIC; 1464 1465 xprt_set_connected(xprt); 1466 1467 /* Reset to new socket */ --- 115 unchanged lines hidden (view full) --- 1583{ 1584 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1585 1586 if (!transport->inet) { 1587 struct sock *sk = sock->sk; 1588 1589 write_lock_bh(&sk->sk_callback_lock); 1590 |
1630 xs_save_old_callbacks(transport, sk); 1631 | |
1632 sk->sk_user_data = xprt; | 1591 sk->sk_user_data = xprt; |
1592 transport->old_data_ready = sk->sk_data_ready; 1593 transport->old_state_change = sk->sk_state_change; 1594 transport->old_write_space = sk->sk_write_space; |
|
1633 sk->sk_data_ready = xs_tcp_data_ready; 1634 sk->sk_state_change = xs_tcp_state_change; 1635 sk->sk_write_space = xs_tcp_write_space; | 1595 sk->sk_data_ready = xs_tcp_data_ready; 1596 sk->sk_state_change = xs_tcp_state_change; 1597 sk->sk_write_space = xs_tcp_write_space; |
1636 sk->sk_error_report = xs_tcp_error_report; | |
1637 sk->sk_allocation = GFP_ATOMIC; 1638 1639 /* socket options */ 1640 sk->sk_userlocks |= SOCK_BINDPORT_LOCK; 1641 sock_reset_flag(sk, SOCK_LINGER); 1642 tcp_sk(sk)->linger2 = 0; 1643 tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF; 1644 --- 485 unchanged lines hidden --- | 1598 sk->sk_allocation = GFP_ATOMIC; 1599 1600 /* socket options */ 1601 sk->sk_userlocks |= SOCK_BINDPORT_LOCK; 1602 sock_reset_flag(sk, SOCK_LINGER); 1603 tcp_sk(sk)->linger2 = 0; 1604 tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF; 1605 --- 485 unchanged lines hidden --- |