xprtsock.c (bae6692c24236d0203f88a444986d86437a858fa) xprtsock.c (b4411457d5c9062f07f0762f1ddb513d90dd1379)
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

--- 981 unchanged lines hidden (view full) ---

990 struct sk_buff *skb)
991{
992 struct rpc_task *task;
993 struct rpc_rqst *rovr;
994 int repsize, copied;
995 u32 _xid;
996 __be32 *xp;
997
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

--- 981 unchanged lines hidden (view full) ---

990 struct sk_buff *skb)
991{
992 struct rpc_task *task;
993 struct rpc_rqst *rovr;
994 int repsize, copied;
995 u32 _xid;
996 __be32 *xp;
997
998 repsize = skb->len - sizeof(struct udphdr);
998 repsize = skb->len;
999 if (repsize < 4) {
1000 dprintk("RPC: impossible RPC reply size %d!\n", repsize);
1001 return;
1002 }
1003
1004 /* Copy the XID from the skb... */
999 if (repsize < 4) {
1000 dprintk("RPC: impossible RPC reply size %d!\n", repsize);
1001 return;
1002 }
1003
1004 /* Copy the XID from the skb... */
1005 xp = skb_header_pointer(skb, sizeof(struct udphdr),
1006 sizeof(_xid), &_xid);
1005 xp = skb_header_pointer(skb, 0, sizeof(_xid), &_xid);
1007 if (xp == NULL)
1008 return;
1009
1010 /* Look up and lock the request corresponding to the given XID */
1011 spin_lock_bh(&xprt->transport_lock);
1012 rovr = xprt_lookup_rqst(xprt, *xp);
1013 if (!rovr)
1014 goto out_unlock;
1015 task = rovr->rq_task;
1016
1017 if ((copied = rovr->rq_private_buf.buflen) > repsize)
1018 copied = repsize;
1019
1020 /* Suck it into the iovec, verify checksum if not done by hw. */
1021 if (csum_partial_copy_to_xdr(&rovr->rq_private_buf, skb)) {
1006 if (xp == NULL)
1007 return;
1008
1009 /* Look up and lock the request corresponding to the given XID */
1010 spin_lock_bh(&xprt->transport_lock);
1011 rovr = xprt_lookup_rqst(xprt, *xp);
1012 if (!rovr)
1013 goto out_unlock;
1014 task = rovr->rq_task;
1015
1016 if ((copied = rovr->rq_private_buf.buflen) > repsize)
1017 copied = repsize;
1018
1019 /* Suck it into the iovec, verify checksum if not done by hw. */
1020 if (csum_partial_copy_to_xdr(&rovr->rq_private_buf, skb)) {
1022 UDPX_INC_STATS_BH(sk, UDP_MIB_INERRORS);
1021 __UDPX_INC_STATS(sk, UDP_MIB_INERRORS);
1023 goto out_unlock;
1024 }
1025
1022 goto out_unlock;
1023 }
1024
1026 UDPX_INC_STATS_BH(sk, UDP_MIB_INDATAGRAMS);
1025 __UDPX_INC_STATS(sk, UDP_MIB_INDATAGRAMS);
1027
1028 xprt_adjust_cwnd(xprt, task, copied);
1029 xprt_complete_rqst(task, copied);
1030
1031 out_unlock:
1032 spin_unlock_bh(&xprt->transport_lock);
1033}
1034

--- 841 unchanged lines hidden (view full) ---

1876 struct sock *sk = sock->sk;
1877
1878 sock_lock_init_class_and_name(sk, "slock-AF_INET6-RPC",
1879 &xs_slock_key[1], "sk_lock-AF_INET6-RPC", &xs_key[1]);
1880}
1881
1882static inline void xs_reclassify_socket(int family, struct socket *sock)
1883{
1026
1027 xprt_adjust_cwnd(xprt, task, copied);
1028 xprt_complete_rqst(task, copied);
1029
1030 out_unlock:
1031 spin_unlock_bh(&xprt->transport_lock);
1032}
1033

--- 841 unchanged lines hidden (view full) ---

1875 struct sock *sk = sock->sk;
1876
1877 sock_lock_init_class_and_name(sk, "slock-AF_INET6-RPC",
1878 &xs_slock_key[1], "sk_lock-AF_INET6-RPC", &xs_key[1]);
1879}
1880
1881static inline void xs_reclassify_socket(int family, struct socket *sock)
1882{
1884 WARN_ON_ONCE(sock_owned_by_user(sock->sk));
1885 if (sock_owned_by_user(sock->sk))
1883 if (WARN_ON_ONCE(!sock_allow_reclassification(sock->sk)))
1886 return;
1887
1888 switch (family) {
1889 case AF_LOCAL:
1890 xs_reclassify_socketu(sock);
1891 break;
1892 case AF_INET:
1893 xs_reclassify_socket4(sock);

--- 53 unchanged lines hidden (view full) ---

1947
1948 write_lock_bh(&sk->sk_callback_lock);
1949
1950 xs_save_old_callbacks(transport, sk);
1951
1952 sk->sk_user_data = xprt;
1953 sk->sk_data_ready = xs_data_ready;
1954 sk->sk_write_space = xs_udp_write_space;
1884 return;
1885
1886 switch (family) {
1887 case AF_LOCAL:
1888 xs_reclassify_socketu(sock);
1889 break;
1890 case AF_INET:
1891 xs_reclassify_socket4(sock);

--- 53 unchanged lines hidden (view full) ---

1945
1946 write_lock_bh(&sk->sk_callback_lock);
1947
1948 xs_save_old_callbacks(transport, sk);
1949
1950 sk->sk_user_data = xprt;
1951 sk->sk_data_ready = xs_data_ready;
1952 sk->sk_write_space = xs_udp_write_space;
1953 sock_set_flag(sk, SOCK_FASYNC);
1955 sk->sk_error_report = xs_error_report;
1956 sk->sk_allocation = GFP_NOIO;
1957
1958 xprt_clear_connected(xprt);
1959
1960 /* Reset to new socket */
1961 transport->sock = sock;
1962 transport->inet = sk;

--- 170 unchanged lines hidden (view full) ---

2133
2134 write_lock_bh(&sk->sk_callback_lock);
2135
2136 xs_save_old_callbacks(transport, sk);
2137
2138 sk->sk_user_data = xprt;
2139 sk->sk_data_ready = xs_data_ready;
2140 sk->sk_write_space = xs_udp_write_space;
1954 sk->sk_error_report = xs_error_report;
1955 sk->sk_allocation = GFP_NOIO;
1956
1957 xprt_clear_connected(xprt);
1958
1959 /* Reset to new socket */
1960 transport->sock = sock;
1961 transport->inet = sk;

--- 170 unchanged lines hidden (view full) ---

2132
2133 write_lock_bh(&sk->sk_callback_lock);
2134
2135 xs_save_old_callbacks(transport, sk);
2136
2137 sk->sk_user_data = xprt;
2138 sk->sk_data_ready = xs_data_ready;
2139 sk->sk_write_space = xs_udp_write_space;
2140 sock_set_flag(sk, SOCK_FASYNC);
2141 sk->sk_allocation = GFP_NOIO;
2142
2143 xprt_set_connected(xprt);
2144
2145 /* Reset to new socket */
2146 transport->sock = sock;
2147 transport->inet = sk;
2148

--- 85 unchanged lines hidden (view full) ---

2234 write_lock_bh(&sk->sk_callback_lock);
2235
2236 xs_save_old_callbacks(transport, sk);
2237
2238 sk->sk_user_data = xprt;
2239 sk->sk_data_ready = xs_tcp_data_ready;
2240 sk->sk_state_change = xs_tcp_state_change;
2241 sk->sk_write_space = xs_tcp_write_space;
2141 sk->sk_allocation = GFP_NOIO;
2142
2143 xprt_set_connected(xprt);
2144
2145 /* Reset to new socket */
2146 transport->sock = sock;
2147 transport->inet = sk;
2148

--- 85 unchanged lines hidden (view full) ---

2234 write_lock_bh(&sk->sk_callback_lock);
2235
2236 xs_save_old_callbacks(transport, sk);
2237
2238 sk->sk_user_data = xprt;
2239 sk->sk_data_ready = xs_tcp_data_ready;
2240 sk->sk_state_change = xs_tcp_state_change;
2241 sk->sk_write_space = xs_tcp_write_space;
2242 sock_set_flag(sk, SOCK_FASYNC);
2242 sk->sk_error_report = xs_error_report;
2243 sk->sk_allocation = GFP_NOIO;
2244
2245 /* socket options */
2246 sock_reset_flag(sk, SOCK_LINGER);
2247 tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF;
2248
2249 xprt_clear_connected(xprt);

--- 953 unchanged lines hidden ---
2243 sk->sk_error_report = xs_error_report;
2244 sk->sk_allocation = GFP_NOIO;
2245
2246 /* socket options */
2247 sock_reset_flag(sk, SOCK_LINGER);
2248 tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF;
2249
2250 xprt_clear_connected(xprt);

--- 953 unchanged lines hidden ---