From b3dfd15c8c923dc5a238e98b891a7b28e89e0a7b Mon Sep 17 00:00:00 2001 From: Alex Elder Date: Wed, 7 Mar 2012 11:40:08 -0600 Subject: [PATCH] --- yaml --- r: 296523 b: refs/heads/master c: 31739139f3ed7be802dd9019ec8d8cc910e3d241 h: refs/heads/master i: 296521: f1272ee8d348bdef33f3169ed0a9d4ef05e80ab1 296519: 16c4c4f1f0f86d5c4e52080a7994e328c4747855 v: v3 --- [refs] | 2 +- trunk/net/ceph/messenger.c | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 5ec969019680..991c5427101e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 37675b0f42a8f7699c3602350d1c3b2a1698a3d3 +refs/heads/master: 31739139f3ed7be802dd9019ec8d8cc910e3d241 diff --git a/trunk/net/ceph/messenger.c b/trunk/net/ceph/messenger.c index 589b7689d31b..9207a8c0b214 100644 --- a/trunk/net/ceph/messenger.c +++ b/trunk/net/ceph/messenger.c @@ -321,6 +321,19 @@ 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, int 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; +} + /* * Shutdown/close the socket for the given connection. @@ -944,12 +957,9 @@ static int write_partial_skip(struct ceph_connection *con) int ret; while (con->out_skip > 0) { - struct kvec iov = { - .iov_base = zero_page_address, - .iov_len = min(con->out_skip, (int)PAGE_CACHE_SIZE) - }; + size_t size = min(con->out_skip, (int) PAGE_CACHE_SIZE); - ret = ceph_tcp_sendmsg(con->sock, &iov, 1, iov.iov_len, 1); + ret = ceph_tcp_sendpage(con->sock, zero_page, 0, size, 1); if (ret <= 0) goto out; con->out_skip -= ret;