libceph: define and use ceph_crc32c_page()
authorAlex Elder <elder@inktank.com>
Sat, 9 Mar 2013 02:59:00 +0000 (20:59 -0600)
committerSage Weil <sage@inktank.com>
Thu, 2 May 2013 04:16:52 +0000 (21:16 -0700)
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: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
net/ceph/messenger.c

index 3120a6c81a76c6ec37f15421814d390dcb60cf9e..f70bc92348d94f31d0aa4499c364e99e09b47165 100644 (file)
@@ -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);