@@ -325,59 +325,34 @@ static int svc_one_sock_name(struct svc_sock *svsk, char *buf, int remaining)
325
325
/*
326
326
* Generic recvfrom routine.
327
327
*/
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 )
330
330
{
331
331
struct svc_sock * svsk =
332
332
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 ;
337
335
338
336
rqstp -> rq_xprt_hlen = 0 ;
339
337
340
338
clear_bit (XPT_DATA , & svsk -> sk_xprt .xpt_flags );
341
339
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 );
343
345
/* If we read a full record, then assume there may be more
344
346
* data to read (stream based sockets only!)
345
347
*/
346
348
if (len == buflen )
347
349
set_bit (XPT_DATA , & svsk -> sk_xprt .xpt_flags );
348
350
349
- dprintk ("svc: socket %p recvfrom(%p, %zu) = %d \n" ,
351
+ dprintk ("svc: socket %p recvfrom(%p, %zu) = %zd \n" ,
350
352
svsk , iov [0 ].iov_base , iov [0 ].iov_len , len );
351
353
return len ;
352
354
}
353
355
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
-
381
356
/*
382
357
* Set socket snd and rcv buffer lengths
383
358
*/
@@ -962,7 +937,8 @@ static int svc_tcp_recv_record(struct svc_sock *svsk, struct svc_rqst *rqstp)
962
937
want = sizeof (rpc_fraghdr ) - svsk -> sk_tcplen ;
963
938
iov .iov_base = ((char * ) & svsk -> sk_reclen ) + svsk -> sk_tcplen ;
964
939
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 )
966
942
goto error ;
967
943
svsk -> sk_tcplen += len ;
968
944
@@ -1088,14 +1064,13 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp)
1088
1064
1089
1065
vec = rqstp -> rq_vec ;
1090
1066
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 );
1093
1068
1094
1069
rqstp -> rq_respages = & rqstp -> rq_pages [pnum ];
1095
1070
rqstp -> rq_next_page = rqstp -> rq_respages + 1 ;
1096
1071
1097
1072
/* Now receive data */
1098
- len = svc_partial_recvfrom (rqstp , vec , pnum , want , base );
1073
+ len = svc_recvfrom (rqstp , vec , pnum , base + want , base );
1099
1074
if (len >= 0 ) {
1100
1075
svsk -> sk_tcplen += len ;
1101
1076
svsk -> sk_datalen += len ;
0 commit comments