xprtsock.c (06b5fc3ad94eebf25d5abc07f84e16b8b33dcf8c) | xprtsock.c (a73881c96d73ee72b7dbbd38a6eeef66182a8ef7) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * linux/net/sunrpc/xprtsock.c 4 * 5 * Client-side transport implementation for sockets. 6 * 7 * TCP callback races fixes (C) 1998 Red Hat 8 * TCP send fixes (C) 1998 Red Hat --- 656 unchanged lines hidden (view full) --- 665 transport->recv.len = 0; 666 return read; 667out_err: 668 return ret != 0 ? ret : -ESHUTDOWN; 669} 670 671static __poll_t xs_poll_socket(struct sock_xprt *transport) 672{ | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * linux/net/sunrpc/xprtsock.c 4 * 5 * Client-side transport implementation for sockets. 6 * 7 * TCP callback races fixes (C) 1998 Red Hat 8 * TCP send fixes (C) 1998 Red Hat --- 656 unchanged lines hidden (view full) --- 665 transport->recv.len = 0; 666 return read; 667out_err: 668 return ret != 0 ? ret : -ESHUTDOWN; 669} 670 671static __poll_t xs_poll_socket(struct sock_xprt *transport) 672{ |
673 return transport->sock->ops->poll(NULL, transport->sock, NULL); | 673 return transport->sock->ops->poll(transport->file, transport->sock, 674 NULL); |
674} 675 676static bool xs_poll_socket_readable(struct sock_xprt *transport) 677{ 678 __poll_t events = xs_poll_socket(transport); 679 680 return (events & (EPOLLIN | EPOLLRDNORM)) && !(events & EPOLLRDHUP); 681} --- 566 unchanged lines hidden (view full) --- 1248 read_unlock_bh(&sk->sk_callback_lock); 1249} 1250 1251static void xs_reset_transport(struct sock_xprt *transport) 1252{ 1253 struct socket *sock = transport->sock; 1254 struct sock *sk = transport->inet; 1255 struct rpc_xprt *xprt = &transport->xprt; | 675} 676 677static bool xs_poll_socket_readable(struct sock_xprt *transport) 678{ 679 __poll_t events = xs_poll_socket(transport); 680 681 return (events & (EPOLLIN | EPOLLRDNORM)) && !(events & EPOLLRDHUP); 682} --- 566 unchanged lines hidden (view full) --- 1249 read_unlock_bh(&sk->sk_callback_lock); 1250} 1251 1252static void xs_reset_transport(struct sock_xprt *transport) 1253{ 1254 struct socket *sock = transport->sock; 1255 struct sock *sk = transport->inet; 1256 struct rpc_xprt *xprt = &transport->xprt; |
1257 struct file *filp = transport->file; |
|
1256 1257 if (sk == NULL) 1258 return; 1259 1260 if (atomic_read(&transport->xprt.swapper)) 1261 sk_clear_memalloc(sk); 1262 1263 kernel_sock_shutdown(sock, SHUT_RDWR); 1264 1265 mutex_lock(&transport->recv_mutex); 1266 write_lock_bh(&sk->sk_callback_lock); 1267 transport->inet = NULL; 1268 transport->sock = NULL; | 1258 1259 if (sk == NULL) 1260 return; 1261 1262 if (atomic_read(&transport->xprt.swapper)) 1263 sk_clear_memalloc(sk); 1264 1265 kernel_sock_shutdown(sock, SHUT_RDWR); 1266 1267 mutex_lock(&transport->recv_mutex); 1268 write_lock_bh(&sk->sk_callback_lock); 1269 transport->inet = NULL; 1270 transport->sock = NULL; |
1271 transport->file = NULL; |
|
1269 1270 sk->sk_user_data = NULL; 1271 1272 xs_restore_old_callbacks(transport, sk); 1273 xprt_clear_connected(xprt); 1274 write_unlock_bh(&sk->sk_callback_lock); 1275 xs_sock_reset_connection_flags(xprt); 1276 /* Reset stream record info */ 1277 xs_stream_reset_connect(transport); 1278 mutex_unlock(&transport->recv_mutex); 1279 1280 trace_rpc_socket_close(xprt, sock); | 1272 1273 sk->sk_user_data = NULL; 1274 1275 xs_restore_old_callbacks(transport, sk); 1276 xprt_clear_connected(xprt); 1277 write_unlock_bh(&sk->sk_callback_lock); 1278 xs_sock_reset_connection_flags(xprt); 1279 /* Reset stream record info */ 1280 xs_stream_reset_connect(transport); 1281 mutex_unlock(&transport->recv_mutex); 1282 1283 trace_rpc_socket_close(xprt, sock); |
1281 sock_release(sock); | 1284 fput(filp); |
1282 1283 xprt_disconnect_done(xprt); 1284} 1285 1286/** 1287 * xs_close - close a socket 1288 * @xprt: transport 1289 * --- 578 unchanged lines hidden (view full) --- 1868static void xs_dummy_setup_socket(struct work_struct *work) 1869{ 1870} 1871 1872static struct socket *xs_create_sock(struct rpc_xprt *xprt, 1873 struct sock_xprt *transport, int family, int type, 1874 int protocol, bool reuseport) 1875{ | 1285 1286 xprt_disconnect_done(xprt); 1287} 1288 1289/** 1290 * xs_close - close a socket 1291 * @xprt: transport 1292 * --- 578 unchanged lines hidden (view full) --- 1871static void xs_dummy_setup_socket(struct work_struct *work) 1872{ 1873} 1874 1875static struct socket *xs_create_sock(struct rpc_xprt *xprt, 1876 struct sock_xprt *transport, int family, int type, 1877 int protocol, bool reuseport) 1878{ |
1879 struct file *filp; |
|
1876 struct socket *sock; 1877 int err; 1878 1879 err = __sock_create(xprt->xprt_net, family, type, protocol, &sock, 1); 1880 if (err < 0) { 1881 dprintk("RPC: can't create %d transport socket (%d).\n", 1882 protocol, -err); 1883 goto out; --- 4 unchanged lines hidden (view full) --- 1888 xs_sock_set_reuseport(sock); 1889 1890 err = xs_bind(transport, sock); 1891 if (err) { 1892 sock_release(sock); 1893 goto out; 1894 } 1895 | 1880 struct socket *sock; 1881 int err; 1882 1883 err = __sock_create(xprt->xprt_net, family, type, protocol, &sock, 1); 1884 if (err < 0) { 1885 dprintk("RPC: can't create %d transport socket (%d).\n", 1886 protocol, -err); 1887 goto out; --- 4 unchanged lines hidden (view full) --- 1892 xs_sock_set_reuseport(sock); 1893 1894 err = xs_bind(transport, sock); 1895 if (err) { 1896 sock_release(sock); 1897 goto out; 1898 } 1899 |
1900 filp = sock_alloc_file(sock, O_NONBLOCK, NULL); 1901 if (IS_ERR(filp)) 1902 return ERR_CAST(filp); 1903 transport->file = filp; 1904 |
|
1896 return sock; 1897out: 1898 return ERR_PTR(err); 1899} 1900 1901static int xs_local_finish_connecting(struct rpc_xprt *xprt, 1902 struct socket *sock) 1903{ --- 29 unchanged lines hidden (view full) --- 1933 1934/** 1935 * xs_local_setup_socket - create AF_LOCAL socket, connect to a local endpoint 1936 * @transport: socket transport to connect 1937 */ 1938static int xs_local_setup_socket(struct sock_xprt *transport) 1939{ 1940 struct rpc_xprt *xprt = &transport->xprt; | 1905 return sock; 1906out: 1907 return ERR_PTR(err); 1908} 1909 1910static int xs_local_finish_connecting(struct rpc_xprt *xprt, 1911 struct socket *sock) 1912{ --- 29 unchanged lines hidden (view full) --- 1942 1943/** 1944 * xs_local_setup_socket - create AF_LOCAL socket, connect to a local endpoint 1945 * @transport: socket transport to connect 1946 */ 1947static int xs_local_setup_socket(struct sock_xprt *transport) 1948{ 1949 struct rpc_xprt *xprt = &transport->xprt; |
1950 struct file *filp; |
|
1941 struct socket *sock; 1942 int status = -EIO; 1943 1944 status = __sock_create(xprt->xprt_net, AF_LOCAL, 1945 SOCK_STREAM, 0, &sock, 1); 1946 if (status < 0) { 1947 dprintk("RPC: can't create AF_LOCAL " 1948 "transport socket (%d).\n", -status); 1949 goto out; 1950 } 1951 xs_reclassify_socket(AF_LOCAL, sock); 1952 | 1951 struct socket *sock; 1952 int status = -EIO; 1953 1954 status = __sock_create(xprt->xprt_net, AF_LOCAL, 1955 SOCK_STREAM, 0, &sock, 1); 1956 if (status < 0) { 1957 dprintk("RPC: can't create AF_LOCAL " 1958 "transport socket (%d).\n", -status); 1959 goto out; 1960 } 1961 xs_reclassify_socket(AF_LOCAL, sock); 1962 |
1963 filp = sock_alloc_file(sock, O_NONBLOCK, NULL); 1964 if (IS_ERR(filp)) { 1965 status = PTR_ERR(filp); 1966 goto out; 1967 } 1968 transport->file = filp; 1969 |
|
1953 dprintk("RPC: worker connecting xprt %p via AF_LOCAL to %s\n", 1954 xprt, xprt->address_strings[RPC_DISPLAY_ADDR]); 1955 1956 status = xs_local_finish_connecting(xprt, sock); 1957 trace_rpc_socket_connect(xprt, sock, status); 1958 switch (status) { 1959 case 0: 1960 dprintk("RPC: xprt %p connected to %s\n", --- 1307 unchanged lines hidden --- | 1970 dprintk("RPC: worker connecting xprt %p via AF_LOCAL to %s\n", 1971 xprt, xprt->address_strings[RPC_DISPLAY_ADDR]); 1972 1973 status = xs_local_finish_connecting(xprt, sock); 1974 trace_rpc_socket_connect(xprt, sock, status); 1975 switch (status) { 1976 case 0: 1977 dprintk("RPC: xprt %p connected to %s\n", --- 1307 unchanged lines hidden --- |