aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2015-04-05 10:59:38 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2015-04-08 02:27:59 -0400
commit6766cc81191c946dcb8e8bfe49f220f9a1cc8b5c (patch)
treeb5945fa9c455771e40d35b03d112d58d800ac1df /drivers/target
parent2e1cd90d718a5fc721e0caa0dc9f037d9b1f46b8 (diff)
target/rd: reduce code duplication in rd_execute_rw()
Factor out code duplication in rd_execute_rw() into a helper function rd_do_prot_rw(). This change is required to minimize the forthcoming fix in rd_do_prot_rw(). (Fix up v4.1 for-next fuzz - nab) Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Cc: Sagi Grimberg <sagig@dev.mellanox.co.il> Cc: "Martin K. Petersen" <martin.petersen@oracle.com> Cc: Christoph Hellwig <hch@lst.de> Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com> Cc: target-devel@vger.kernel.org Cc: linux-scsi@vger.kernel.org Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/target_core_rd.c66
1 files changed, 32 insertions, 34 deletions
diff --git a/drivers/target/target_core_rd.c b/drivers/target/target_core_rd.c
index bedd4a18b3ca..ccf62a88f017 100644
--- a/drivers/target/target_core_rd.c
+++ b/drivers/target/target_core_rd.c
@@ -382,6 +382,36 @@ static struct rd_dev_sg_table *rd_get_prot_table(struct rd_dev *rd_dev, u32 page
382 return NULL; 382 return NULL;
383} 383}
384 384
385typedef sense_reason_t (*dif_verify)(struct se_cmd *, sector_t, unsigned int,
386 unsigned int, struct scatterlist *, int);
387
388static sense_reason_t rd_do_prot_rw(struct se_cmd *cmd, dif_verify dif_verify)
389{
390 struct se_device *se_dev = cmd->se_dev;
391 struct rd_dev *dev = RD_DEV(se_dev);
392 struct rd_dev_sg_table *prot_table;
393 struct scatterlist *prot_sg;
394 u32 sectors = cmd->data_length / se_dev->dev_attrib.block_size;
395 u32 prot_offset, prot_page;
396 u64 tmp;
397 sense_reason_t rc;
398
399 tmp = cmd->t_task_lba * se_dev->prot_length;
400 prot_offset = do_div(tmp, PAGE_SIZE);
401 prot_page = tmp;
402
403 prot_table = rd_get_prot_table(dev, prot_page);
404 if (!prot_table)
405 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
406
407 prot_sg = &prot_table->sg_table[prot_page -
408 prot_table->page_start_offset];
409
410 rc = dif_verify(cmd, cmd->t_task_lba, sectors, 0, prot_sg, prot_offset);
411
412 return rc;
413}
414
385static sense_reason_t 415static sense_reason_t
386rd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, 416rd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
387 enum dma_data_direction data_direction) 417 enum dma_data_direction data_direction)
@@ -421,23 +451,7 @@ rd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
421 451
422 if (cmd->prot_type && se_dev->dev_attrib.pi_prot_type && 452 if (cmd->prot_type && se_dev->dev_attrib.pi_prot_type &&
423 data_direction == DMA_TO_DEVICE) { 453 data_direction == DMA_TO_DEVICE) {
424 struct rd_dev_sg_table *prot_table; 454 rc = rd_do_prot_rw(cmd, sbc_dif_verify_write);
425 struct scatterlist *prot_sg;
426 u32 sectors = cmd->data_length / se_dev->dev_attrib.block_size;
427 u32 prot_offset, prot_page;
428
429 tmp = cmd->t_task_lba * se_dev->prot_length;
430 prot_offset = do_div(tmp, PAGE_SIZE);
431 prot_page = tmp;
432
433 prot_table = rd_get_prot_table(dev, prot_page);
434 if (!prot_table)
435 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
436
437 prot_sg = &prot_table->sg_table[prot_page - prot_table->page_start_offset];
438
439 rc = sbc_dif_verify_write(cmd, cmd->t_task_lba, sectors, 0,
440 prot_sg, prot_offset);
441 if (rc) 455 if (rc)
442 return rc; 456 return rc;
443 } 457 }
@@ -505,23 +519,7 @@ rd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
505 519
506 if (cmd->prot_type && se_dev->dev_attrib.pi_prot_type && 520 if (cmd->prot_type && se_dev->dev_attrib.pi_prot_type &&
507 data_direction == DMA_FROM_DEVICE) { 521 data_direction == DMA_FROM_DEVICE) {
508 struct rd_dev_sg_table *prot_table; 522 rc = rd_do_prot_rw(cmd, sbc_dif_verify_read);
509 struct scatterlist *prot_sg;
510 u32 sectors = cmd->data_length / se_dev->dev_attrib.block_size;
511 u32 prot_offset, prot_page;
512
513 tmp = cmd->t_task_lba * se_dev->prot_length;
514 prot_offset = do_div(tmp, PAGE_SIZE);
515 prot_page = tmp;
516
517 prot_table = rd_get_prot_table(dev, prot_page);
518 if (!prot_table)
519 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
520
521 prot_sg = &prot_table->sg_table[prot_page - prot_table->page_start_offset];
522
523 rc = sbc_dif_verify_read(cmd, cmd->t_task_lba, sectors, 0,
524 prot_sg, prot_offset);
525 if (rc) 523 if (rc)
526 return rc; 524 return rc;
527 } 525 }