diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2014-02-12 04:40:25 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-02-12 18:14:45 -0500 |
commit | d6a65fdc8903e632aa7bf86ee0f61a73969371f6 (patch) | |
tree | c18b376c410888a03f54414d3f420f66f1faf872 | |
parent | 9d8abf45944e4f1c18a04070fc3ed2f3ffcbbcb6 (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.c | 8 |
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 | } |