Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35b62808 authored by Alex Elder's avatar Alex Elder Committed by Sage Weil
Browse files

libceph: define and use ceph_crc32c_page()

Factor out a common block of code that updates a CRC calculation
over a range of data in a page.

This and the preceding patches are related to:
    http://tracker.ceph.com/issues/4403



Signed-off-by: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
parent afb3d90e
Loading
Loading
Loading
Loading
+20 −27
Original line number Diff line number Diff line
@@ -1085,6 +1085,19 @@ static void in_msg_pos_next(struct ceph_connection *con, size_t len,
#endif /* CONFIG_BLOCK */
}

static u32 ceph_crc32c_page(u32 crc, struct page *page,
				unsigned int page_offset,
				unsigned int length)
{
	char *kaddr;

	kaddr = kmap(page);
	BUG_ON(kaddr == NULL);
	crc = crc32c(crc, kaddr + page_offset, length);
	kunmap(page);

	return crc;
}
/*
 * Write as much message data payload as we can.  If we finish, queue
 * up the footer.
@@ -1153,15 +1166,9 @@ static int write_partial_message_data(struct ceph_connection *con)

		page_offset = msg_pos->page_pos + bio_offset;
		if (do_datacrc && !msg_pos->did_page_crc) {
			void *base;
			u32 crc = le32_to_cpu(msg->footer.data_crc);
			char *kaddr;

			kaddr = kmap(page);
			BUG_ON(kaddr == NULL);
			base = kaddr + page_offset;
			crc = crc32c(crc, base, length);
			kunmap(page);
			crc = ceph_crc32c_page(crc, page, page_offset, length);
			msg->footer.data_crc = cpu_to_le32(crc);
			msg_pos->did_page_crc = true;
		}
@@ -1843,16 +1850,9 @@ static int read_partial_message_pages(struct ceph_connection *con,
	if (ret <= 0)
		return ret;

	if (do_datacrc) {
		void *kaddr;
		void *base;

		kaddr = kmap(page);
		BUG_ON(!kaddr);
		base = kaddr + page_offset;
		con->in_data_crc = crc32c(con->in_data_crc, base, ret);
		kunmap(page);
	}
	if (do_datacrc)
		con->in_data_crc = ceph_crc32c_page(con->in_data_crc, page,
							page_offset, ret);

	in_msg_pos_next(con, length, ret);

@@ -1886,16 +1886,9 @@ static int read_partial_message_bio(struct ceph_connection *con,
	if (ret <= 0)
		return ret;

	if (do_datacrc) {
		void *kaddr;
		void *base;

		kaddr = kmap(page);
		BUG_ON(!kaddr);
		base = kaddr + page_offset;
		con->in_data_crc = crc32c(con->in_data_crc, base, ret);
		kunmap(page);
	}
	if (do_datacrc)
		con->in_data_crc = ceph_crc32c_page(con->in_data_crc, page,
							page_offset, ret);

	in_msg_pos_next(con, length, ret);