From aa6149284bb2c8c1f0c94d6f2c342f9e61c1164a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 8 Jan 2008 10:38:00 -0800 Subject: [PATCH] fixed data_off bug in messenger when reading data pages --- src/kernel/mds_client.c | 2 +- src/kernel/messenger.c | 9 +++++++-- src/kernel/osd_client.c | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index f96c28b298434..c944c8736baf7 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -728,7 +728,7 @@ void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, struct ceph_msg *msg) if ((err = ceph_decode_32(&p, end, &maplen)) != 0) goto bad; - dout(2, "ceph_mdsc_handle_map epoch %u len %d\n", epoch, (int)maplen); + dout(2, "handle_map epoch %u len %d\n", epoch, (int)maplen); /* do we need it? */ spin_lock(&mdsc->lock); diff --git a/src/kernel/messenger.c b/src/kernel/messenger.c index 603aa7aa6e701..3fec9c7b7ab54 100644 --- a/src/kernel/messenger.c +++ b/src/kernel/messenger.c @@ -559,6 +559,8 @@ static int read_message_partial(struct ceph_connection *con) void *p; int ret; int want, left; + + dout(20, "read_message_partial con %p msg %p\n", con, m); /* header */ while (con->in_base_pos < sizeof(struct ceph_msg_header)) { @@ -591,10 +593,10 @@ static int read_message_partial(struct ceph_connection *con) goto done; if (m->nr_pages == 0) { con->in_msg_pos.page = 0; - con->in_msg_pos.page_pos = m->hdr.data_off; + con->in_msg_pos.page_pos = m->hdr.data_off & ~PAGE_MASK; con->in_msg_pos.data_pos = 0; /* find (or alloc) pages for data payload */ - want = calc_pages_for(m->hdr.data_len, m->hdr.data_off); + want = calc_pages_for(m->hdr.data_len, m->hdr.data_off & ~PAGE_MASK); ret = 0; BUG_ON(!con->msgr->prepare_pages); ret = con->msgr->prepare_pages(con->msgr->parent, m, want); @@ -615,6 +617,8 @@ static int read_message_partial(struct ceph_connection *con) while (con->in_msg_pos.data_pos < m->hdr.data_len) { left = min((int)(m->hdr.data_len - con->in_msg_pos.data_pos), (int)(PAGE_SIZE - con->in_msg_pos.page_pos)); + /*dout(10, "data_pos = %d, data_len = %d, page_pos=%d left = %d\n", + con->in_msg_pos.data_pos, m->hdr.data_len, con->in_msg_pos.page_pos, left);*/ p = kmap(m->pages[con->in_msg_pos.page]); ret = ceph_tcp_recvmsg(con->sock, p + con->in_msg_pos.page_pos, left); if (ret <= 0) return ret; @@ -627,6 +631,7 @@ static int read_message_partial(struct ceph_connection *con) } done: + dout(20, "read_message_partial got msg %p\n", m); return 1; /* done! */ } diff --git a/src/kernel/osd_client.c b/src/kernel/osd_client.c index 534c26f354dbe..2056953c2b381 100644 --- a/src/kernel/osd_client.c +++ b/src/kernel/osd_client.c @@ -267,7 +267,7 @@ int ceph_osdc_prepare_pages(void *p, struct ceph_msg *m, int want) __u64 tid; int ret = -1; - dout(10, "prepare_pages on %p\n", m); + dout(10, "prepare_pages on msg %p want %d\n", m, want); if (unlikely(le32_to_cpu(m->hdr.type) != CEPH_MSG_OSD_OPREPLY)) return -1; /* hmm! */ @@ -334,9 +334,9 @@ int ceph_osdc_readpage(struct ceph_osd_client *osdc, ceph_ino_t ino, spin_unlock(&osdc->lock); /* wait */ - dout(10, "readpage waiting for reply on %p\n", req); + dout(10, "readpage tid %llu waiting for reply on %p\n", req->r_tid, req); wait_for_completion(&req->r_completion); - dout(10, "readpage got reply on %p\n", req); + dout(10, "readpage tid %llu got reply on %p\n", req->r_tid, req); spin_lock(&osdc->lock); unregister_request(osdc, req); -- 2.39.5