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