aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/xprtsock.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc/xprtsock.c')
-rw-r--r--net/sunrpc/xprtsock.c42
1 files changed, 21 insertions, 21 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 966763d735e9..25a3dcf15cae 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -254,7 +254,7 @@ struct sock_xprt {
254 /* 254 /*
255 * Saved socket callback addresses 255 * Saved socket callback addresses
256 */ 256 */
257 void (*old_data_ready)(struct sock *, int); 257 void (*old_data_ready)(struct sock *);
258 void (*old_state_change)(struct sock *); 258 void (*old_state_change)(struct sock *);
259 void (*old_write_space)(struct sock *); 259 void (*old_write_space)(struct sock *);
260 void (*old_error_report)(struct sock *); 260 void (*old_error_report)(struct sock *);
@@ -909,6 +909,12 @@ static void xs_tcp_close(struct rpc_xprt *xprt)
909 xs_tcp_shutdown(xprt); 909 xs_tcp_shutdown(xprt);
910} 910}
911 911
912static void xs_xprt_free(struct rpc_xprt *xprt)
913{
914 xs_free_peer_addresses(xprt);
915 xprt_free(xprt);
916}
917
912/** 918/**
913 * xs_destroy - prepare to shutdown a transport 919 * xs_destroy - prepare to shutdown a transport
914 * @xprt: doomed transport 920 * @xprt: doomed transport
@@ -919,8 +925,7 @@ static void xs_destroy(struct rpc_xprt *xprt)
919 dprintk("RPC: xs_destroy xprt %p\n", xprt); 925 dprintk("RPC: xs_destroy xprt %p\n", xprt);
920 926
921 xs_close(xprt); 927 xs_close(xprt);
922 xs_free_peer_addresses(xprt); 928 xs_xprt_free(xprt);
923 xprt_free(xprt);
924 module_put(THIS_MODULE); 929 module_put(THIS_MODULE);
925} 930}
926 931
@@ -946,7 +951,7 @@ static int xs_local_copy_to_xdr(struct xdr_buf *xdr, struct sk_buff *skb)
946 * 951 *
947 * Currently this assumes we can read the whole reply in a single gulp. 952 * Currently this assumes we can read the whole reply in a single gulp.
948 */ 953 */
949static void xs_local_data_ready(struct sock *sk, int len) 954static void xs_local_data_ready(struct sock *sk)
950{ 955{
951 struct rpc_task *task; 956 struct rpc_task *task;
952 struct rpc_xprt *xprt; 957 struct rpc_xprt *xprt;
@@ -1009,7 +1014,7 @@ static void xs_local_data_ready(struct sock *sk, int len)
1009 * @len: how much data to read 1014 * @len: how much data to read
1010 * 1015 *
1011 */ 1016 */
1012static void xs_udp_data_ready(struct sock *sk, int len) 1017static void xs_udp_data_ready(struct sock *sk)
1013{ 1018{
1014 struct rpc_task *task; 1019 struct rpc_task *task;
1015 struct rpc_xprt *xprt; 1020 struct rpc_xprt *xprt;
@@ -1432,7 +1437,7 @@ static int xs_tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb, uns
1432 * @bytes: how much data to read 1437 * @bytes: how much data to read
1433 * 1438 *
1434 */ 1439 */
1435static void xs_tcp_data_ready(struct sock *sk, int bytes) 1440static void xs_tcp_data_ready(struct sock *sk)
1436{ 1441{
1437 struct rpc_xprt *xprt; 1442 struct rpc_xprt *xprt;
1438 read_descriptor_t rd_desc; 1443 read_descriptor_t rd_desc;
@@ -2532,6 +2537,10 @@ static void bc_close(struct rpc_xprt *xprt)
2532 2537
2533static void bc_destroy(struct rpc_xprt *xprt) 2538static void bc_destroy(struct rpc_xprt *xprt)
2534{ 2539{
2540 dprintk("RPC: bc_destroy xprt %p\n", xprt);
2541
2542 xs_xprt_free(xprt);
2543 module_put(THIS_MODULE);
2535} 2544}
2536 2545
2537static struct rpc_xprt_ops xs_local_ops = { 2546static struct rpc_xprt_ops xs_local_ops = {
@@ -2732,7 +2741,7 @@ static struct rpc_xprt *xs_setup_local(struct xprt_create *args)
2732 return xprt; 2741 return xprt;
2733 ret = ERR_PTR(-EINVAL); 2742 ret = ERR_PTR(-EINVAL);
2734out_err: 2743out_err:
2735 xprt_free(xprt); 2744 xs_xprt_free(xprt);
2736 return ret; 2745 return ret;
2737} 2746}
2738 2747
@@ -2810,7 +2819,7 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args)
2810 return xprt; 2819 return xprt;
2811 ret = ERR_PTR(-EINVAL); 2820 ret = ERR_PTR(-EINVAL);
2812out_err: 2821out_err:
2813 xprt_free(xprt); 2822 xs_xprt_free(xprt);
2814 return ret; 2823 return ret;
2815} 2824}
2816 2825
@@ -2885,12 +2894,11 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args)
2885 xprt->address_strings[RPC_DISPLAY_ADDR], 2894 xprt->address_strings[RPC_DISPLAY_ADDR],
2886 xprt->address_strings[RPC_DISPLAY_PROTO]); 2895 xprt->address_strings[RPC_DISPLAY_PROTO]);
2887 2896
2888
2889 if (try_module_get(THIS_MODULE)) 2897 if (try_module_get(THIS_MODULE))
2890 return xprt; 2898 return xprt;
2891 ret = ERR_PTR(-EINVAL); 2899 ret = ERR_PTR(-EINVAL);
2892out_err: 2900out_err:
2893 xprt_free(xprt); 2901 xs_xprt_free(xprt);
2894 return ret; 2902 return ret;
2895} 2903}
2896 2904
@@ -2907,15 +2915,6 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args)
2907 struct svc_sock *bc_sock; 2915 struct svc_sock *bc_sock;
2908 struct rpc_xprt *ret; 2916 struct rpc_xprt *ret;
2909 2917
2910 if (args->bc_xprt->xpt_bc_xprt) {
2911 /*
2912 * This server connection already has a backchannel
2913 * transport; we can't create a new one, as we wouldn't
2914 * be able to match replies based on xid any more. So,
2915 * reuse the already-existing one:
2916 */
2917 return args->bc_xprt->xpt_bc_xprt;
2918 }
2919 xprt = xs_setup_xprt(args, xprt_tcp_slot_table_entries, 2918 xprt = xs_setup_xprt(args, xprt_tcp_slot_table_entries,
2920 xprt_tcp_slot_table_entries); 2919 xprt_tcp_slot_table_entries);
2921 if (IS_ERR(xprt)) 2920 if (IS_ERR(xprt))
@@ -2973,13 +2972,14 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args)
2973 */ 2972 */
2974 xprt_set_connected(xprt); 2973 xprt_set_connected(xprt);
2975 2974
2976
2977 if (try_module_get(THIS_MODULE)) 2975 if (try_module_get(THIS_MODULE))
2978 return xprt; 2976 return xprt;
2977
2978 args->bc_xprt->xpt_bc_xprt = NULL;
2979 xprt_put(xprt); 2979 xprt_put(xprt);
2980 ret = ERR_PTR(-EINVAL); 2980 ret = ERR_PTR(-EINVAL);
2981out_err: 2981out_err:
2982 xprt_free(xprt); 2982 xs_xprt_free(xprt);
2983 return ret; 2983 return ret;
2984} 2984}
2985 2985