aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2018-11-16 05:58:19 -0500
committerIlya Dryomov <idryomov@gmail.com>2018-12-26 09:56:04 -0500
commit3239eb5215ebdef593a79316c9dbbdf8849166ec (patch)
treef76919e91cc7fcc004eac6a4c9364c110338e3c5 /net
parent1f6b821aef78e3d79e8d598ae59fc7e23fb6c563 (diff)
libceph: use sock_no_sendpage() as a fallback in ceph_tcp_sendpage()
sock_no_sendpage() makes the code cleaner. Also, don't set MSG_EOR. sendpage doesn't act on MSG_EOR on its own, it just honors the setting from the preceding sendmsg call by looking at ->eor in tcp_skb_can_collapse_to(). Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/messenger.c32
1 files changed, 6 insertions, 26 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index cca96d32ac64..21a743a3bd29 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -560,24 +560,12 @@ static int ceph_tcp_sendmsg(struct socket *sock, struct kvec *iov,
560 return r; 560 return r;
561} 561}
562 562
563static int __ceph_tcp_sendpage(struct socket *sock, struct page *page,
564 int offset, size_t size, bool more)
565{
566 int flags = MSG_DONTWAIT | MSG_NOSIGNAL | (more ? MSG_MORE : MSG_EOR);
567 int ret;
568
569 ret = kernel_sendpage(sock, page, offset, size, flags);
570 if (ret == -EAGAIN)
571 ret = 0;
572
573 return ret;
574}
575
576static int ceph_tcp_sendpage(struct socket *sock, struct page *page, 563static int ceph_tcp_sendpage(struct socket *sock, struct page *page,
577 int offset, size_t size, bool more) 564 int offset, size_t size, bool more)
578{ 565{
579 struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL }; 566 ssize_t (*sendpage)(struct socket *sock, struct page *page,
580 struct bio_vec bvec; 567 int offset, size_t size, int flags);
568 int flags = MSG_DONTWAIT | MSG_NOSIGNAL | (more ? MSG_MORE : 0);
581 int ret; 569 int ret;
582 570
583 /* 571 /*
@@ -589,19 +577,11 @@ static int ceph_tcp_sendpage(struct socket *sock, struct page *page,
589 * triggers one of hardened usercopy checks. 577 * triggers one of hardened usercopy checks.
590 */ 578 */
591 if (page_count(page) >= 1 && !PageSlab(page)) 579 if (page_count(page) >= 1 && !PageSlab(page))
592 return __ceph_tcp_sendpage(sock, page, offset, size, more); 580 sendpage = sock->ops->sendpage;
593
594 bvec.bv_page = page;
595 bvec.bv_offset = offset;
596 bvec.bv_len = size;
597
598 if (more)
599 msg.msg_flags |= MSG_MORE;
600 else 581 else
601 msg.msg_flags |= MSG_EOR; /* superfluous, but what the hell */ 582 sendpage = sock_no_sendpage;
602 583
603 iov_iter_bvec(&msg.msg_iter, WRITE, &bvec, 1, size); 584 ret = sendpage(sock, page, offset, size, flags);
604 ret = sock_sendmsg(sock, &msg);
605 if (ret == -EAGAIN) 585 if (ret == -EAGAIN)
606 ret = 0; 586 ret = 0;
607 587