libceph: use sock_no_sendpage() as a fallback in ceph_tcp_sendpage()
authorIlya Dryomov <idryomov@gmail.com>
Fri, 16 Nov 2018 10:58:19 +0000 (11:58 +0100)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 26 Dec 2018 14:56:04 +0000 (15:56 +0100)
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>
net/ceph/messenger.c

index cca96d3..21a743a 100644 (file)
@@ -560,24 +560,12 @@ static int ceph_tcp_sendmsg(struct socket *sock, struct kvec *iov,
        return r;
 }
 
-static int __ceph_tcp_sendpage(struct socket *sock, struct page *page,
-                    int offset, size_t size, bool more)
-{
-       int flags = MSG_DONTWAIT | MSG_NOSIGNAL | (more ? MSG_MORE : MSG_EOR);
-       int ret;
-
-       ret = kernel_sendpage(sock, page, offset, size, flags);
-       if (ret == -EAGAIN)
-               ret = 0;
-
-       return ret;
-}
-
 static int ceph_tcp_sendpage(struct socket *sock, struct page *page,
                     int offset, size_t size, bool more)
 {
-       struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL };
-       struct bio_vec bvec;
+       ssize_t (*sendpage)(struct socket *sock, struct page *page,
+                           int offset, size_t size, int flags);
+       int flags = MSG_DONTWAIT | MSG_NOSIGNAL | (more ? MSG_MORE : 0);
        int ret;
 
        /*
@@ -589,19 +577,11 @@ static int ceph_tcp_sendpage(struct socket *sock, struct page *page,
         * triggers one of hardened usercopy checks.
         */
        if (page_count(page) >= 1 && !PageSlab(page))
-               return __ceph_tcp_sendpage(sock, page, offset, size, more);
-
-       bvec.bv_page = page;
-       bvec.bv_offset = offset;
-       bvec.bv_len = size;
-
-       if (more)
-               msg.msg_flags |= MSG_MORE;
+               sendpage = sock->ops->sendpage;
        else
-               msg.msg_flags |= MSG_EOR;  /* superfluous, but what the hell */
+               sendpage = sock_no_sendpage;
 
-       iov_iter_bvec(&msg.msg_iter, WRITE, &bvec, 1, size);
-       ret = sock_sendmsg(sock, &msg);
+       ret = sendpage(sock, page, offset, size, flags);
        if (ret == -EAGAIN)
                ret = 0;