]> git.karo-electronics.de Git - linux-beck.git/commitdiff
target/sbc: Make internal DIF emulation honor ->prot_checks
authorNicholas Bellinger <nab@linux-iscsi.org>
Tue, 14 Apr 2015 18:57:43 +0000 (11:57 -0700)
committerNicholas Bellinger <nab@linux-iscsi.org>
Thu, 16 Apr 2015 05:47:17 +0000 (22:47 -0700)
The internal DIF emulation was not honoring se_cmd->prot_checks for
the WRPROTECT/RDPROTECT == 0x3 case, so sbc_dif_v1_verify() has been
updated to follow which checks have been calculated based on
WRPROTECT/RDPROTECT in sbc_set_prot_op_checks().

Reviewed-by: Martin Petersen <martin.petersen@oracle.com>
Reviewed-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/target/target_core_sbc.c

index 7006c95586e3450e66755b3a38d9a0b70227ad92..38d7c33bbc990cdca7318f41c05ddecc1debaa03 100644 (file)
@@ -1230,6 +1230,9 @@ sbc_dif_v1_verify(struct se_cmd *cmd, struct se_dif_v1_tuple *sdt,
        int block_size = dev->dev_attrib.block_size;
        __be16 csum;
 
+       if (!(cmd->prot_checks & TARGET_DIF_CHECK_GUARD))
+               goto check_ref;
+
        csum = cpu_to_be16(crc_t10dif(p, block_size));
 
        if (sdt->guard_tag != csum) {
@@ -1239,6 +1242,10 @@ sbc_dif_v1_verify(struct se_cmd *cmd, struct se_dif_v1_tuple *sdt,
                return TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED;
        }
 
+check_ref:
+       if (!(cmd->prot_checks & TARGET_DIF_CHECK_REFTAG))
+               return 0;
+
        if (cmd->prot_type == TARGET_DIF_TYPE1_PROT &&
            be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
                pr_err("DIFv1 Type 1 reference failed on sector: %llu tag: 0x%08x"