reply = ceph_msg_new(CEPH_MSG_CLIENT_RECONNECT, len, 0, 0, 0);
if (IS_ERR(reply))
return;
- *(__u32*)reply->front.iov_base = 0;
- *(__u8*)(reply->front.iov_base + 4) = 1; /* session was closed */
+ p = reply->front.iov_base;
+ end = p + len;
+ ceph_encode_8(&p, end, 1); /* session was closed */
+ ceph_encode_32(&p, end, 0);
goto send;
}
/* estimate needed space */
len += session->s_nr_caps * sizeof(struct ceph_mds_cap_reconnect);
len += session->s_nr_caps * (100); /* ugly hack */
+ dout(40, "estimating i need %d bytes for %d caps\n", len, session->s_nr_caps);
/* build reply */
reply = ceph_msg_new(CEPH_MSG_CLIENT_RECONNECT, len, 0, 0, 0);
end = p + len;
/* traverse this session's caps */
+ ceph_encode_8(&p, end, 0);
ceph_encode_32(&p, end, session->s_nr_caps);
list_for_each(cp, &session->s_caps) {
cap = list_entry(cp, struct ceph_inode_cap, session_caps);
+ dout(10, " adding cap %p on ino %lx\n", cap, cap->ci->vfs_inode.i_ino);
ceph_encode_32(&p, end, ceph_caps_wanted(cap->ci));
ceph_encode_32(&p, end, ceph_caps_issued(cap->ci));
ceph_encode_64(&p, end, cap->ci->i_wr_size);
ceph_encode_string(&p, end, path, pathlen);
kfree(path);
}
- ceph_encode_8(&p, end, 0);
- reply->front.iov_len = end-p;
+
+ len = p - reply->front.iov_base;
+ reply->hdr.front_len = reply->front.iov_len = len;
+ dout(10, "final len is %d\n", len);
send:
send_msg_mds(mdsc, reply, mds);
{
int ret;
- dout(30, "write_partial_kvec %p left %d vec %d bytes\n", con,
+ dout(30, "write_partial_kvec %p : %d vec, %d bytes left\n", con,
con->out_kvec_left, con->out_kvec_bytes);
while (con->out_kvec_bytes > 0) {
ret = ceph_tcp_sendmsg(con->sock, con->out_kvec_cur,
con->out_kvec_left, con->out_kvec_bytes);
if (ret <= 0) goto out;
+ dout(30, "write_partial_kvec %p : wrote %d\n", con, ret);
con->out_kvec_bytes -= ret;
if (con->out_kvec_bytes == 0)
break; /* done */
dout(20, "prepare_write_message %p seq %d type %d len %d+%d\n",
m, m->hdr.seq, m->hdr.type, m->hdr.front_len, m->hdr.data_len);
+ BUG_ON(m->hdr.front_len != m->front.iov_len);
/* tag + hdr + front */
con->out_kvec[0].iov_base = &tag_msg;
void encode_payload() {
__u32 n = inode_caps.size();
+ ::_encode_simple(closed, payload);
::_encode_simple(n, payload);
for (map<inodeno_t, inode_caps_reconnect_t>::iterator p = inode_caps.begin();
p != inode_caps.end();
::_encode_simple(p->second, payload);
::_encode_simple(inode_path[p->first], payload);
}
- ::_encode(closed, payload);
}
void decode_payload() {
bufferlist::iterator p = payload.begin();
+ ::_decode_simple(closed, p);
__u32 n;
::_decode_simple(n, p);
while (n--) {
::_decode_simple(inode_caps[ino], p);
::_decode_simple(inode_path[ino], p);
}
- ::_decode_simple(closed, p);
}
};