aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/ceph/messenger.h4
-rw-r--r--net/ceph/messenger.c44
2 files changed, 5 insertions, 43 deletions
diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h
index b53b9ef65009..0e4536cc46f0 100644
--- a/include/linux/ceph/messenger.h
+++ b/include/linux/ceph/messenger.h
@@ -69,7 +69,6 @@ struct ceph_messenger {
69#ifdef CONFIG_BLOCK 69#ifdef CONFIG_BLOCK
70#define ceph_msg_has_bio(m) ((m)->b.type == CEPH_MSG_DATA_BIO) 70#define ceph_msg_has_bio(m) ((m)->b.type == CEPH_MSG_DATA_BIO)
71#endif /* CONFIG_BLOCK */ 71#endif /* CONFIG_BLOCK */
72#define ceph_msg_has_trail(m) ((m)->t.type == CEPH_MSG_DATA_PAGELIST)
73 72
74enum ceph_msg_data_type { 73enum ceph_msg_data_type {
75 CEPH_MSG_DATA_NONE, /* message contains no data payload */ 74 CEPH_MSG_DATA_NONE, /* message contains no data payload */
@@ -155,7 +154,6 @@ struct ceph_msg {
155#ifdef CONFIG_BLOCK 154#ifdef CONFIG_BLOCK
156 struct ceph_msg_data b; /* bio */ 155 struct ceph_msg_data b; /* bio */
157#endif /* CONFIG_BLOCK */ 156#endif /* CONFIG_BLOCK */
158 struct ceph_msg_data t; /* trail */
159 157
160 struct ceph_connection *con; 158 struct ceph_connection *con;
161 struct list_head list_head; /* links for connection lists */ 159 struct list_head list_head; /* links for connection lists */
@@ -295,8 +293,6 @@ extern void ceph_msg_data_set_pages(struct ceph_msg *msg, struct page **pages,
295extern void ceph_msg_data_set_pagelist(struct ceph_msg *msg, 293extern void ceph_msg_data_set_pagelist(struct ceph_msg *msg,
296 struct ceph_pagelist *pagelist); 294 struct ceph_pagelist *pagelist);
297extern void ceph_msg_data_set_bio(struct ceph_msg *msg, struct bio *bio); 295extern void ceph_msg_data_set_bio(struct ceph_msg *msg, struct bio *bio);
298extern void ceph_msg_data_set_trail(struct ceph_msg *msg,
299 struct ceph_pagelist *trail);
300 296
301extern struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags, 297extern struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags,
302 bool can_fail); 298 bool can_fail);
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index d611156808b3..ff58d3182754 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -1115,8 +1115,6 @@ static void prepare_message_data(struct ceph_msg *msg,
1115 ceph_msg_data_cursor_init(&msg->p); 1115 ceph_msg_data_cursor_init(&msg->p);
1116 if (ceph_msg_has_pagelist(msg)) 1116 if (ceph_msg_has_pagelist(msg))
1117 ceph_msg_data_cursor_init(&msg->l); 1117 ceph_msg_data_cursor_init(&msg->l);
1118 if (ceph_msg_has_trail(msg))
1119 ceph_msg_data_cursor_init(&msg->t);
1120 1118
1121 msg_pos->did_page_crc = false; 1119 msg_pos->did_page_crc = false;
1122} 1120}
@@ -1398,7 +1396,7 @@ out:
1398} 1396}
1399 1397
1400static void out_msg_pos_next(struct ceph_connection *con, struct page *page, 1398static void out_msg_pos_next(struct ceph_connection *con, struct page *page,
1401 size_t len, size_t sent, bool in_trail) 1399 size_t len, size_t sent)
1402{ 1400{
1403 struct ceph_msg *msg = con->out_msg; 1401 struct ceph_msg *msg = con->out_msg;
1404 struct ceph_msg_pos *msg_pos = &con->out_msg_pos; 1402 struct ceph_msg_pos *msg_pos = &con->out_msg_pos;
@@ -1409,9 +1407,7 @@ static void out_msg_pos_next(struct ceph_connection *con, struct page *page,
1409 1407
1410 msg_pos->data_pos += sent; 1408 msg_pos->data_pos += sent;
1411 msg_pos->page_pos += sent; 1409 msg_pos->page_pos += sent;
1412 if (in_trail) 1410 if (ceph_msg_has_pages(msg))
1413 need_crc = ceph_msg_data_advance(&msg->t, sent);
1414 else if (ceph_msg_has_pages(msg))
1415 need_crc = ceph_msg_data_advance(&msg->p, sent); 1411 need_crc = ceph_msg_data_advance(&msg->p, sent);
1416 else if (ceph_msg_has_pagelist(msg)) 1412 else if (ceph_msg_has_pagelist(msg))
1417 need_crc = ceph_msg_data_advance(&msg->l, sent); 1413 need_crc = ceph_msg_data_advance(&msg->l, sent);
@@ -1481,14 +1477,6 @@ static int write_partial_message_data(struct ceph_connection *con)
1481 bool do_datacrc = !con->msgr->nocrc; 1477 bool do_datacrc = !con->msgr->nocrc;
1482 int ret; 1478 int ret;
1483 int total_max_write; 1479 int total_max_write;
1484 bool in_trail = false;
1485 size_t trail_len = 0;
1486 size_t trail_off = data_len;
1487
1488 if (ceph_msg_has_trail(msg)) {
1489 trail_len = msg->t.pagelist->length;
1490 trail_off -= trail_len;
1491 }
1492 1480
1493 dout("%s %p msg %p page %d offset %d\n", __func__, 1481 dout("%s %p msg %p page %d offset %d\n", __func__,
1494 con, msg, msg_pos->page, msg_pos->page_pos); 1482 con, msg, msg_pos->page, msg_pos->page_pos);
@@ -1508,16 +1496,9 @@ static int write_partial_message_data(struct ceph_connection *con)
1508 bool use_cursor = false; 1496 bool use_cursor = false;
1509 bool last_piece = true; /* preserve existing behavior */ 1497 bool last_piece = true; /* preserve existing behavior */
1510 1498
1511 in_trail = in_trail || msg_pos->data_pos >= trail_off; 1499 total_max_write = data_len - msg_pos->data_pos;
1512 if (!in_trail)
1513 total_max_write = trail_off - msg_pos->data_pos;
1514 1500
1515 if (in_trail) { 1501 if (ceph_msg_has_pages(msg)) {
1516 BUG_ON(!ceph_msg_has_trail(msg));
1517 use_cursor = true;
1518 page = ceph_msg_data_next(&msg->t, &page_offset,
1519 &length, &last_piece);
1520 } else if (ceph_msg_has_pages(msg)) {
1521 use_cursor = true; 1502 use_cursor = true;
1522 page = ceph_msg_data_next(&msg->p, &page_offset, 1503 page = ceph_msg_data_next(&msg->p, &page_offset,
1523 &length, &last_piece); 1504 &length, &last_piece);
@@ -1552,7 +1533,7 @@ static int write_partial_message_data(struct ceph_connection *con)
1552 if (ret <= 0) 1533 if (ret <= 0)
1553 goto out; 1534 goto out;
1554 1535
1555 out_msg_pos_next(con, page, length, (size_t) ret, in_trail); 1536 out_msg_pos_next(con, page, length, (size_t) ret);
1556 } 1537 }
1557 1538
1558 dout("%s %p msg %p done\n", __func__, con, msg); 1539 dout("%s %p msg %p done\n", __func__, con, msg);
@@ -3145,17 +3126,6 @@ void ceph_msg_data_set_bio(struct ceph_msg *msg, struct bio *bio)
3145} 3126}
3146EXPORT_SYMBOL(ceph_msg_data_set_bio); 3127EXPORT_SYMBOL(ceph_msg_data_set_bio);
3147 3128
3148void ceph_msg_data_set_trail(struct ceph_msg *msg, struct ceph_pagelist *trail)
3149{
3150 BUG_ON(!trail);
3151 BUG_ON(!trail->length);
3152 BUG_ON(msg->b.type != CEPH_MSG_DATA_NONE);
3153
3154 msg->t.type = CEPH_MSG_DATA_PAGELIST;
3155 msg->t.pagelist = trail;
3156}
3157EXPORT_SYMBOL(ceph_msg_data_set_trail);
3158
3159/* 3129/*
3160 * construct a new message with given type, size 3130 * construct a new message with given type, size
3161 * the new msg has a ref count of 1. 3131 * the new msg has a ref count of 1.
@@ -3179,7 +3149,6 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags,
3179 ceph_msg_data_init(&m->p); 3149 ceph_msg_data_init(&m->p);
3180 ceph_msg_data_init(&m->l); 3150 ceph_msg_data_init(&m->l);
3181 ceph_msg_data_init(&m->b); 3151 ceph_msg_data_init(&m->b);
3182 ceph_msg_data_init(&m->t);
3183 3152
3184 /* front */ 3153 /* front */
3185 m->front_max = front_len; 3154 m->front_max = front_len;
@@ -3345,9 +3314,6 @@ void ceph_msg_last_put(struct kref *kref)
3345 m->l.pagelist = NULL; 3314 m->l.pagelist = NULL;
3346 } 3315 }
3347 3316
3348 if (ceph_msg_has_trail(m))
3349 m->t.pagelist = NULL;
3350
3351 if (m->pool) 3317 if (m->pool)
3352 ceph_msgpool_put(m->pool, m); 3318 ceph_msgpool_put(m->pool, m);
3353 else 3319 else