aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2014-02-12 04:40:25 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2014-02-12 18:14:45 -0500
commitd6a65fdc8903e632aa7bf86ee0f61a73969371f6 (patch)
treec18b376c410888a03f54414d3f420f66f1faf872
parent9d8abf45944e4f1c18a04070fc3ed2f3ffcbbcb6 (diff)
Target/sbc: Fix protection copy routine
Need to take into account that protection sg_list (copy-buffer) may consist of multiple entries. Changes from v0: - Changed commit description Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/target/target_core_sbc.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c
index fa3cae393e13..a4489444ffbc 100644
--- a/drivers/target/target_core_sbc.c
+++ b/drivers/target/target_core_sbc.c
@@ -1074,12 +1074,19 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read,
1074 struct scatterlist *psg; 1074 struct scatterlist *psg;
1075 void *paddr, *addr; 1075 void *paddr, *addr;
1076 unsigned int i, len, left; 1076 unsigned int i, len, left;
1077 unsigned int offset = 0;
1077 1078
1078 left = sectors * dev->prot_length; 1079 left = sectors * dev->prot_length;
1079 1080
1080 for_each_sg(cmd->t_prot_sg, psg, cmd->t_prot_nents, i) { 1081 for_each_sg(cmd->t_prot_sg, psg, cmd->t_prot_nents, i) {
1081 1082
1082 len = min(psg->length, left); 1083 len = min(psg->length, left);
1084 if (offset >= sg->length) {
1085 sg = sg_next(sg);
1086 offset = 0;
1087 sg_off = sg->offset;
1088 }
1089
1083 paddr = kmap_atomic(sg_page(psg)) + psg->offset; 1090 paddr = kmap_atomic(sg_page(psg)) + psg->offset;
1084 addr = kmap_atomic(sg_page(sg)) + sg_off; 1091 addr = kmap_atomic(sg_page(sg)) + sg_off;
1085 1092
@@ -1089,6 +1096,7 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read,
1089 memcpy(addr, paddr, len); 1096 memcpy(addr, paddr, len);
1090 1097
1091 left -= len; 1098 left -= len;
1099 offset += len;
1092 kunmap_atomic(paddr); 1100 kunmap_atomic(paddr);
1093 kunmap_atomic(addr); 1101 kunmap_atomic(addr);
1094 } 1102 }