diff options
Diffstat (limited to 'net/sunrpc/svcsock.c')
-rw-r--r-- | net/sunrpc/svcsock.c | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 2016d9c63f88..5fb537e4d63b 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -325,19 +325,21 @@ svc_sock_dequeue(struct svc_pool *pool) | |||
325 | } | 325 | } |
326 | 326 | ||
327 | /* | 327 | /* |
328 | * Having read something from a socket, check whether it | 328 | * svc_xprt_received conditionally queues the transport for processing |
329 | * needs to be re-enqueued. | 329 | * by another thread. The caller must hold the XPT_BUSY bit and must |
330 | * Note: XPT_DATA only gets cleared when a read-attempt finds | 330 | * not thereafter touch transport data. |
331 | * no (or insufficient) data. | 331 | * |
332 | * Note: XPT_DATA only gets cleared when a read-attempt finds no (or | ||
333 | * insufficient) data. | ||
332 | */ | 334 | */ |
333 | static inline void | 335 | void svc_xprt_received(struct svc_xprt *xprt) |
334 | svc_sock_received(struct svc_sock *svsk) | ||
335 | { | 336 | { |
336 | svsk->sk_xprt.xpt_pool = NULL; | 337 | BUG_ON(!test_bit(XPT_BUSY, &xprt->xpt_flags)); |
337 | clear_bit(XPT_BUSY, &svsk->sk_xprt.xpt_flags); | 338 | xprt->xpt_pool = NULL; |
338 | svc_xprt_enqueue(&svsk->sk_xprt); | 339 | clear_bit(XPT_BUSY, &xprt->xpt_flags); |
340 | svc_xprt_enqueue(xprt); | ||
339 | } | 341 | } |
340 | 342 | EXPORT_SYMBOL_GPL(svc_xprt_received); | |
341 | 343 | ||
342 | /** | 344 | /** |
343 | * svc_reserve - change the space reserved for the reply to a request. | 345 | * svc_reserve - change the space reserved for the reply to a request. |
@@ -766,7 +768,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
766 | (serv->sv_nrthreads+3) * serv->sv_max_mesg); | 768 | (serv->sv_nrthreads+3) * serv->sv_max_mesg); |
767 | 769 | ||
768 | if ((rqstp->rq_deferred = svc_deferred_dequeue(svsk))) { | 770 | if ((rqstp->rq_deferred = svc_deferred_dequeue(svsk))) { |
769 | svc_sock_received(svsk); | 771 | svc_xprt_received(&svsk->sk_xprt); |
770 | return svc_deferred_recv(rqstp); | 772 | return svc_deferred_recv(rqstp); |
771 | } | 773 | } |
772 | 774 | ||
@@ -783,7 +785,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
783 | dprintk("svc: recvfrom returned error %d\n", -err); | 785 | dprintk("svc: recvfrom returned error %d\n", -err); |
784 | set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); | 786 | set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); |
785 | } | 787 | } |
786 | svc_sock_received(svsk); | 788 | svc_xprt_received(&svsk->sk_xprt); |
787 | return -EAGAIN; | 789 | return -EAGAIN; |
788 | } | 790 | } |
789 | rqstp->rq_addrlen = sizeof(rqstp->rq_addr); | 791 | rqstp->rq_addrlen = sizeof(rqstp->rq_addr); |
@@ -798,7 +800,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
798 | /* | 800 | /* |
799 | * Maybe more packets - kick another thread ASAP. | 801 | * Maybe more packets - kick another thread ASAP. |
800 | */ | 802 | */ |
801 | svc_sock_received(svsk); | 803 | svc_xprt_received(&svsk->sk_xprt); |
802 | 804 | ||
803 | len = skb->len - sizeof(struct udphdr); | 805 | len = skb->len - sizeof(struct udphdr); |
804 | rqstp->rq_arg.len = len; | 806 | rqstp->rq_arg.len = len; |
@@ -1104,7 +1106,7 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt) | |||
1104 | } | 1106 | } |
1105 | memcpy(&newsvsk->sk_local, sin, slen); | 1107 | memcpy(&newsvsk->sk_local, sin, slen); |
1106 | 1108 | ||
1107 | svc_sock_received(newsvsk); | 1109 | svc_xprt_received(&newsvsk->sk_xprt); |
1108 | 1110 | ||
1109 | if (serv->sv_stats) | 1111 | if (serv->sv_stats) |
1110 | serv->sv_stats->nettcpconn++; | 1112 | serv->sv_stats->nettcpconn++; |
@@ -1134,7 +1136,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp) | |||
1134 | test_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags)); | 1136 | test_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags)); |
1135 | 1137 | ||
1136 | if ((rqstp->rq_deferred = svc_deferred_dequeue(svsk))) { | 1138 | if ((rqstp->rq_deferred = svc_deferred_dequeue(svsk))) { |
1137 | svc_sock_received(svsk); | 1139 | svc_xprt_received(&svsk->sk_xprt); |
1138 | return svc_deferred_recv(rqstp); | 1140 | return svc_deferred_recv(rqstp); |
1139 | } | 1141 | } |
1140 | 1142 | ||
@@ -1174,7 +1176,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp) | |||
1174 | if (len < want) { | 1176 | if (len < want) { |
1175 | dprintk("svc: short recvfrom while reading record length (%d of %lu)\n", | 1177 | dprintk("svc: short recvfrom while reading record length (%d of %lu)\n", |
1176 | len, want); | 1178 | len, want); |
1177 | svc_sock_received(svsk); | 1179 | svc_xprt_received(&svsk->sk_xprt); |
1178 | return -EAGAIN; /* record header not complete */ | 1180 | return -EAGAIN; /* record header not complete */ |
1179 | } | 1181 | } |
1180 | 1182 | ||
@@ -1210,7 +1212,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp) | |||
1210 | if (len < svsk->sk_reclen) { | 1212 | if (len < svsk->sk_reclen) { |
1211 | dprintk("svc: incomplete TCP record (%d of %d)\n", | 1213 | dprintk("svc: incomplete TCP record (%d of %d)\n", |
1212 | len, svsk->sk_reclen); | 1214 | len, svsk->sk_reclen); |
1213 | svc_sock_received(svsk); | 1215 | svc_xprt_received(&svsk->sk_xprt); |
1214 | return -EAGAIN; /* record not complete */ | 1216 | return -EAGAIN; /* record not complete */ |
1215 | } | 1217 | } |
1216 | len = svsk->sk_reclen; | 1218 | len = svsk->sk_reclen; |
@@ -1250,7 +1252,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp) | |||
1250 | svsk->sk_reclen = 0; | 1252 | svsk->sk_reclen = 0; |
1251 | svsk->sk_tcplen = 0; | 1253 | svsk->sk_tcplen = 0; |
1252 | 1254 | ||
1253 | svc_sock_received(svsk); | 1255 | svc_xprt_received(&svsk->sk_xprt); |
1254 | if (serv->sv_stats) | 1256 | if (serv->sv_stats) |
1255 | serv->sv_stats->nettcpcnt++; | 1257 | serv->sv_stats->nettcpcnt++; |
1256 | 1258 | ||
@@ -1263,7 +1265,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp) | |||
1263 | error: | 1265 | error: |
1264 | if (len == -EAGAIN) { | 1266 | if (len == -EAGAIN) { |
1265 | dprintk("RPC: TCP recvfrom got EAGAIN\n"); | 1267 | dprintk("RPC: TCP recvfrom got EAGAIN\n"); |
1266 | svc_sock_received(svsk); | 1268 | svc_xprt_received(&svsk->sk_xprt); |
1267 | } else { | 1269 | } else { |
1268 | printk(KERN_NOTICE "%s: recvfrom returned errno %d\n", | 1270 | printk(KERN_NOTICE "%s: recvfrom returned errno %d\n", |
1269 | svsk->sk_xprt.xpt_server->sv_name, -len); | 1271 | svsk->sk_xprt.xpt_server->sv_name, -len); |
@@ -1590,7 +1592,7 @@ svc_recv(struct svc_rqst *rqstp, long timeout) | |||
1590 | __module_get(newxpt->xpt_class->xcl_owner); | 1592 | __module_get(newxpt->xpt_class->xcl_owner); |
1591 | svc_check_conn_limits(svsk->sk_xprt.xpt_server); | 1593 | svc_check_conn_limits(svsk->sk_xprt.xpt_server); |
1592 | } | 1594 | } |
1593 | svc_sock_received(svsk); | 1595 | svc_xprt_received(&svsk->sk_xprt); |
1594 | } else { | 1596 | } else { |
1595 | dprintk("svc: server %p, pool %u, socket %p, inuse=%d\n", | 1597 | dprintk("svc: server %p, pool %u, socket %p, inuse=%d\n", |
1596 | rqstp, pool->sp_id, svsk, | 1598 | rqstp, pool->sp_id, svsk, |
@@ -1809,7 +1811,7 @@ int svc_addsock(struct svc_serv *serv, | |||
1809 | else { | 1811 | else { |
1810 | svsk = svc_setup_socket(serv, so, &err, SVC_SOCK_DEFAULTS); | 1812 | svsk = svc_setup_socket(serv, so, &err, SVC_SOCK_DEFAULTS); |
1811 | if (svsk) { | 1813 | if (svsk) { |
1812 | svc_sock_received(svsk); | 1814 | svc_xprt_received(&svsk->sk_xprt); |
1813 | err = 0; | 1815 | err = 0; |
1814 | } | 1816 | } |
1815 | } | 1817 | } |
@@ -1865,7 +1867,7 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv, | |||
1865 | } | 1867 | } |
1866 | 1868 | ||
1867 | if ((svsk = svc_setup_socket(serv, sock, &error, flags)) != NULL) { | 1869 | if ((svsk = svc_setup_socket(serv, sock, &error, flags)) != NULL) { |
1868 | svc_sock_received(svsk); | 1870 | svc_xprt_received(&svsk->sk_xprt); |
1869 | return (struct svc_xprt *)svsk; | 1871 | return (struct svc_xprt *)svsk; |
1870 | } | 1872 | } |
1871 | 1873 | ||