aboutsummaryrefslogtreecommitdiffstats
path: root/net/ceph
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-03-12 00:34:23 -0400
committerSage Weil <sage@inktank.com>2013-05-02 00:17:27 -0400
commit878efabd3236abaedd0a4539bbb248ac69fed115 (patch)
treecbd6e9f6af2f756a26631e36e868fc4c5189992b /net/ceph
parent6518be47f910f62a98cb6044dbb457af55241f95 (diff)
libceph: use cursor for inbound data pages
The cursor code for a page array selects the right page, page offset, and length to use for a ceph_tcp_recvpage() call, so we can use it to replace a block in read_partial_message_pages(). This partially resolves: http://tracker.ceph.com/issues/4428 Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'net/ceph')
-rw-r--r--net/ceph/messenger.c17
1 files changed, 4 insertions, 13 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index b634d2098777..f81fbce136f8 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -1441,8 +1441,10 @@ static void in_msg_pos_next(struct ceph_connection *con, size_t len,
1441 1441
1442 msg_pos->data_pos += received; 1442 msg_pos->data_pos += received;
1443 msg_pos->page_pos += received; 1443 msg_pos->page_pos += received;
1444 if (ceph_msg_has_pages(msg))
1445 (void) ceph_msg_data_advance(&msg->p, received);
1444#ifdef CONFIG_BLOCK 1446#ifdef CONFIG_BLOCK
1445 if (ceph_msg_has_bio(msg)) 1447 else if (ceph_msg_has_bio(msg))
1446 (void) ceph_msg_data_advance(&msg->b, received); 1448 (void) ceph_msg_data_advance(&msg->b, received);
1447#endif /* CONFIG_BLOCK */ 1449#endif /* CONFIG_BLOCK */
1448 if (received < len) 1450 if (received < len)
@@ -2192,23 +2194,12 @@ static int read_partial_message_pages(struct ceph_connection *con,
2192 unsigned int data_len, bool do_datacrc) 2194 unsigned int data_len, bool do_datacrc)
2193{ 2195{
2194 struct ceph_msg *msg = con->in_msg; 2196 struct ceph_msg *msg = con->in_msg;
2195 struct ceph_msg_pos *msg_pos = &con->in_msg_pos;
2196 struct page **pages;
2197 struct page *page; 2197 struct page *page;
2198 size_t page_offset; 2198 size_t page_offset;
2199 size_t length; 2199 size_t length;
2200 unsigned int left;
2201 int ret; 2200 int ret;
2202 2201
2203 /* (page) data */ 2202 page = ceph_msg_data_next(&msg->p, &page_offset, &length, NULL);
2204 pages = msg->p.pages;
2205 BUG_ON(pages == NULL);
2206 page = pages[msg_pos->page];
2207 page_offset = msg_pos->page_pos;
2208 BUG_ON(msg_pos->data_pos >= data_len);
2209 left = data_len - msg_pos->data_pos;
2210 BUG_ON(page_offset >= PAGE_SIZE);
2211 length = min_t(unsigned int, PAGE_SIZE - page_offset, left);
2212 2203
2213 ret = ceph_tcp_recvpage(con->sock, page, page_offset, length); 2204 ret = ceph_tcp_recvpage(con->sock, page, page_offset, length);
2214 if (ret <= 0) 2205 if (ret <= 0)