X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fsunrpc%2Fxprt.c;h=c74a6bb9407428c2c471913dd787f7899551a486;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=abfb211847b8967d4a0b540c36372823d2d99568;hpb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;p=linux-2.6.git diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index abfb21184..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; } @@ -973,7 +978,7 @@ static int tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb, unsigned int offset, size_t len) { - struct rpc_xprt *xprt = (struct rpc_xprt *)rd_desc->buf; + struct rpc_xprt *xprt = rd_desc->arg.data; skb_reader_t desc = { .skb = skb, .offset = offset, @@ -1021,7 +1026,7 @@ static void tcp_data_ready(struct sock *sk, int bytes) goto out; /* We use rd_desc to pass struct xprt to tcp_data_recv */ - rd_desc.buf = (char *)xprt; + rd_desc.arg.data = xprt; rd_desc.count = 65536; tcp_read_sock(sk, &rd_desc, tcp_data_recv); out: @@ -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: @@ -1086,8 +1092,8 @@ xprt_write_space(struct sock *sk) /* Wait until we have enough socket memory */ if (xprt->stream) { - /* from net/ipv4/tcp.c:tcp_write_space */ - if (tcp_wspace(sk) < tcp_min_write_space(sk)) + /* from net/core/stream.c:sk_stream_write_space */ + if (sk_stream_wspace(sk) < sk_stream_min_wspace(sk)) goto out; } else { /* from net/core/sock.c:sock_def_write_space */ @@ -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: @@ -1296,21 +1302,6 @@ xprt_transmit(struct rpc_task *task) /* * Reserve an RPC call slot. */ -void -xprt_reserve(struct rpc_task *task) -{ - struct rpc_xprt *xprt = task->tk_xprt; - - task->tk_status = -EIO; - if (!xprt->shutdown) { - spin_lock(&xprt->xprt_lock); - do_xprt_reserve(task); - spin_unlock(&xprt->xprt_lock); - if (task->tk_rqstp) - del_timer_sync(&xprt->timer); - } -} - static inline void do_xprt_reserve(struct rpc_task *task) { @@ -1332,6 +1323,21 @@ do_xprt_reserve(struct rpc_task *task) rpc_sleep_on(&xprt->backlog, task, NULL, NULL); } +void +xprt_reserve(struct rpc_task *task) +{ + struct rpc_xprt *xprt = task->tk_xprt; + + task->tk_status = -EIO; + if (!xprt->shutdown) { + spin_lock(&xprt->xprt_lock); + do_xprt_reserve(task); + spin_unlock(&xprt->xprt_lock); + if (task->tk_rqstp) + del_timer_sync(&xprt->timer); + } +} + /* * Allocate a 'unique' XID */ @@ -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);