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)
/* 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);
/* 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);
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;
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);
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;
}