From: Oleg Drokin Date: Fri, 4 Mar 2022 22:10:25 +0000 (-0500) Subject: LU-15615 target: Free t10pi crypto state on error X-Git-Tag: 2.15.56~110 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=6a88222bd6a1c0f5bd45fb40b88af226db8bd29a;p=fs%2Flustre-release.git LU-15615 target: Free t10pi crypto state on error 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 Reviewed-by: Andreas Dilger Reviewed-by: Li Dongyang Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/50539 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Li Xi --- diff --git a/lustre/obdclass/integrity.c b/lustre/obdclass/integrity.c index 1ccec8a..81b9d11 100644 --- a/lustre/obdclass/integrity.c +++ b/lustre/obdclass/integrity.c @@ -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); diff --git a/lustre/target/tgt_handler.c b/lustre/target/tgt_handler.c index 012cc78..c1d08ba 100644 --- a/lustre/target/tgt_handler.c +++ b/lustre/target/tgt_handler.c @@ -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: