Whamcloud - gitweb
LU-11729 obdclass: align to T10 sector size when generating guard
[fs/lustre-release.git] / lustre / obdclass / integrity.c
index a48e5e9..1d15cd5 100644 (file)
@@ -31,6 +31,7 @@
 #include <obd_class.h>
 #include <obd_cksum.h>
 
+#if IS_ENABLED(CONFIG_CRC_T10DIF)
 __u16 obd_dif_crc_fn(void *data, unsigned int len)
 {
        return cpu_to_be16(crc_t10dif(data, len));
@@ -49,14 +50,15 @@ int obd_page_dif_generate_buffer(const char *obd_name, struct page *page,
                                 int *used_number, int sector_size,
                                 obd_dif_csum_fn *fn)
 {
-       unsigned int i;
+       unsigned int i = offset;
+       unsigned int end = offset + length;
        char *data_buf;
        __u16 *guard_buf = guard_start;
        unsigned int data_size;
        int used = 0;
 
        data_buf = kmap(page) + offset;
-       for (i = 0; i < length; i += sector_size) {
+       while (i < end) {
                if (used >= guard_number) {
                        CERROR("%s: unexpected used guard number of DIF %u/%u, "
                               "data length %u, sector size %u: rc = %d\n",
@@ -64,12 +66,11 @@ int obd_page_dif_generate_buffer(const char *obd_name, struct page *page,
                               sector_size, -E2BIG);
                        return -E2BIG;
                }
-               data_size = length - i;
-               if (data_size > sector_size)
-                       data_size = sector_size;
+               data_size = min(round_up(i + 1, sector_size), end) - i;
                *guard_buf = fn(data_buf, data_size);
                guard_buf++;
                data_buf += data_size;
+               i += data_size;
                used++;
        }
        kunmap(page);
@@ -85,7 +86,7 @@ static int __obd_t10_performance_test(const char *obd_name,
                                      int repeat_number)
 {
        unsigned char cfs_alg = cksum_obd2cfs(OBD_CKSUM_T10_TOP);
-       struct cfs_crypto_hash_desc *hdesc;
+       struct ahash_request *req;
        obd_dif_csum_fn *fn = NULL;
        unsigned int bufsize;
        unsigned char *buffer;
@@ -108,9 +109,9 @@ static int __obd_t10_performance_test(const char *obd_name,
        if (__page == NULL)
                return -ENOMEM;
 
-       hdesc = cfs_crypto_hash_init(cfs_alg, NULL, 0);
-       if (IS_ERR(hdesc)) {
-               rc = PTR_ERR(hdesc);
+       req = cfs_crypto_hash_init(cfs_alg, NULL, 0);
+       if (IS_ERR(req)) {
+               rc = PTR_ERR(req);
                CERROR("%s: unable to initialize checksum hash %s: rc = %d\n",
                       obd_name, cfs_crypto_hash_name(cfs_alg), rc);
                GOTO(out, rc);
@@ -134,7 +135,7 @@ static int __obd_t10_performance_test(const char *obd_name,
 
                used_number += used;
                if (used_number == guard_number) {
-                       cfs_crypto_hash_update_page(hdesc, __page, 0,
+                       cfs_crypto_hash_update_page(req, __page, 0,
                                used_number * sizeof(*guard_start));
                        used_number = 0;
                }
@@ -144,12 +145,12 @@ static int __obd_t10_performance_test(const char *obd_name,
                GOTO(out_final, rc);
 
        if (used_number != 0)
-               cfs_crypto_hash_update_page(hdesc, __page, 0,
+               cfs_crypto_hash_update_page(req, __page, 0,
                        used_number * sizeof(*guard_start));
 
        bufsize = sizeof(cksum);
 out_final:
-       rc2 = cfs_crypto_hash_final(hdesc, (unsigned char *)&cksum, &bufsize);
+       rc2 = cfs_crypto_hash_final(req, (unsigned char *)&cksum, &bufsize);
        rc = rc ? rc : rc2;
 out:
        __free_page(__page);
@@ -226,7 +227,7 @@ static void obd_t10_performance_test(const char *obd_name,
        memset(buf, 0xAD, PAGE_SIZE);
        kunmap(page);
 
-       for (start = jiffies, end = start + msecs_to_jiffies(MSEC_PER_SEC / 4),
+       for (start = jiffies, end = start + cfs_time_seconds(1) / 4,
             bcount = 0; time_before(jiffies, end) && rc == 0; bcount++) {
                rc = __obd_t10_performance_test(obd_name, cksum_type, page,
                                                buf_len / PAGE_SIZE);
@@ -251,10 +252,12 @@ out:
                       obd_t10_cksum_speeds[index]);
        }
 }
+#endif /* CONFIG_CRC_T10DIF */
 
 int obd_t10_cksum_speed(const char *obd_name,
                        enum cksum_types cksum_type)
 {
+#if IS_ENABLED(CONFIG_CRC_T10DIF)
        enum obd_t10_cksum_type index = obd_t10_cksum2type(cksum_type);
 
        if (unlikely(obd_t10_cksum_speeds[index] == 0)) {
@@ -267,5 +270,8 @@ int obd_t10_cksum_speed(const char *obd_name,
        }
 
        return obd_t10_cksum_speeds[index];
+#else /* !CONFIG_CRC_T10DIF */
+       return 0;
+#endif /* !CONFIG_CRC_T10DIF */
 }
 EXPORT_SYMBOL(obd_t10_cksum_speed);