Skip to content

Commit 4c8e553

Browse files
trondmyJ. Bruce Fields
authored andcommitted
SUNRPC: Simplify TCP receive code
Use the fact that the iov iterators already have functionality for skipping a base offset. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
1 parent 1863d77 commit 4c8e553

File tree

1 file changed

+14
-39
lines changed

1 file changed

+14
-39
lines changed

net/sunrpc/svcsock.c

Lines changed: 14 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -325,59 +325,34 @@ static int svc_one_sock_name(struct svc_sock *svsk, char *buf, int remaining)
325325
/*
326326
* Generic recvfrom routine.
327327
*/
328-
static int svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr,
329-
int buflen)
328+
static ssize_t svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov,
329+
unsigned int nr, size_t buflen, unsigned int base)
330330
{
331331
struct svc_sock *svsk =
332332
container_of(rqstp->rq_xprt, struct svc_sock, sk_xprt);
333-
struct msghdr msg = {
334-
.msg_flags = MSG_DONTWAIT,
335-
};
336-
int len;
333+
struct msghdr msg = { NULL };
334+
ssize_t len;
337335

338336
rqstp->rq_xprt_hlen = 0;
339337

340338
clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
341339
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, iov, nr, buflen);
342-
len = sock_recvmsg(svsk->sk_sock, &msg, msg.msg_flags);
340+
if (base != 0) {
341+
iov_iter_advance(&msg.msg_iter, base);
342+
buflen -= base;
343+
}
344+
len = sock_recvmsg(svsk->sk_sock, &msg, MSG_DONTWAIT);
343345
/* If we read a full record, then assume there may be more
344346
* data to read (stream based sockets only!)
345347
*/
346348
if (len == buflen)
347349
set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
348350

349-
dprintk("svc: socket %p recvfrom(%p, %zu) = %d\n",
351+
dprintk("svc: socket %p recvfrom(%p, %zu) = %zd\n",
350352
svsk, iov[0].iov_base, iov[0].iov_len, len);
351353
return len;
352354
}
353355

354-
static int svc_partial_recvfrom(struct svc_rqst *rqstp,
355-
struct kvec *iov, int nr,
356-
int buflen, unsigned int base)
357-
{
358-
size_t save_iovlen;
359-
void *save_iovbase;
360-
unsigned int i;
361-
int ret;
362-
363-
if (base == 0)
364-
return svc_recvfrom(rqstp, iov, nr, buflen);
365-
366-
for (i = 0; i < nr; i++) {
367-
if (iov[i].iov_len > base)
368-
break;
369-
base -= iov[i].iov_len;
370-
}
371-
save_iovlen = iov[i].iov_len;
372-
save_iovbase = iov[i].iov_base;
373-
iov[i].iov_len -= base;
374-
iov[i].iov_base += base;
375-
ret = svc_recvfrom(rqstp, &iov[i], nr - i, buflen);
376-
iov[i].iov_len = save_iovlen;
377-
iov[i].iov_base = save_iovbase;
378-
return ret;
379-
}
380-
381356
/*
382357
* Set socket snd and rcv buffer lengths
383358
*/
@@ -962,7 +937,8 @@ static int svc_tcp_recv_record(struct svc_sock *svsk, struct svc_rqst *rqstp)
962937
want = sizeof(rpc_fraghdr) - svsk->sk_tcplen;
963938
iov.iov_base = ((char *) &svsk->sk_reclen) + svsk->sk_tcplen;
964939
iov.iov_len = want;
965-
if ((len = svc_recvfrom(rqstp, &iov, 1, want)) < 0)
940+
len = svc_recvfrom(rqstp, &iov, 1, want, 0);
941+
if (len < 0)
966942
goto error;
967943
svsk->sk_tcplen += len;
968944

@@ -1088,14 +1064,13 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp)
10881064

10891065
vec = rqstp->rq_vec;
10901066

1091-
pnum = copy_pages_to_kvecs(&vec[0], &rqstp->rq_pages[0],
1092-
svsk->sk_datalen + want);
1067+
pnum = copy_pages_to_kvecs(&vec[0], &rqstp->rq_pages[0], base + want);
10931068

10941069
rqstp->rq_respages = &rqstp->rq_pages[pnum];
10951070
rqstp->rq_next_page = rqstp->rq_respages + 1;
10961071

10971072
/* Now receive data */
1098-
len = svc_partial_recvfrom(rqstp, vec, pnum, want, base);
1073+
len = svc_recvfrom(rqstp, vec, pnum, base + want, base);
10991074
if (len >= 0) {
11001075
svsk->sk_tcplen += len;
11011076
svsk->sk_datalen += len;

0 commit comments

Comments
 (0)