X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fsunrpc%2Fxprt.c;h=c74a6bb9407428c2c471913dd787f7899551a486;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=a7ab07fe5cc04dd38a762630d90fe2aa31ec4d02;hpb=9bf4aaab3e101692164d49b7ca357651eb691cb6;p=linux-2.6.git diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index a7ab07fe5..c74a6bb94 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -90,6 +90,8 @@ static struct socket *xprt_create_socket(struct rpc_xprt *, int, int); static void xprt_bind_socket(struct rpc_xprt *, struct socket *); static int __xprt_get_cong(struct rpc_xprt *, struct rpc_task *); +static int xprt_clear_backlog(struct rpc_xprt *xprt); + #ifdef RPC_DEBUG_DATA /* * Print the buffer contents (first 128 bytes only--just enough for @@ -753,7 +755,7 @@ udp_data_ready(struct sock *sk, int len) struct rpc_rqst *rovr; struct sk_buff *skb; int err, repsize, copied; - u32 xid; + u32 _xid, *xp; read_lock(&sk->sk_callback_lock); dprintk("RPC: udp_data_ready...\n"); @@ -777,12 +779,14 @@ udp_data_ready(struct sock *sk, int len) } /* Copy the XID from the skb... */ - if (skb_copy_bits(skb, sizeof(struct udphdr), &xid, sizeof(xid)) < 0) + xp = skb_header_pointer(skb, sizeof(struct udphdr), + sizeof(_xid), &_xid); + if (xp == NULL) goto dropit; /* Look up and lock the request corresponding to the given XID */ spin_lock(&xprt->sock_lock); - rovr = xprt_lookup_rqst(xprt, xid); + rovr = xprt_lookup_rqst(xprt, *xp); if (!rovr) goto out_unlock; task = rovr->rq_task; @@ -889,7 +893,8 @@ tcp_read_xid(struct rpc_xprt *xprt, skb_reader_t *desc) xprt->tcp_flags &= ~XPRT_COPY_XID; xprt->tcp_flags |= XPRT_COPY_DATA; xprt->tcp_copied = 4; - dprintk("RPC: reading reply for XID %08x\n", xprt->tcp_xid); + dprintk("RPC: reading reply for XID %08x\n", + ntohl(xprt->tcp_xid)); tcp_check_recm(xprt); } @@ -909,7 +914,7 @@ tcp_read_request(struct rpc_xprt *xprt, skb_reader_t *desc) if (!req) { xprt->tcp_flags &= ~XPRT_COPY_DATA; dprintk("RPC: XID %08x request not found!\n", - xprt->tcp_xid); + ntohl(xprt->tcp_xid)); spin_unlock(&xprt->sock_lock); return; } @@ -1039,7 +1044,8 @@ tcp_state_change(struct sock *sk) dprintk("RPC: tcp_state_change client %p...\n", xprt); dprintk("RPC: state %x conn %d dead %d zapped %d\n", sk->sk_state, xprt_connected(xprt), - sock_flag(sk, SOCK_DEAD), sk->sk_zapped); + sock_flag(sk, SOCK_DEAD), + sock_flag(sk, SOCK_ZAPPED)); switch (sk->sk_state) { case TCP_ESTABLISHED: @@ -1099,7 +1105,7 @@ xprt_write_space(struct sock *sk) goto out; spin_lock_bh(&xprt->sock_lock); - if (xprt->snd_task && xprt->snd_task->tk_rpcwait == &xprt->pending) + if (xprt->snd_task) rpc_wake_up_task(xprt->snd_task); spin_unlock_bh(&xprt->sock_lock); out: @@ -1358,7 +1364,7 @@ xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt) req->rq_xprt = xprt; req->rq_xid = xprt_alloc_xid(xprt); dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid, - req, req->rq_xid); + req, ntohl(req->rq_xid)); } /* @@ -1395,7 +1401,7 @@ xprt_release(struct rpc_task *task) /* * Set default timeout parameters */ -void +static void xprt_default_timeout(struct rpc_timeout *to, int proto) { if (proto == IPPROTO_UDP) @@ -1455,8 +1461,11 @@ xprt_setup(int proto, struct sockaddr_in *ap, struct rpc_timeout *to) if (xprt->stream) { xprt->cwnd = RPC_MAXCWND(xprt); xprt->nocong = 1; - } else + xprt->max_payload = (1U << 31) - 1; + } else { xprt->cwnd = RPC_INITCWND; + xprt->max_payload = (1U << 16) - (MAX_HEADER << 3); + } spin_lock_init(&xprt->sock_lock); spin_lock_init(&xprt->xprt_lock); init_waitqueue_head(&xprt->cong_wait); @@ -1543,8 +1552,7 @@ xprt_bind_socket(struct rpc_xprt *xprt, struct socket *sock) sk->sk_no_check = UDP_CSUM_NORCV; xprt_set_connected(xprt); } else { - struct tcp_opt *tp = tcp_sk(sk); - tp->nonagle = 1; /* disable Nagle's algorithm */ + tcp_sk(sk)->nonagle = 1; /* disable Nagle's algorithm */ sk->sk_data_ready = tcp_data_ready; sk->sk_state_change = tcp_state_change; xprt_clear_connected(xprt); @@ -1631,7 +1639,7 @@ xprt_create_proto(int proto, struct sockaddr_in *sap, struct rpc_timeout *to) /* * Prepare for transport shutdown. */ -void +static void xprt_shutdown(struct rpc_xprt *xprt) { xprt->shutdown = 1; @@ -1646,7 +1654,7 @@ xprt_shutdown(struct rpc_xprt *xprt) /* * Clear the xprt backlog queue */ -int +static int xprt_clear_backlog(struct rpc_xprt *xprt) { rpc_wake_up_next(&xprt->backlog); wake_up(&xprt->cong_wait);