aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/target_core_sbc.c
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2015-04-19 13:27:21 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2015-05-31 01:41:42 -0400
commit414e4627277e38e3a557c53c9def7fe9f1ec9b2c (patch)
tree3b4475d1a2c81f84e7d8a32895889e24b3077ab3 /drivers/target/target_core_sbc.c
parent8287fa5fb43c3fa05748560b8e13b91c4e88f586 (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.c28
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
1313sense_reason_t 1313sense_reason_t
1314sbc_dif_verify(struct se_cmd *cmd, sector_t start, unsigned int sectors, 1314sbc_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;