]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: fixed up page revocation
authorSage Weil <sage@newdream.net>
Tue, 29 Apr 2008 18:08:59 +0000 (11:08 -0700)
committerSage Weil <sage@newdream.net>
Tue, 29 Apr 2008 18:08:59 +0000 (11:08 -0700)
src/kernel/messenger.c
src/kernel/messenger.h
src/kernel/osd_client.c

index 16dd5bccd5ab1b592403cd1c69ccd6425e26cb08..d6b6ebe95d0a8ea900b19de3fcefc3ced4417d27 100644 (file)
@@ -376,19 +376,18 @@ static int write_partial_msg_pages(struct ceph_connection *con,
                struct page *page;
                void *kaddr;
                mutex_lock(&msg->page_mutex);
-               page = msg->pages[con->out_msg_pos.page];
-               if (page) 
+               if (msg->pages) {
+                       page = msg->pages[con->out_msg_pos.page];
                        kaddr = kmap(page);
-               else {
-                       derr(0, "using zero page\n");
-                       kaddr = page_address(page);
-                       page = 0;
+               } else {
+                       /*dout(60, "using zero page\n");*/
+                       kaddr = page_address(con->msgr->zero_page);
                }
                kv.iov_base = kaddr + con->out_msg_pos.page_pos;
                kv.iov_len = min((int)(PAGE_SIZE - con->out_msg_pos.page_pos),
                                 (int)(data_len - con->out_msg_pos.data_pos));
                ret = ceph_tcp_sendmsg(con->sock, &kv, 1, kv.iov_len);
-               if (page)
+               if (msg->pages)
                        kunmap(page);
                mutex_unlock(&msg->page_mutex);
                if (ret <= 0)
@@ -404,8 +403,7 @@ static int write_partial_msg_pages(struct ceph_connection *con,
        /* done */
        dout(30, "write_partial_msg_pages wrote all pages on %p\n", con);
 
-       con->out_footer.aborted =
-               cpu_to_le32(con->out_msg->pages_revoked);
+       con->out_footer.aborted = cpu_to_le32(con->out_msg->pages == 0);
        con->out_kvec[0].iov_base = &con->out_footer;
        con->out_kvec_bytes = con->out_kvec[0].iov_len = 
                sizeof(con->out_footer);
@@ -1472,7 +1470,6 @@ struct ceph_msg *ceph_msg_new(int type, int front_len,
        /* pages */
        m->nr_pages = calc_pages_for(page_off, page_len);
        m->pages = pages;
-       m->pages_revoked = 0;
 
        INIT_LIST_HEAD(&m->list_head);
        dout(20, "ceph_msg_new %p page %d~%d -> %d\n", m, page_off, page_len, m->nr_pages);
index c6bbae3a1ffe61d7726a04163058c880b73a3a15..59fb4204bf1f9038890c7b7c139caa6addc54d23 100644 (file)
@@ -54,7 +54,6 @@ struct ceph_msg {
        struct kvec front;              /* first bit of message */
        struct mutex page_mutex;
        struct page **pages;            /* data payload.  NOT OWNER. */
-       int pages_revoked;              /* if true, pages revoked before sent */
        unsigned nr_pages;              /* size of page array */
        struct list_head list_head;
        atomic_t nref;
index b0b8fa28d8d505942e3a37f385f273ebb796da4f..85602a68ac22cb37170098b3006f22373ac8731f 100644 (file)
@@ -34,6 +34,8 @@ static void get_request(struct ceph_osd_request *req)
 
 static void put_request(struct ceph_osd_request *req)
 {
+       dout(10, "put_request %p %d -> %d\n", req, atomic_read(&req->r_ref),
+            atomic_read(&req->r_ref)-1);
        BUG_ON(atomic_read(&req->r_ref) <= 0);
        if (atomic_dec_and_test(&req->r_ref)) {
                ceph_msg_put(req->r_request);
@@ -450,10 +452,9 @@ int do_request(struct ceph_osd_client *osdc, struct ceph_osd_request *req)
        unregister_request(osdc, req);
        if (rc < 0) {
                struct ceph_msg *msg = req->r_request;
-               printk(KERN_ERR "osdc do_request err %d on %p\n", rc, msg);
+               dout(0, "tid %llu err %d, revoking %p pages\n", rc, msg);
                mutex_lock(&msg->page_mutex);
-               msg->pages_revoked = 1;
-               memset(&msg->pages, 0, sizeof(void *) * msg->nr_pages);
+               msg->pages = 0;
                mutex_unlock(&msg->page_mutex);
                return rc;
        }