summaryrefslogtreecommitdiff
path: root/drivers/target/target_core_file.c
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2015-04-19 20:27:19 +0300
committerNicholas Bellinger <nab@linux-iscsi.org>2015-05-31 08:41:41 +0300
commitf75b6fae1a1d0a79dcbb9cbaed1d06bf3fe57a3c (patch)
treeb255e230aa10d9ad6a5e6d9944d7f82eb78bf662 /drivers/target/target_core_file.c
parentb2feda4feb1b0ea74c0916b4a35b038bbfef9c82 (diff)
downloadlinux-f75b6fae1a1d0a79dcbb9cbaed1d06bf3fe57a3c.tar.xz
target: Merge sbc_verify_dif_read|write
Instead of providing DIF verify routines for read/write that are almost identical and conditionally copy protection information, just let the caller do the right thing. Have a single sbc_dif_verify that handles an sgl (that does NOT copy any data) and a protection information copy routine used by rd_mcp and fileio backend. In the WRITE case, call sbc_dif_verify with cmd->t_prot_sg and then do the copy from it to local sgl (assuming the verify succeeded of course). In the READ case, call sbc_dif_verify with the local sgl and if it succeeds, copy it to t_prot_sg (or not if we are stripping it). (Fix apply breakage from commit c836777 - nab) Tested-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_file.c')
-rw-r--r--drivers/target/target_core_file.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c
index 3f27bfd816d8..deec7560f835 100644
--- a/drivers/target/target_core_file.c
+++ b/drivers/target/target_core_file.c
@@ -643,13 +643,14 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
if (ret > 0 && cmd->prot_type && dev->dev_attrib.pi_prot_type) {
u32 sectors = cmd->data_length / dev->dev_attrib.block_size;
- rc = sbc_dif_verify_read(cmd, cmd->t_task_lba, sectors,
- 0, fd_prot.prot_sg, 0);
+ rc = sbc_dif_verify(cmd, cmd->t_task_lba, sectors,
+ 0, fd_prot.prot_sg, 0);
if (rc) {
kfree(fd_prot.prot_sg);
kfree(fd_prot.prot_buf);
return rc;
}
+ sbc_dif_copy_prot(cmd, sectors, true, fd_prot.prot_sg, 0);
kfree(fd_prot.prot_sg);
kfree(fd_prot.prot_buf);
}
@@ -663,13 +664,14 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
if (ret < 0)
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
- rc = sbc_dif_verify_write(cmd, cmd->t_task_lba, sectors,
- 0, fd_prot.prot_sg, 0);
+ rc = sbc_dif_verify(cmd, cmd->t_task_lba, sectors,
+ 0, cmd->t_prot_sg, 0);
if (rc) {
kfree(fd_prot.prot_sg);
kfree(fd_prot.prot_buf);
return rc;
}
+ sbc_dif_copy_prot(cmd, sectors, false, fd_prot.prot_sg, 0);
}
ret = fd_do_rw(cmd, sgl, sgl_nents, 1);