]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
fixed data_off bug in messenger when reading data pages
authorSage Weil <sage@newdream.net>
Tue, 8 Jan 2008 18:38:00 +0000 (10:38 -0800)
committerSage Weil <sage@newdream.net>
Tue, 8 Jan 2008 18:38:00 +0000 (10:38 -0800)
src/kernel/mds_client.c
src/kernel/messenger.c
src/kernel/osd_client.c

index f96c28b2984344486a9c044b186f49a6dc8137a1..c944c8736baf793de886fd7c88a55be3fe22e9ed 100644 (file)
@@ -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);
index 603aa7aa6e7011e43b163cbef1f010c72dab317a..3fec9c7b7ab541d2e9f79fc3391d45fa1053d6f2 100644 (file)
@@ -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! */
 }
 
index 534c26f354dbe0af2adab5d8169dcc05029061ae..2056953c2b3819f8a073b9700c6e563350c747f1 100644 (file)
@@ -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);