@@ -742,21 +742,21 @@ xs_stream_start_connect(struct sock_xprt *transport)
742742
743743#define XS_SENDMSG_FLAGS (MSG_DONTWAIT | MSG_NOSIGNAL)
744744
745- static int xs_send_kvec (struct socket * sock , struct sockaddr * addr , int addrlen , struct kvec * vec , unsigned int base , int more )
745+ static int xs_sendmsg (struct socket * sock , struct msghdr * msg , size_t seek )
746746{
747- struct msghdr msg = {
748- .msg_name = addr ,
749- .msg_namelen = addrlen ,
750- .msg_flags = XS_SENDMSG_FLAGS | (more ? MSG_MORE : 0 ),
751- };
752- struct kvec iov = {
753- .iov_base = vec -> iov_base + base ,
754- .iov_len = vec -> iov_len - base ,
755- };
747+ if (seek )
748+ iov_iter_advance (& msg -> msg_iter , seek );
749+ return sock_sendmsg (sock , msg );
750+ }
756751
757- if (iov .iov_len != 0 )
758- return kernel_sendmsg (sock , & msg , & iov , 1 , iov .iov_len );
759- return kernel_sendmsg (sock , & msg , NULL , 0 , 0 );
752+ static int xs_send_kvec (struct socket * sock , struct msghdr * msg , struct kvec * vec , size_t seek )
753+ {
754+ if (!vec ) {
755+ iov_iter_kvec (& msg -> msg_iter , WRITE , NULL , 0 , 0 );
756+ return sock_sendmsg (sock , msg );
757+ }
758+ iov_iter_kvec (& msg -> msg_iter , WRITE , vec , 1 , vec -> iov_len );
759+ return xs_sendmsg (sock , msg , seek );
760760}
761761
762762static int xs_send_pagedata (struct socket * sock , struct xdr_buf * xdr , unsigned int base , int more , bool zerocopy , int * sent_p )
@@ -810,6 +810,11 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i
810810 */
811811static int xs_sendpages (struct socket * sock , struct sockaddr * addr , int addrlen , struct xdr_buf * xdr , unsigned int base , bool zerocopy , int * sent_p )
812812{
813+ struct msghdr msg = {
814+ .msg_name = addr ,
815+ .msg_namelen = addrlen ,
816+ .msg_flags = XS_SENDMSG_FLAGS | MSG_MORE ,
817+ };
813818 unsigned int remainder = xdr -> len - base ;
814819 int err = 0 ;
815820 int sent = 0 ;
@@ -825,7 +830,9 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
825830 if (base < xdr -> head [0 ].iov_len || addr != NULL ) {
826831 unsigned int len = xdr -> head [0 ].iov_len - base ;
827832 remainder -= len ;
828- err = xs_send_kvec (sock , addr , addrlen , & xdr -> head [0 ], base , remainder != 0 );
833+ if (remainder == 0 )
834+ msg .msg_flags &= ~MSG_MORE ;
835+ err = xs_send_kvec (sock , & msg , & xdr -> head [0 ], base );
829836 if (remainder == 0 || err != len )
830837 goto out ;
831838 * sent_p += err ;
@@ -846,7 +853,8 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
846853
847854 if (base >= xdr -> tail [0 ].iov_len )
848855 return 0 ;
849- err = xs_send_kvec (sock , NULL , 0 , & xdr -> tail [0 ], base , 0 );
856+ msg .msg_flags &= ~MSG_MORE ;
857+ err = xs_send_kvec (sock , & msg , & xdr -> tail [0 ], base );
850858out :
851859 if (err > 0 ) {
852860 * sent_p += err ;
0 commit comments