diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2015-04-19 13:27:21 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-05-31 01:41:42 -0400 |
commit | 414e4627277e38e3a557c53c9def7fe9f1ec9b2c (patch) | |
tree | 3b4475d1a2c81f84e7d8a32895889e24b3077ab3 /drivers/target/target_core_sbc.c | |
parent | 8287fa5fb43c3fa05748560b8e13b91c4e88f586 (diff) |
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/target_core_sbc.c')
-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); | |||
1312 | 1312 | ||
1313 | sense_reason_t | 1313 | sense_reason_t |
1314 | sbc_dif_verify(struct se_cmd *cmd, sector_t start, unsigned int sectors, | 1314 | sbc_dif_verify(struct se_cmd *cmd, sector_t start, unsigned int sectors, |
1315 | unsigned int ei_lba, struct scatterlist *sg, int sg_off) | 1315 | unsigned int ei_lba, struct scatterlist *psg, int psg_off) |
1316 | { | 1316 | { |
1317 | struct se_device *dev = cmd->se_dev; | 1317 | struct se_device *dev = cmd->se_dev; |
1318 | struct se_dif_v1_tuple *sdt; | 1318 | struct se_dif_v1_tuple *sdt; |
1319 | struct scatterlist *dsg, *psg = sg; | 1319 | struct scatterlist *dsg; |
1320 | sector_t sector = start; | 1320 | sector_t sector = start; |
1321 | void *daddr, *paddr; | 1321 | void *daddr, *paddr; |
1322 | int i, j, offset = sg_off; | 1322 | int i, j; |
1323 | sense_reason_t rc; | 1323 | sense_reason_t rc; |
1324 | 1324 | ||
1325 | for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) { | 1325 | for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) { |
1326 | daddr = kmap_atomic(sg_page(dsg)) + dsg->offset; | 1326 | daddr = kmap_atomic(sg_page(dsg)) + dsg->offset; |
1327 | paddr = kmap_atomic(sg_page(psg)) + sg->offset; | 1327 | paddr = kmap_atomic(sg_page(psg)) + psg->offset; |
1328 | 1328 | ||
1329 | for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) { | 1329 | for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) { |
1330 | 1330 | ||
1331 | if (offset >= psg->length) { | 1331 | if (psg_off >= psg->length) { |
1332 | kunmap_atomic(paddr); | 1332 | kunmap_atomic(paddr - psg->offset); |
1333 | psg = sg_next(psg); | 1333 | psg = sg_next(psg); |
1334 | paddr = kmap_atomic(sg_page(psg)) + psg->offset; | 1334 | paddr = kmap_atomic(sg_page(psg)) + psg->offset; |
1335 | offset = 0; | 1335 | psg_off = 0; |
1336 | } | 1336 | } |
1337 | 1337 | ||
1338 | sdt = paddr + offset; | 1338 | sdt = paddr + psg_off; |
1339 | 1339 | ||
1340 | pr_debug("DIF READ sector: %llu guard_tag: 0x%04x" | 1340 | pr_debug("DIF READ sector: %llu guard_tag: 0x%04x" |
1341 | " app_tag: 0x%04x ref_tag: %u\n", | 1341 | " 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, | |||
1344 | 1344 | ||
1345 | if (sdt->app_tag == cpu_to_be16(0xffff)) { | 1345 | if (sdt->app_tag == cpu_to_be16(0xffff)) { |
1346 | sector++; | 1346 | sector++; |
1347 | offset += sizeof(struct se_dif_v1_tuple); | 1347 | psg_off += sizeof(struct se_dif_v1_tuple); |
1348 | continue; | 1348 | continue; |
1349 | } | 1349 | } |
1350 | 1350 | ||
1351 | rc = sbc_dif_v1_verify(cmd, sdt, daddr + j, sector, | 1351 | rc = sbc_dif_v1_verify(cmd, sdt, daddr + j, sector, |
1352 | ei_lba); | 1352 | ei_lba); |
1353 | if (rc) { | 1353 | if (rc) { |
1354 | kunmap_atomic(paddr); | 1354 | kunmap_atomic(paddr - psg->offset); |
1355 | kunmap_atomic(daddr); | 1355 | kunmap_atomic(daddr - dsg->offset); |
1356 | cmd->bad_sector = sector; | 1356 | cmd->bad_sector = sector; |
1357 | return rc; | 1357 | return rc; |
1358 | } | 1358 | } |
1359 | 1359 | ||
1360 | sector++; | 1360 | sector++; |
1361 | ei_lba++; | 1361 | ei_lba++; |
1362 | offset += sizeof(struct se_dif_v1_tuple); | 1362 | psg_off += sizeof(struct se_dif_v1_tuple); |
1363 | } | 1363 | } |
1364 | 1364 | ||
1365 | kunmap_atomic(paddr); | 1365 | kunmap_atomic(paddr - psg->offset); |
1366 | kunmap_atomic(daddr); | 1366 | kunmap_atomic(daddr - dsg->offset); |
1367 | } | 1367 | } |
1368 | 1368 | ||
1369 | return 0; | 1369 | return 0; |