diff options
author | Sage Weil <sage@newdream.net> | 2010-11-09 15:40:00 -0500 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2010-11-09 15:43:17 -0500 |
commit | c5c6b19d4b8f5431fca05f28ae9e141045022149 (patch) | |
tree | 0961d9aeee49f481134089ac5b93b7118cf3a34b /net/ceph/osd_client.c | |
parent | b7495fc2ff941db6a118a93ab8d61149e3f4cef8 (diff) |
ceph: explicitly specify page alignment in network messages
The alignment used for reading data into or out of pages used to be taken
from the data_off field in the message header. This only worked as long
as the page alignment matched the object offset, breaking direct io to
non-page aligned offsets.
Instead, explicitly specify the page alignment next to the page vector
in the ceph_msg struct, and use that instead of the message header (which
probably shouldn't be trusted). The alloc_msg callback is responsible for
filling in this field properly when it sets up the page vector.
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'net/ceph/osd_client.c')
-rw-r--r-- | net/ceph/osd_client.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 6c096239660c..3e20a122ffa2 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
@@ -391,6 +391,8 @@ void ceph_osdc_build_request(struct ceph_osd_request *req, | |||
391 | req->r_request->hdr.data_len = cpu_to_le32(data_len); | 391 | req->r_request->hdr.data_len = cpu_to_le32(data_len); |
392 | } | 392 | } |
393 | 393 | ||
394 | req->r_request->page_alignment = req->r_page_alignment; | ||
395 | |||
394 | BUG_ON(p > msg->front.iov_base + msg->front.iov_len); | 396 | BUG_ON(p > msg->front.iov_base + msg->front.iov_len); |
395 | msg_size = p - msg->front.iov_base; | 397 | msg_size = p - msg->front.iov_base; |
396 | msg->front.iov_len = msg_size; | 398 | msg->front.iov_len = msg_size; |
@@ -1657,6 +1659,7 @@ static struct ceph_msg *get_reply(struct ceph_connection *con, | |||
1657 | } | 1659 | } |
1658 | m->pages = req->r_pages; | 1660 | m->pages = req->r_pages; |
1659 | m->nr_pages = req->r_num_pages; | 1661 | m->nr_pages = req->r_num_pages; |
1662 | m->page_alignment = req->r_page_alignment; | ||
1660 | #ifdef CONFIG_BLOCK | 1663 | #ifdef CONFIG_BLOCK |
1661 | m->bio = req->r_bio; | 1664 | m->bio = req->r_bio; |
1662 | #endif | 1665 | #endif |