diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2015-04-19 19:27:21 +0200 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-05-31 07:41:42 +0200 |
commit | 414e4627277e38e3a557c53c9def7fe9f1ec9b2c (patch) | |
tree | 3b4475d1a2c81f84e7d8a32895889e24b3077ab3 /drivers/target | |
parent | target/file: Remove fd_prot bounce buffer (diff) | |
download | linux-414e4627277e38e3a557c53c9def7fe9f1ec9b2c.tar.xz linux-414e4627277e38e3a557c53c9def7fe9f1ec9b2c.zip |
target/sbc: Fix sbc_dif_verify inconsistent map/unmap
Fix map/unmap consistency and get rid of a redundant
local variable psg.
Reported-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r-- | drivers/target/target_core_sbc.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index ca95fab3521a..3df2cd538478 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c @@ -1312,30 +1312,30 @@ EXPORT_SYMBOL(sbc_dif_copy_prot); sense_reason_t sbc_dif_verify(struct se_cmd *cmd, sector_t start, unsigned int sectors, - unsigned int ei_lba, struct scatterlist *sg, int sg_off) + unsigned int ei_lba, struct scatterlist *psg, int psg_off) { struct se_device *dev = cmd->se_dev; struct se_dif_v1_tuple *sdt; - struct scatterlist *dsg, *psg = sg; + struct scatterlist *dsg; sector_t sector = start; void *daddr, *paddr; - int i, j, offset = sg_off; + int i, j; sense_reason_t rc; for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) { daddr = kmap_atomic(sg_page(dsg)) + dsg->offset; - paddr = kmap_atomic(sg_page(psg)) + sg->offset; + paddr = kmap_atomic(sg_page(psg)) + psg->offset; for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) { - if (offset >= psg->length) { - kunmap_atomic(paddr); + if (psg_off >= psg->length) { + kunmap_atomic(paddr - psg->offset); psg = sg_next(psg); paddr = kmap_atomic(sg_page(psg)) + psg->offset; - offset = 0; + psg_off = 0; } - sdt = paddr + offset; + sdt = paddr + psg_off; pr_debug("DIF READ sector: %llu guard_tag: 0x%04x" " app_tag: 0x%04x ref_tag: %u\n", @@ -1344,26 +1344,26 @@ sbc_dif_verify(struct se_cmd *cmd, sector_t start, unsigned int sectors, if (sdt->app_tag == cpu_to_be16(0xffff)) { sector++; - offset += sizeof(struct se_dif_v1_tuple); + psg_off += sizeof(struct se_dif_v1_tuple); continue; } rc = sbc_dif_v1_verify(cmd, sdt, daddr + j, sector, ei_lba); if (rc) { - kunmap_atomic(paddr); - kunmap_atomic(daddr); + kunmap_atomic(paddr - psg->offset); + kunmap_atomic(daddr - dsg->offset); cmd->bad_sector = sector; return rc; } sector++; ei_lba++; - offset += sizeof(struct se_dif_v1_tuple); + psg_off += sizeof(struct se_dif_v1_tuple); } - kunmap_atomic(paddr); - kunmap_atomic(daddr); + kunmap_atomic(paddr - psg->offset); + kunmap_atomic(daddr - dsg->offset); } return 0; |