aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ceph/messenger.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c
index e7b91e093f5..509f57d9ccb 100644
--- a/fs/ceph/messenger.c
+++ b/fs/ceph/messenger.c
@@ -1334,6 +1334,7 @@ static int read_partial_message(struct ceph_connection *con)
1334 unsigned front_len, middle_len, data_len, data_off; 1334 unsigned front_len, middle_len, data_len, data_off;
1335 int datacrc = con->msgr->nocrc; 1335 int datacrc = con->msgr->nocrc;
1336 int skip; 1336 int skip;
1337 u64 seq;
1337 1338
1338 dout("read_partial_message con %p msg %p\n", con, m); 1339 dout("read_partial_message con %p msg %p\n", con, m);
1339 1340
@@ -1368,6 +1369,25 @@ static int read_partial_message(struct ceph_connection *con)
1368 return -EIO; 1369 return -EIO;
1369 data_off = le16_to_cpu(con->in_hdr.data_off); 1370 data_off = le16_to_cpu(con->in_hdr.data_off);
1370 1371
1372 /* verify seq# */
1373 seq = le64_to_cpu(con->in_hdr.seq);
1374 if ((s64)seq - (s64)con->in_seq < 1) {
1375 pr_info("skipping %s%lld %s seq %lld, expected %lld\n",
1376 ENTITY_NAME(con->peer_name),
1377 pr_addr(&con->peer_addr.in_addr),
1378 seq, con->in_seq + 1);
1379 con->in_base_pos = -front_len - middle_len - data_len -
1380 sizeof(m->footer);
1381 con->in_tag = CEPH_MSGR_TAG_READY;
1382 con->in_seq++;
1383 return 0;
1384 } else if ((s64)seq - (s64)con->in_seq > 1) {
1385 pr_err("read_partial_message bad seq %lld expected %lld\n",
1386 seq, con->in_seq + 1);
1387 con->error_msg = "bad message sequence # for incoming message";
1388 return -EBADMSG;
1389 }
1390
1371 /* allocate message? */ 1391 /* allocate message? */
1372 if (!con->in_msg) { 1392 if (!con->in_msg) {
1373 dout("got hdr type %d front %d data %d\n", con->in_hdr.type, 1393 dout("got hdr type %d front %d data %d\n", con->in_hdr.type,