target/iscsi: Use proper SGL accessors for digest computation
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>
This commit is contained in:
parent
b6a54b8d89
commit
aa75679c79
|
@ -1209,7 +1209,6 @@ static u32 iscsit_do_crypto_hash_sg(
|
||||||
u8 *pad_bytes)
|
u8 *pad_bytes)
|
||||||
{
|
{
|
||||||
u32 data_crc;
|
u32 data_crc;
|
||||||
u32 i;
|
|
||||||
struct scatterlist *sg;
|
struct scatterlist *sg;
|
||||||
unsigned int page_off;
|
unsigned int page_off;
|
||||||
|
|
||||||
|
@ -1218,15 +1217,15 @@ static u32 iscsit_do_crypto_hash_sg(
|
||||||
sg = cmd->first_data_sg;
|
sg = cmd->first_data_sg;
|
||||||
page_off = cmd->first_data_sg_off;
|
page_off = cmd->first_data_sg_off;
|
||||||
|
|
||||||
i = 0;
|
|
||||||
while (data_length) {
|
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;
|
data_length -= cur_len;
|
||||||
page_off = 0;
|
page_off = 0;
|
||||||
i++;
|
/* iscsit_map_iovec has already checked for invalid sg pointers */
|
||||||
|
sg = sg_next(sg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (padding) {
|
if (padding) {
|
||||||
|
|
Loading…
Reference in New Issue