Commit 98fa5dd8 authored by Alex Elder's avatar Alex Elder Committed by Sage Weil

libceph: provide data length when preparing message

In prepare_message_data(), the length used to initialize the cursor
is taken from the header of the message provided.  I'm working
toward not using the header data length field to determine length in
outbound messages, and this is a step in that direction.  For
inbound messages this will be set to be the actual number of bytes
that are arriving (which may be less than the total size of the data
buffer available).

This resolves:
    http://tracker.ceph.com/issues/4589Signed-off-by: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
parent e5975c7c
...@@ -1076,18 +1076,14 @@ static bool ceph_msg_data_advance(struct ceph_msg_data *data, size_t bytes) ...@@ -1076,18 +1076,14 @@ static bool ceph_msg_data_advance(struct ceph_msg_data *data, size_t bytes)
return new_piece; return new_piece;
} }
static void prepare_message_data(struct ceph_msg *msg) static void prepare_message_data(struct ceph_msg *msg, u32 data_len)
{ {
size_t data_len;
BUG_ON(!msg); BUG_ON(!msg);
data_len = le32_to_cpu(msg->hdr.data_len);
BUG_ON(!data_len); BUG_ON(!data_len);
/* Initialize data cursor */ /* Initialize data cursor */
ceph_msg_data_cursor_init(msg->data, data_len); ceph_msg_data_cursor_init(msg->data, (size_t)data_len);
} }
/* /*
...@@ -1150,11 +1146,12 @@ static void prepare_write_message(struct ceph_connection *con) ...@@ -1150,11 +1146,12 @@ static void prepare_write_message(struct ceph_connection *con)
m->hdr.seq = cpu_to_le64(++con->out_seq); m->hdr.seq = cpu_to_le64(++con->out_seq);
m->needs_out_seq = false; m->needs_out_seq = false;
} }
WARN_ON(m->data_length != le32_to_cpu(m->hdr.data_len));
dout("prepare_write_message %p seq %lld type %d len %d+%d+%d\n", dout("prepare_write_message %p seq %lld type %d len %d+%d+%zd\n",
m, con->out_seq, le16_to_cpu(m->hdr.type), m, con->out_seq, le16_to_cpu(m->hdr.type),
le32_to_cpu(m->hdr.front_len), le32_to_cpu(m->hdr.middle_len), le32_to_cpu(m->hdr.front_len), le32_to_cpu(m->hdr.middle_len),
le32_to_cpu(m->hdr.data_len)); m->data_length);
BUG_ON(le32_to_cpu(m->hdr.front_len) != m->front.iov_len); BUG_ON(le32_to_cpu(m->hdr.front_len) != m->front.iov_len);
/* tag + hdr + front + middle */ /* tag + hdr + front + middle */
...@@ -1185,8 +1182,8 @@ static void prepare_write_message(struct ceph_connection *con) ...@@ -1185,8 +1182,8 @@ static void prepare_write_message(struct ceph_connection *con)
/* is there a data payload? */ /* is there a data payload? */
con->out_msg->footer.data_crc = 0; con->out_msg->footer.data_crc = 0;
if (m->hdr.data_len) { if (m->data_length) {
prepare_message_data(con->out_msg); prepare_message_data(con->out_msg, m->data_length);
con->out_more = 1; /* data + footer will follow */ con->out_more = 1; /* data + footer will follow */
} else { } else {
/* no, queue up footer too and be done */ /* no, queue up footer too and be done */
...@@ -2231,7 +2228,7 @@ static int read_partial_message(struct ceph_connection *con) ...@@ -2231,7 +2228,7 @@ static int read_partial_message(struct ceph_connection *con)
/* prepare for data payload, if any */ /* prepare for data payload, if any */
if (data_len) if (data_len)
prepare_message_data(con->in_msg); prepare_message_data(con->in_msg, data_len);
} }
/* front */ /* front */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment