xprtsock.c (8ecee4620e76aae418bfa0e8cc830e92cb559bbb) xprtsock.c (f75e6745aa3084124ae1434fd7629853bdaf6798)
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

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

802}
803
804/**
805 * xs_close - close a socket
806 * @xprt: transport
807 *
808 * This is used when all requests are complete; ie, no DRC state remains
809 * on the server we want to save.
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

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

802}
803
804/**
805 * xs_close - close a socket
806 * @xprt: transport
807 *
808 * This is used when all requests are complete; ie, no DRC state remains
809 * on the server we want to save.
810 *
811 * The caller _must_ be holding XPRT_LOCKED in order to avoid issues with
812 * xs_reset_transport() zeroing the socket from underneath a writer.
810 */
811static void xs_close(struct rpc_xprt *xprt)
812{
813 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
814
815 dprintk("RPC: xs_close xprt %p\n", xprt);
816
817 xs_reset_transport(transport);
818
819 smp_mb__before_clear_bit();
820 clear_bit(XPRT_CONNECTION_ABORT, &xprt->state);
821 clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
822 clear_bit(XPRT_CLOSING, &xprt->state);
823 smp_mb__after_clear_bit();
824 xprt_disconnect_done(xprt);
825}
826
813 */
814static void xs_close(struct rpc_xprt *xprt)
815{
816 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
817
818 dprintk("RPC: xs_close xprt %p\n", xprt);
819
820 xs_reset_transport(transport);
821
822 smp_mb__before_clear_bit();
823 clear_bit(XPRT_CONNECTION_ABORT, &xprt->state);
824 clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
825 clear_bit(XPRT_CLOSING, &xprt->state);
826 smp_mb__after_clear_bit();
827 xprt_disconnect_done(xprt);
828}
829
830static void xs_tcp_close(struct rpc_xprt *xprt)
831{
832 if (test_and_clear_bit(XPRT_CONNECTION_CLOSE, &xprt->state))
833 xs_close(xprt);
834 else
835 xs_tcp_shutdown(xprt);
836}
837
827/**
828 * xs_destroy - prepare to shutdown a transport
829 * @xprt: doomed transport
830 *
831 */
832static void xs_destroy(struct rpc_xprt *xprt)
833{
834 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);

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

1767 dprintk("RPC: worker connecting xprt %p to address: %s\n",
1768 xprt, xprt->address_strings[RPC_DISPLAY_ALL]);
1769
1770 status = xs_tcp_finish_connecting(xprt, sock);
1771 dprintk("RPC: %p connect status %d connected %d sock state %d\n",
1772 xprt, -status, xprt_connected(xprt),
1773 sock->sk->sk_state);
1774 switch (status) {
838/**
839 * xs_destroy - prepare to shutdown a transport
840 * @xprt: doomed transport
841 *
842 */
843static void xs_destroy(struct rpc_xprt *xprt)
844{
845 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);

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

1778 dprintk("RPC: worker connecting xprt %p to address: %s\n",
1779 xprt, xprt->address_strings[RPC_DISPLAY_ALL]);
1780
1781 status = xs_tcp_finish_connecting(xprt, sock);
1782 dprintk("RPC: %p connect status %d connected %d sock state %d\n",
1783 xprt, -status, xprt_connected(xprt),
1784 sock->sk->sk_state);
1785 switch (status) {
1786 default:
1787 printk("%s: connect returned unhandled error %d\n",
1788 __func__, status);
1789 case -EADDRNOTAVAIL:
1790 /* We're probably in TIME_WAIT. Get rid of existing socket,
1791 * and retry
1792 */
1793 set_bit(XPRT_CONNECTION_CLOSE, &xprt->state);
1794 xprt_force_disconnect(xprt);
1775 case -ECONNREFUSED:
1776 case -ECONNRESET:
1777 case -ENETUNREACH:
1778 /* retry with existing socket, after a delay */
1779 case 0:
1780 case -EINPROGRESS:
1781 case -EALREADY:
1782 xprt_clear_connecting(xprt);
1783 return;
1784 }
1795 case -ECONNREFUSED:
1796 case -ECONNRESET:
1797 case -ENETUNREACH:
1798 /* retry with existing socket, after a delay */
1799 case 0:
1800 case -EINPROGRESS:
1801 case -EALREADY:
1802 xprt_clear_connecting(xprt);
1803 return;
1804 }
1785 /* get rid of existing socket, and retry */
1786 xs_tcp_shutdown(xprt);
1787 printk("%s: connect returned unhandled error %d\n",
1788 __func__, status);
1789out_eagain:
1790 status = -EAGAIN;
1791out:
1792 xprt_clear_connecting(xprt);
1793 xprt_wake_pending_tasks(xprt, status);
1794}
1795
1796static struct socket *xs_create_tcp_sock4(struct rpc_xprt *xprt,

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

1989 .release_xprt = xs_tcp_release_xprt,
1990 .rpcbind = rpcb_getport_async,
1991 .set_port = xs_set_port,
1992 .connect = xs_tcp_connect,
1993 .buf_alloc = rpc_malloc,
1994 .buf_free = rpc_free,
1995 .send_request = xs_tcp_send_request,
1996 .set_retrans_timeout = xprt_set_retrans_timeout_def,
1805out_eagain:
1806 status = -EAGAIN;
1807out:
1808 xprt_clear_connecting(xprt);
1809 xprt_wake_pending_tasks(xprt, status);
1810}
1811
1812static struct socket *xs_create_tcp_sock4(struct rpc_xprt *xprt,

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

2005 .release_xprt = xs_tcp_release_xprt,
2006 .rpcbind = rpcb_getport_async,
2007 .set_port = xs_set_port,
2008 .connect = xs_tcp_connect,
2009 .buf_alloc = rpc_malloc,
2010 .buf_free = rpc_free,
2011 .send_request = xs_tcp_send_request,
2012 .set_retrans_timeout = xprt_set_retrans_timeout_def,
1997 .close = xs_tcp_shutdown,
2013 .close = xs_tcp_close,
1998 .destroy = xs_destroy,
1999 .print_stats = xs_tcp_print_stats,
2000};
2001
2002static struct rpc_xprt *xs_setup_xprt(struct xprt_create *args,
2003 unsigned int slot_table_size)
2004{
2005 struct rpc_xprt *xprt;

--- 216 unchanged lines hidden ---
2014 .destroy = xs_destroy,
2015 .print_stats = xs_tcp_print_stats,
2016};
2017
2018static struct rpc_xprt *xs_setup_xprt(struct xprt_create *args,
2019 unsigned int slot_table_size)
2020{
2021 struct rpc_xprt *xprt;

--- 216 unchanged lines hidden ---