diff options
-rw-r--r-- | fs/lockd/host.c | 3 | ||||
-rw-r--r-- | include/linux/sunrpc/xprt.h | 3 | ||||
-rw-r--r-- | net/sunrpc/xprt.c | 3 | ||||
-rw-r--r-- | net/sunrpc/xprtsock.c | 28 |
4 files changed, 21 insertions, 16 deletions
diff --git a/fs/lockd/host.c b/fs/lockd/host.c index 82c77df81c5f..7901f5b8092c 100644 --- a/fs/lockd/host.c +++ b/fs/lockd/host.c | |||
@@ -173,11 +173,10 @@ nlm_bind_host(struct nlm_host *host) | |||
173 | 173 | ||
174 | /* If we've already created an RPC client, check whether | 174 | /* If we've already created an RPC client, check whether |
175 | * RPC rebind is required | 175 | * RPC rebind is required |
176 | * Note: why keep rebinding if we're on a tcp connection? | ||
177 | */ | 176 | */ |
178 | if ((clnt = host->h_rpcclnt) != NULL) { | 177 | if ((clnt = host->h_rpcclnt) != NULL) { |
179 | xprt = clnt->cl_xprt; | 178 | xprt = clnt->cl_xprt; |
180 | if (!xprt->stream && time_after_eq(jiffies, host->h_nextrebind)) { | 179 | if (time_after_eq(jiffies, host->h_nextrebind)) { |
181 | clnt->cl_port = 0; | 180 | clnt->cl_port = 0; |
182 | host->h_nextrebind = jiffies + NLM_HOST_REBIND; | 181 | host->h_nextrebind = jiffies + NLM_HOST_REBIND; |
183 | dprintk("lockd: next rebind in %ld jiffies\n", | 182 | dprintk("lockd: next rebind in %ld jiffies\n", |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 966c456a0f6d..c9477f022efb 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
@@ -168,8 +168,7 @@ struct rpc_xprt { | |||
168 | unsigned long state; /* transport state */ | 168 | unsigned long state; /* transport state */ |
169 | unsigned char shutdown : 1, /* being shut down */ | 169 | unsigned char shutdown : 1, /* being shut down */ |
170 | nocong : 1, /* no congestion control */ | 170 | nocong : 1, /* no congestion control */ |
171 | resvport : 1, /* use a reserved port */ | 171 | resvport : 1; /* use a reserved port */ |
172 | stream : 1; /* TCP */ | ||
173 | 172 | ||
174 | /* | 173 | /* |
175 | * XID | 174 | * XID |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 31ef7dc7eed6..43fef7626442 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -630,8 +630,7 @@ void xprt_transmit(struct rpc_task *task) | |||
630 | case -ENOTCONN: | 630 | case -ENOTCONN: |
631 | return; | 631 | return; |
632 | default: | 632 | default: |
633 | if (xprt->stream) | 633 | break; |
634 | xprt_disconnect(xprt); | ||
635 | } | 634 | } |
636 | xprt_release_write(xprt, task); | 635 | xprt_release_write(xprt, task); |
637 | return; | 636 | return; |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index aaf053b1a0c4..5bb6fed3df34 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -356,6 +356,7 @@ static int xs_tcp_send_request(struct rpc_task *task) | |||
356 | default: | 356 | default: |
357 | dprintk("RPC: sendmsg returned unrecognized error %d\n", | 357 | dprintk("RPC: sendmsg returned unrecognized error %d\n", |
358 | -status); | 358 | -status); |
359 | xprt_disconnect(xprt); | ||
359 | break; | 360 | break; |
360 | } | 361 | } |
361 | 362 | ||
@@ -826,19 +827,17 @@ static void xs_tcp_write_space(struct sock *sk) | |||
826 | } | 827 | } |
827 | 828 | ||
828 | /** | 829 | /** |
829 | * xs_set_buffer_size - set send and receive limits | 830 | * xs_udp_set_buffer_size - set send and receive limits |
830 | * @xprt: generic transport | 831 | * @xprt: generic transport |
831 | * | 832 | * |
832 | * Set socket send and receive limits based on the | 833 | * Set socket send and receive limits based on the |
833 | * sndsize and rcvsize fields in the generic transport | 834 | * sndsize and rcvsize fields in the generic transport |
834 | * structure. This applies only to UDP sockets. | 835 | * structure. |
835 | */ | 836 | */ |
836 | static void xs_set_buffer_size(struct rpc_xprt *xprt) | 837 | static void xs_udp_set_buffer_size(struct rpc_xprt *xprt) |
837 | { | 838 | { |
838 | struct sock *sk = xprt->inet; | 839 | struct sock *sk = xprt->inet; |
839 | 840 | ||
840 | if (xprt->stream) | ||
841 | return; | ||
842 | if (xprt->rcvsize) { | 841 | if (xprt->rcvsize) { |
843 | sk->sk_userlocks |= SOCK_RCVBUF_LOCK; | 842 | sk->sk_userlocks |= SOCK_RCVBUF_LOCK; |
844 | sk->sk_rcvbuf = xprt->rcvsize * xprt->max_reqs * 2; | 843 | sk->sk_rcvbuf = xprt->rcvsize * xprt->max_reqs * 2; |
@@ -850,6 +849,17 @@ static void xs_set_buffer_size(struct rpc_xprt *xprt) | |||
850 | } | 849 | } |
851 | } | 850 | } |
852 | 851 | ||
852 | /** | ||
853 | * xs_tcp_set_buffer_size - set send and receive limits | ||
854 | * @xprt: generic transport | ||
855 | * | ||
856 | * Nothing to do for TCP. | ||
857 | */ | ||
858 | static void xs_tcp_set_buffer_size(struct rpc_xprt *xprt) | ||
859 | { | ||
860 | return; | ||
861 | } | ||
862 | |||
853 | static int xs_bindresvport(struct rpc_xprt *xprt, struct socket *sock) | 863 | static int xs_bindresvport(struct rpc_xprt *xprt, struct socket *sock) |
854 | { | 864 | { |
855 | struct sockaddr_in myaddr = { | 865 | struct sockaddr_in myaddr = { |
@@ -928,7 +938,7 @@ static void xs_udp_connect_worker(void *args) | |||
928 | 938 | ||
929 | write_unlock_bh(&sk->sk_callback_lock); | 939 | write_unlock_bh(&sk->sk_callback_lock); |
930 | } | 940 | } |
931 | xs_set_buffer_size(xprt); | 941 | xs_udp_set_buffer_size(xprt); |
932 | status = 0; | 942 | status = 0; |
933 | out: | 943 | out: |
934 | xprt_wake_pending_tasks(xprt, status); | 944 | xprt_wake_pending_tasks(xprt, status); |
@@ -1034,7 +1044,7 @@ static void xs_connect(struct rpc_task *task) | |||
1034 | } | 1044 | } |
1035 | 1045 | ||
1036 | static struct rpc_xprt_ops xs_udp_ops = { | 1046 | static struct rpc_xprt_ops xs_udp_ops = { |
1037 | .set_buffer_size = xs_set_buffer_size, | 1047 | .set_buffer_size = xs_udp_set_buffer_size, |
1038 | .connect = xs_connect, | 1048 | .connect = xs_connect, |
1039 | .send_request = xs_udp_send_request, | 1049 | .send_request = xs_udp_send_request, |
1040 | .close = xs_close, | 1050 | .close = xs_close, |
@@ -1042,7 +1052,7 @@ static struct rpc_xprt_ops xs_udp_ops = { | |||
1042 | }; | 1052 | }; |
1043 | 1053 | ||
1044 | static struct rpc_xprt_ops xs_tcp_ops = { | 1054 | static struct rpc_xprt_ops xs_tcp_ops = { |
1045 | .set_buffer_size = xs_set_buffer_size, | 1055 | .set_buffer_size = xs_tcp_set_buffer_size, |
1046 | .connect = xs_connect, | 1056 | .connect = xs_connect, |
1047 | .send_request = xs_tcp_send_request, | 1057 | .send_request = xs_tcp_send_request, |
1048 | .close = xs_close, | 1058 | .close = xs_close, |
@@ -1074,7 +1084,6 @@ int xs_setup_udp(struct rpc_xprt *xprt, struct rpc_timeout *to) | |||
1074 | xprt->prot = IPPROTO_UDP; | 1084 | xprt->prot = IPPROTO_UDP; |
1075 | xprt->port = XS_MAX_RESVPORT; | 1085 | xprt->port = XS_MAX_RESVPORT; |
1076 | xprt->tsh_size = 0; | 1086 | xprt->tsh_size = 0; |
1077 | xprt->stream = 0; | ||
1078 | xprt->nocong = 0; | 1087 | xprt->nocong = 0; |
1079 | xprt->cwnd = RPC_INITCWND; | 1088 | xprt->cwnd = RPC_INITCWND; |
1080 | xprt->resvport = capable(CAP_NET_BIND_SERVICE) ? 1 : 0; | 1089 | xprt->resvport = capable(CAP_NET_BIND_SERVICE) ? 1 : 0; |
@@ -1115,7 +1124,6 @@ int xs_setup_tcp(struct rpc_xprt *xprt, struct rpc_timeout *to) | |||
1115 | xprt->prot = IPPROTO_TCP; | 1124 | xprt->prot = IPPROTO_TCP; |
1116 | xprt->port = XS_MAX_RESVPORT; | 1125 | xprt->port = XS_MAX_RESVPORT; |
1117 | xprt->tsh_size = sizeof(rpc_fraghdr) / sizeof(u32); | 1126 | xprt->tsh_size = sizeof(rpc_fraghdr) / sizeof(u32); |
1118 | xprt->stream = 1; | ||
1119 | xprt->nocong = 1; | 1127 | xprt->nocong = 1; |
1120 | xprt->cwnd = RPC_MAXCWND(xprt); | 1128 | xprt->cwnd = RPC_MAXCWND(xprt); |
1121 | xprt->resvport = capable(CAP_NET_BIND_SERVICE) ? 1 : 0; | 1129 | xprt->resvport = capable(CAP_NET_BIND_SERVICE) ? 1 : 0; |