diff options
| -rw-r--r-- | net/sunrpc/xprt.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/xprtsock.c | 40 |
2 files changed, 23 insertions, 19 deletions
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 3ca31f20b97c..ab5dd621ae0c 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
| @@ -611,8 +611,8 @@ static void xprt_autoclose(struct work_struct *work) | |||
| 611 | struct rpc_xprt *xprt = | 611 | struct rpc_xprt *xprt = |
| 612 | container_of(work, struct rpc_xprt, task_cleanup); | 612 | container_of(work, struct rpc_xprt, task_cleanup); |
| 613 | 613 | ||
| 614 | xprt->ops->close(xprt); | ||
| 615 | clear_bit(XPRT_CLOSE_WAIT, &xprt->state); | 614 | clear_bit(XPRT_CLOSE_WAIT, &xprt->state); |
| 615 | xprt->ops->close(xprt); | ||
| 616 | xprt_release_write(xprt, NULL); | 616 | xprt_release_write(xprt, NULL); |
| 617 | } | 617 | } |
| 618 | 618 | ||
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index fda8ec8c74c0..ee0715dfc3c7 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -623,24 +623,6 @@ process_status: | |||
| 623 | } | 623 | } |
| 624 | 624 | ||
| 625 | /** | 625 | /** |
| 626 | * xs_tcp_shutdown - gracefully shut down a TCP socket | ||
| 627 | * @xprt: transport | ||
| 628 | * | ||
| 629 | * Initiates a graceful shutdown of the TCP socket by calling the | ||
| 630 | * equivalent of shutdown(SHUT_RDWR); | ||
| 631 | */ | ||
| 632 | static void xs_tcp_shutdown(struct rpc_xprt *xprt) | ||
| 633 | { | ||
| 634 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); | ||
| 635 | struct socket *sock = transport->sock; | ||
| 636 | |||
| 637 | if (sock != NULL) { | ||
| 638 | kernel_sock_shutdown(sock, SHUT_RDWR); | ||
| 639 | trace_rpc_socket_shutdown(xprt, sock); | ||
| 640 | } | ||
| 641 | } | ||
| 642 | |||
| 643 | /** | ||
| 644 | * xs_tcp_send_request - write an RPC request to a TCP socket | 626 | * xs_tcp_send_request - write an RPC request to a TCP socket |
| 645 | * @task: address of RPC task that manages the state of an RPC request | 627 | * @task: address of RPC task that manages the state of an RPC request |
| 646 | * | 628 | * |
| @@ -786,6 +768,7 @@ static void xs_sock_mark_closed(struct rpc_xprt *xprt) | |||
| 786 | xs_sock_reset_connection_flags(xprt); | 768 | xs_sock_reset_connection_flags(xprt); |
| 787 | /* Mark transport as closed and wake up all pending tasks */ | 769 | /* Mark transport as closed and wake up all pending tasks */ |
| 788 | xprt_disconnect_done(xprt); | 770 | xprt_disconnect_done(xprt); |
| 771 | xprt_force_disconnect(xprt); | ||
| 789 | } | 772 | } |
| 790 | 773 | ||
| 791 | /** | 774 | /** |
| @@ -2103,6 +2086,27 @@ out: | |||
| 2103 | xprt_wake_pending_tasks(xprt, status); | 2086 | xprt_wake_pending_tasks(xprt, status); |
| 2104 | } | 2087 | } |
| 2105 | 2088 | ||
| 2089 | /** | ||
| 2090 | * xs_tcp_shutdown - gracefully shut down a TCP socket | ||
| 2091 | * @xprt: transport | ||
| 2092 | * | ||
| 2093 | * Initiates a graceful shutdown of the TCP socket by calling the | ||
| 2094 | * equivalent of shutdown(SHUT_RDWR); | ||
| 2095 | */ | ||
| 2096 | static void xs_tcp_shutdown(struct rpc_xprt *xprt) | ||
| 2097 | { | ||
| 2098 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); | ||
| 2099 | struct socket *sock = transport->sock; | ||
| 2100 | |||
| 2101 | if (sock == NULL) | ||
| 2102 | return; | ||
| 2103 | if (xprt_connected(xprt)) { | ||
| 2104 | kernel_sock_shutdown(sock, SHUT_RDWR); | ||
| 2105 | trace_rpc_socket_shutdown(xprt, sock); | ||
| 2106 | } else | ||
| 2107 | xs_reset_transport(transport); | ||
| 2108 | } | ||
| 2109 | |||
| 2106 | static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) | 2110 | static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) |
| 2107 | { | 2111 | { |
| 2108 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); | 2112 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); |
