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 ---