aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-04-02 13:09:50 -0400
committerSage Weil <sage@inktank.com>2013-05-02 00:18:03 -0400
commit98fa5dd883aadbb0020b68d0f9367ba152dfe511 (patch)
tree982654be5c409de9dd5a48521985e6533b8da4b4 /net
parente5975c7c8eb6aeab8d2f76a98c368081082795e0 (diff)
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/4589 Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/messenger.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index fa9b4d0243a0..a6fda9532102 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -1076,18 +1076,14 @@ static bool ceph_msg_data_advance(struct ceph_msg_data *data, size_t bytes)
1076 return new_piece; 1076 return new_piece;
1077} 1077}
1078 1078
1079static void prepare_message_data(struct ceph_msg *msg) 1079static void prepare_message_data(struct ceph_msg *msg, u32 data_len)
1080{ 1080{
1081 size_t data_len;
1082
1083 BUG_ON(!msg); 1081 BUG_ON(!msg);
1084
1085 data_len = le32_to_cpu(msg->hdr.data_len);
1086 BUG_ON(!data_len); 1082 BUG_ON(!data_len);
1087 1083
1088 /* Initialize data cursor */ 1084 /* Initialize data cursor */
1089 1085
1090 ceph_msg_data_cursor_init(msg->data, data_len); 1086 ceph_msg_data_cursor_init(msg->data, (size_t)data_len);
1091} 1087}
1092 1088
1093/* 1089/*
@@ -1150,11 +1146,12 @@ static void prepare_write_message(struct ceph_connection *con)
1150 m->hdr.seq = cpu_to_le64(++con->out_seq); 1146 m->hdr.seq = cpu_to_le64(++con->out_seq);
1151 m->needs_out_seq = false; 1147 m->needs_out_seq = false;
1152 } 1148 }
1149 WARN_ON(m->data_length != le32_to_cpu(m->hdr.data_len));
1153 1150
1154 dout("prepare_write_message %p seq %lld type %d len %d+%d+%d\n", 1151 dout("prepare_write_message %p seq %lld type %d len %d+%d+%zd\n",
1155 m, con->out_seq, le16_to_cpu(m->hdr.type), 1152 m, con->out_seq, le16_to_cpu(m->hdr.type),
1156 le32_to_cpu(m->hdr.front_len), le32_to_cpu(m->hdr.middle_len), 1153 le32_to_cpu(m->hdr.front_len), le32_to_cpu(m->hdr.middle_len),
1157 le32_to_cpu(m->hdr.data_len)); 1154 m->data_length);
1158 BUG_ON(le32_to_cpu(m->hdr.front_len) != m->front.iov_len); 1155 BUG_ON(le32_to_cpu(m->hdr.front_len) != m->front.iov_len);
1159 1156
1160 /* tag + hdr + front + middle */ 1157 /* tag + hdr + front + middle */
@@ -1185,8 +1182,8 @@ static void prepare_write_message(struct ceph_connection *con)
1185 1182
1186 /* is there a data payload? */ 1183 /* is there a data payload? */
1187 con->out_msg->footer.data_crc = 0; 1184 con->out_msg->footer.data_crc = 0;
1188 if (m->hdr.data_len) { 1185 if (m->data_length) {
1189 prepare_message_data(con->out_msg); 1186 prepare_message_data(con->out_msg, m->data_length);
1190 con->out_more = 1; /* data + footer will follow */ 1187 con->out_more = 1; /* data + footer will follow */
1191 } else { 1188 } else {
1192 /* no, queue up footer too and be done */ 1189 /* no, queue up footer too and be done */
@@ -2231,7 +2228,7 @@ static int read_partial_message(struct ceph_connection *con)
2231 /* prepare for data payload, if any */ 2228 /* prepare for data payload, if any */
2232 2229
2233 if (data_len) 2230 if (data_len)
2234 prepare_message_data(con->in_msg); 2231 prepare_message_data(con->in_msg, data_len);
2235 } 2232 }
2236 2233
2237 /* front */ 2234 /* front */