diff options
author | Akinobu Mita <akinobu.mita@gmail.com> | 2015-04-05 10:59:38 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-04-08 02:27:59 -0400 |
commit | 6766cc81191c946dcb8e8bfe49f220f9a1cc8b5c (patch) | |
tree | b5945fa9c455771e40d35b03d112d58d800ac1df /drivers/target | |
parent | 2e1cd90d718a5fc721e0caa0dc9f037d9b1f46b8 (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.c | 66 |
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 | ||
385 | typedef sense_reason_t (*dif_verify)(struct se_cmd *, sector_t, unsigned int, | ||
386 | unsigned int, struct scatterlist *, int); | ||
387 | |||
388 | static 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 | |||
385 | static sense_reason_t | 415 | static sense_reason_t |
386 | rd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, | 416 | rd_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 | } |