diff options
| author | Ilya Dryomov <idryomov@gmail.com> | 2018-11-16 05:58:19 -0500 |
|---|---|---|
| committer | Ilya Dryomov <idryomov@gmail.com> | 2018-12-26 09:56:04 -0500 |
| commit | 3239eb5215ebdef593a79316c9dbbdf8849166ec (patch) | |
| tree | f76919e91cc7fcc004eac6a4c9364c110338e3c5 /net | |
| parent | 1f6b821aef78e3d79e8d598ae59fc7e23fb6c563 (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.c | 32 |
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 | ||
| 563 | static 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 | |||
| 576 | static int ceph_tcp_sendpage(struct socket *sock, struct page *page, | 563 | static 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 | ||
