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