aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorAlex Elder <elder@dreamhost.com>2012-02-15 08:43:54 -0500
committerAlex Elder <elder@dreamhost.com>2012-03-22 11:47:51 -0400
commita9a0c51af4e7c825c014b40694571456a75ebbc4 (patch)
tree6df7b2873d21f3c9c5e449aca1d8c16f4dd5fc1d /net
parentbca064d236a2e3162a07c758855221bcbe3c475b (diff)
libceph: separate CRC calculation from byte swapping
Calculate CRC in a separate step from rearranging the byte order of the result, to improve clarity and readability. Use offsetof() to determine the number of bytes to include in the CRC calculation. In read_partial_message(), switch which value gets byte-swapped, since the just-computed CRC is already likely to be in a register. Signed-off-by: Alex Elder <elder@dreamhost.com> Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/messenger.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index 204e229e6628..7ec6a228b667 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -521,6 +521,7 @@ static void prepare_write_message_footer(struct ceph_connection *con)
521static void prepare_write_message(struct ceph_connection *con) 521static void prepare_write_message(struct ceph_connection *con)
522{ 522{
523 struct ceph_msg *m; 523 struct ceph_msg *m;
524 u32 crc;
524 525
525 ceph_con_out_kvec_reset(con); 526 ceph_con_out_kvec_reset(con);
526 con->out_kvec_is_msg = true; 527 con->out_kvec_is_msg = true;
@@ -569,17 +570,17 @@ static void prepare_write_message(struct ceph_connection *con)
569 m->middle->vec.iov_base); 570 m->middle->vec.iov_base);
570 571
571 /* fill in crc (except data pages), footer */ 572 /* fill in crc (except data pages), footer */
572 con->out_msg->hdr.crc = 573 crc = crc32c(0, &m->hdr, offsetof(struct ceph_msg_header, crc));
573 cpu_to_le32(crc32c(0, &m->hdr, 574 con->out_msg->hdr.crc = cpu_to_le32(crc);
574 sizeof(m->hdr) - sizeof(m->hdr.crc)));
575 con->out_msg->footer.flags = CEPH_MSG_FOOTER_COMPLETE; 575 con->out_msg->footer.flags = CEPH_MSG_FOOTER_COMPLETE;
576 con->out_msg->footer.front_crc = 576
577 cpu_to_le32(crc32c(0, m->front.iov_base, m->front.iov_len)); 577 crc = crc32c(0, m->front.iov_base, m->front.iov_len);
578 if (m->middle) 578 con->out_msg->footer.front_crc = cpu_to_le32(crc);
579 con->out_msg->footer.middle_crc = 579 if (m->middle) {
580 cpu_to_le32(crc32c(0, m->middle->vec.iov_base, 580 crc = crc32c(0, m->middle->vec.iov_base,
581 m->middle->vec.iov_len)); 581 m->middle->vec.iov_len);
582 else 582 con->out_msg->footer.middle_crc = cpu_to_le32(crc);
583 } else
583 con->out_msg->footer.middle_crc = 0; 584 con->out_msg->footer.middle_crc = 0;
584 con->out_msg->footer.data_crc = 0; 585 con->out_msg->footer.data_crc = 0;
585 dout("prepare_write_message front_crc %u data_crc %u\n", 586 dout("prepare_write_message front_crc %u data_crc %u\n",
@@ -875,12 +876,13 @@ static int write_partial_msg_pages(struct ceph_connection *con)
875 total_max_write); 876 total_max_write);
876 877
877 if (do_crc && !con->out_msg_pos.did_page_crc) { 878 if (do_crc && !con->out_msg_pos.did_page_crc) {
879 u32 crc;
878 void *base = kaddr + con->out_msg_pos.page_pos; 880 void *base = kaddr + con->out_msg_pos.page_pos;
879 u32 tmpcrc = le32_to_cpu(con->out_msg->footer.data_crc); 881 u32 tmpcrc = le32_to_cpu(con->out_msg->footer.data_crc);
880 882
881 BUG_ON(kaddr == NULL); 883 BUG_ON(kaddr == NULL);
882 con->out_msg->footer.data_crc = 884 crc = crc32c(tmpcrc, base, len);
883 cpu_to_le32(crc32c(tmpcrc, base, len)); 885 con->out_msg->footer.data_crc = cpu_to_le32(crc);
884 con->out_msg_pos.did_page_crc = true; 886 con->out_msg_pos.did_page_crc = true;
885 } 887 }
886 ret = kernel_sendpage(con->sock, page, 888 ret = kernel_sendpage(con->sock, page,
@@ -1650,8 +1652,9 @@ static int read_partial_message(struct ceph_connection *con)
1650 con->in_base_pos += ret; 1652 con->in_base_pos += ret;
1651 if (con->in_base_pos == sizeof(con->in_hdr)) { 1653 if (con->in_base_pos == sizeof(con->in_hdr)) {
1652 u32 crc = crc32c(0, &con->in_hdr, 1654 u32 crc = crc32c(0, &con->in_hdr,
1653 sizeof(con->in_hdr) - sizeof(con->in_hdr.crc)); 1655 offsetof(struct ceph_msg_header, crc));
1654 if (crc != le32_to_cpu(con->in_hdr.crc)) { 1656
1657 if (cpu_to_le32(crc) != con->in_hdr.crc) {
1655 pr_err("read_partial_message bad hdr " 1658 pr_err("read_partial_message bad hdr "
1656 " crc %u != expected %u\n", 1659 " crc %u != expected %u\n",
1657 crc, con->in_hdr.crc); 1660 crc, con->in_hdr.crc);