aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2014-02-23 07:20:08 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2014-02-23 19:35:32 -0500
commitfc272ec7a2dfe002b823c78f8ef0eb88042e2762 (patch)
treef6eb0a8ba75f656c042816f971316deb8ee3cf80 /drivers/target
parent94387aa7cec8c5386b405b852cf3e5be38456fc7 (diff)
Target/sbc: Don't use sg as iterator in sbc_verify_read
Because then this sg is passed to sbc_copy_prot which will hit a protection fault in cases we have more than a single sg. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/target_core_sbc.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c
index ef1a58a134aa..42f18fc1067b 100644
--- a/drivers/target/target_core_sbc.c
+++ b/drivers/target/target_core_sbc.c
@@ -1162,7 +1162,7 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors,
1162{ 1162{
1163 struct se_device *dev = cmd->se_dev; 1163 struct se_device *dev = cmd->se_dev;
1164 struct se_dif_v1_tuple *sdt; 1164 struct se_dif_v1_tuple *sdt;
1165 struct scatterlist *dsg; 1165 struct scatterlist *dsg, *psg = sg;
1166 sector_t sector = start; 1166 sector_t sector = start;
1167 void *daddr, *paddr; 1167 void *daddr, *paddr;
1168 int i, j, offset = sg_off; 1168 int i, j, offset = sg_off;
@@ -1170,14 +1170,14 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors,
1170 1170
1171 for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) { 1171 for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) {
1172 daddr = kmap_atomic(sg_page(dsg)) + dsg->offset; 1172 daddr = kmap_atomic(sg_page(dsg)) + dsg->offset;
1173 paddr = kmap_atomic(sg_page(sg)) + sg->offset; 1173 paddr = kmap_atomic(sg_page(psg)) + sg->offset;
1174 1174
1175 for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) { 1175 for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) {
1176 1176
1177 if (offset >= sg->length) { 1177 if (offset >= psg->length) {
1178 kunmap_atomic(paddr); 1178 kunmap_atomic(paddr);
1179 sg = sg_next(sg); 1179 psg = sg_next(psg);
1180 paddr = kmap_atomic(sg_page(sg)) + sg->offset; 1180 paddr = kmap_atomic(sg_page(psg)) + psg->offset;
1181 offset = 0; 1181 offset = 0;
1182 } 1182 }
1183 1183