From 65ab8d267c0f47e41200c830ab10f71858a6fb47 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 16 Jan 2008 12:10:00 -0800 Subject: [PATCH] reconnect getting closer --- src/kernel/mds_client.c | 15 +++++++++++---- src/kernel/messenger.c | 4 +++- src/kernel/messenger.h | 2 +- src/messages/MClientReconnect.h | 4 ++-- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index c0c5a818b5f6b..97febba605586 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -722,14 +722,17 @@ void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds) 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); @@ -739,9 +742,11 @@ void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds) 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); @@ -769,8 +774,10 @@ void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds) 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); diff --git a/src/kernel/messenger.c b/src/kernel/messenger.c index f9ff0f1f6e96f..eaf0adad18cc6 100644 --- a/src/kernel/messenger.c +++ b/src/kernel/messenger.c @@ -305,12 +305,13 @@ static int write_partial_kvec(struct ceph_connection *con) { 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 */ @@ -377,6 +378,7 @@ static void prepare_write_message(struct ceph_connection *con) 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; diff --git a/src/kernel/messenger.h b/src/kernel/messenger.h index 8715544daa883..f47c70344829d 100644 --- a/src/kernel/messenger.h +++ b/src/kernel/messenger.h @@ -245,7 +245,7 @@ static __inline__ int ceph_encode_16(void **p, void *end, __u16 v) { } static __inline__ int ceph_encode_8(void **p, void *end, __u8 v) { - BUG_ON(*p < end); + BUG_ON(*p >= end); *(__u8*)*p = v; (*p)++; return 0; diff --git a/src/messages/MClientReconnect.h b/src/messages/MClientReconnect.h index 32f9612a8714b..66efb64a6e2c2 100644 --- a/src/messages/MClientReconnect.h +++ b/src/messages/MClientReconnect.h @@ -43,6 +43,7 @@ public: void encode_payload() { __u32 n = inode_caps.size(); + ::_encode_simple(closed, payload); ::_encode_simple(n, payload); for (map::iterator p = inode_caps.begin(); p != inode_caps.end(); @@ -51,10 +52,10 @@ public: ::_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--) { @@ -63,7 +64,6 @@ public: ::_decode_simple(inode_caps[ino], p); ::_decode_simple(inode_path[ino], p); } - ::_decode_simple(closed, p); } }; -- 2.39.5