diff options
author | Alex Elder <elder@inktank.com> | 2013-03-12 00:34:23 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-02 00:17:27 -0400 |
commit | 878efabd3236abaedd0a4539bbb248ac69fed115 (patch) | |
tree | cbd6e9f6af2f756a26631e36e868fc4c5189992b | |
parent | 6518be47f910f62a98cb6044dbb457af55241f95 (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>
-rw-r--r-- | net/ceph/messenger.c | 17 |
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) |