@@ -759,42 +759,18 @@ static int xs_send_kvec(struct socket *sock, struct msghdr *msg, struct kvec *ve
759759 return xs_sendmsg (sock , msg , seek );
760760}
761761
762- static int xs_send_pagedata (struct socket * sock , struct xdr_buf * xdr , unsigned int base , int more , bool zerocopy , int * sent_p )
762+ static int xs_send_pagedata (struct socket * sock , struct msghdr * msg , struct xdr_buf * xdr , size_t base )
763763{
764- ssize_t (* do_sendpage )(struct socket * sock , struct page * page ,
765- int offset , size_t size , int flags );
766- struct page * * ppage ;
767- unsigned int remainder ;
768764 int err ;
769765
770- remainder = xdr -> page_len - base ;
771- base += xdr -> page_base ;
772- ppage = xdr -> pages + (base >> PAGE_SHIFT );
773- base &= ~PAGE_MASK ;
774- do_sendpage = sock -> ops -> sendpage ;
775- if (!zerocopy )
776- do_sendpage = sock_no_sendpage ;
777- for (;;) {
778- unsigned int len = min_t (unsigned int , PAGE_SIZE - base , remainder );
779- int flags = XS_SENDMSG_FLAGS ;
766+ err = xdr_alloc_bvec (xdr , GFP_KERNEL );
767+ if (err < 0 )
768+ return err ;
780769
781- remainder -= len ;
782- if (more )
783- flags |= MSG_MORE ;
784- if (remainder != 0 )
785- flags |= MSG_SENDPAGE_NOTLAST | MSG_MORE ;
786- err = do_sendpage (sock , * ppage , base , len , flags );
787- if (remainder == 0 || err != len )
788- break ;
789- * sent_p += err ;
790- ppage ++ ;
791- base = 0 ;
792- }
793- if (err > 0 ) {
794- * sent_p += err ;
795- err = 0 ;
796- }
797- return err ;
770+ iov_iter_bvec (& msg -> msg_iter , WRITE , xdr -> bvec ,
771+ xdr_buf_pagecount (xdr ),
772+ xdr -> page_len + xdr -> page_base );
773+ return xs_sendmsg (sock , msg , base + xdr -> page_base );
798774}
799775
800776/**
@@ -817,7 +793,6 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
817793 };
818794 unsigned int remainder = xdr -> len - base ;
819795 int err = 0 ;
820- int sent = 0 ;
821796
822797 if (unlikely (!sock ))
823798 return - ENOTSOCK ;
@@ -843,10 +818,12 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
843818 if (base < xdr -> page_len ) {
844819 unsigned int len = xdr -> page_len - base ;
845820 remainder -= len ;
846- err = xs_send_pagedata (sock , xdr , base , remainder != 0 , zerocopy , & sent );
847- * sent_p += sent ;
848- if (remainder == 0 || sent != len )
821+ if (remainder == 0 )
822+ msg .msg_flags &= ~MSG_MORE ;
823+ err = xs_send_pagedata (sock , & msg , xdr , base );
824+ if (remainder == 0 || err != len )
849825 goto out ;
826+ * sent_p += err ;
850827 base = 0 ;
851828 } else
852829 base -= xdr -> page_len ;
0 commit comments