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