Whamcloud - gitweb
LU-15615 target: Free t10pi crypto state on error 39/50539/3
authorOleg Drokin <green@whamcloud.com>
Fri, 4 Mar 2022 22:10:25 +0000 (17:10 -0500)
committerOleg Drokin <green@whamcloud.com>
Mon, 1 May 2023 04:10:56 +0000 (04:10 +0000)
Looks like when error happens we forgot to release crypto state that
not only leaks memory directly, but potentially can tie in-memory
pages too.

Change-Id: Ia0870ccbb194e4e9ca8701e1c01d519745c236df
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Li Dongyang <dongyangli@ddn.com>
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/50539
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Li Xi <lixi@ddn.com>
lustre/obdclass/integrity.c
lustre/target/tgt_handler.c

index 1ccec8a..81b9d11 100644 (file)
@@ -45,38 +45,40 @@ __be16 obd_dif_ip_fn(void *data, unsigned int len)
 EXPORT_SYMBOL(obd_dif_ip_fn);
 
 int obd_page_dif_generate_buffer(const char *obd_name, struct page *page,
-                                __u32 offset, __u32 length,
+                                __u32 start, __u32 length,
                                 __be16 *guard_start, int guard_number,
                                 int *used_number, int sector_size,
                                 obd_dif_csum_fn *fn)
 {
-       unsigned int i = offset;
-       unsigned int end = offset + length;
+       unsigned int off = start;
+       unsigned int end = start + length;
        char *data_buf;
        __be16 *guard_buf = guard_start;
        unsigned int data_size;
-       int used = 0;
+       int guard_used = 0;
+       int rc = 0;
 
-       data_buf = kmap(page) + offset;
-       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",
-                              obd_name, used, guard_number, length,
-                              sector_size, -E2BIG);
-                       return -E2BIG;
+       data_buf = kmap(page) + start;
+       while (off < end) {
+               if (guard_used >= guard_number) {
+                       rc = -E2BIG;
+                       CERROR("%s: used %u >= guard %u, data %u+%u, sector_size %u: rc = %d\n",
+                              obd_name, guard_used, guard_number, start,
+                              length, sector_size, rc);
+                       goto out;
                }
-               data_size = min(round_up(i + 1, sector_size), end) - i;
+               data_size = min(round_up(off + 1, sector_size), end) - off;
                *guard_buf = fn(data_buf, data_size);
                guard_buf++;
+               guard_used++;
                data_buf += data_size;
-               i += data_size;
-               used++;
+               off += data_size;
        }
+       *used_number = guard_used;
+out:
        kunmap(page);
-       *used_number = used;
 
-       return 0;
+       return rc;
 }
 EXPORT_SYMBOL(obd_page_dif_generate_buffer);
 
index 012cc78..c1d08ba 100644 (file)
@@ -2071,14 +2071,14 @@ static int tgt_checksum_niobuf_t10pi(struct lu_target *tgt,
        unsigned char cfs_alg = cksum_obd2cfs(OBD_CKSUM_T10_TOP);
        const char *obd_name = tgt->lut_obd->obd_name;
        struct ahash_request *req;
-       unsigned int bufsize;
        unsigned char *buffer;
        struct page *__page;
        __be16 *guard_start;
        int guard_number;
        int used_number = 0;
        __u32 cksum;
-       int rc = 0;
+       unsigned int bufsize = sizeof(cksum);
+       int rc = 0, rc2;
        int used;
        int i;
 
@@ -2143,6 +2143,11 @@ static int tgt_checksum_niobuf_t10pi(struct lu_target *tgt,
                        used = DIV_ROUND_UP(local_nb[i].lnb_len, sector_size);
                        if (used > (guard_number - used_number)) {
                                rc = -E2BIG;
+                               CDEBUG(D_PAGE | D_HA,
+                                      "%s: used %u, guard %u/%u, data size %u+%u, sector_size %u: rc = %d\n",
+                                      obd_name, used, guard_number,
+                                      used_number, local_nb[i].lnb_page_offset,
+                                      local_nb[i].lnb_len, sector_size, rc);
                                break;
                        }
                        memcpy(guard_start + used_number,
@@ -2255,15 +2260,15 @@ static int tgt_checksum_niobuf_t10pi(struct lu_target *tgt,
        }
        kunmap(__page);
        if (rc)
-               GOTO(out, rc);
+               GOTO(out_hash, rc);
 
        if (used_number != 0)
                cfs_crypto_hash_update_page(req, __page, 0,
-                       used_number * sizeof(*guard_start));
-
-       bufsize = sizeof(cksum);
-       rc = cfs_crypto_hash_final(req, (unsigned char *)&cksum, &bufsize);
-
+                                           used_number * sizeof(*guard_start));
+out_hash:
+       rc2 = cfs_crypto_hash_final(req, (unsigned char *)&cksum, &bufsize);
+       if (!rc)
+               rc = rc2;
        if (rc == 0)
                *check_sum = cksum;
 out: