target/iscsi: Use proper SGL accessors for digest computation
authorAlexei Potashnik <alexei@purestorage.com>
Tue, 21 Jul 2015 00:12:12 +0000 (17:12 -0700)
committerSasha Levin <alexander.levin@verizon.com>
Thu, 8 Jun 2017 10:42:00 +0000 (06:42 -0400)
[ Upstream commit aa75679c797c0250a853e600e45368f1f9545c27 ]

Current implementation assumes that all the buffers of an IO are linked
with a single SG list, which is OK because target-core is only allocating
a contigious scatterlist region.  However, this assumption is wrong for
se_cmd descriptors that want to use chaining across multiple SGL regions.

Fix this up by using proper SGL accessors for digest payload computation.

Signed-off-by: Alexei Potashnik <alexei@purestorage.com>
Cc: Roland Dreier <roland@purestorage.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
drivers/target/iscsi/iscsi_target.c

index dbd66d321b321c046497e0b8223029026024c88a..177d8574c188f0ca5bd1f46fe8746835861a7318 100644 (file)
@@ -1205,7 +1205,6 @@ static u32 iscsit_do_crypto_hash_sg(
        u8 *pad_bytes)
 {
        u32 data_crc;
-       u32 i;
        struct scatterlist *sg;
        unsigned int page_off;
 
@@ -1214,15 +1213,15 @@ static u32 iscsit_do_crypto_hash_sg(
        sg = cmd->first_data_sg;
        page_off = cmd->first_data_sg_off;
 
-       i = 0;
        while (data_length) {
-               u32 cur_len = min_t(u32, data_length, (sg[i].length - page_off));
+               u32 cur_len = min_t(u32, data_length, (sg->length - page_off));
 
-               crypto_hash_update(hash, &sg[i], cur_len);
+               crypto_hash_update(hash, sg, cur_len);
 
                data_length -= cur_len;
                page_off = 0;
-               i++;
+               /* iscsit_map_iovec has already checked for invalid sg pointers */
+               sg = sg_next(sg);
        }
 
        if (padding) {