diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2014-02-23 07:20:08 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-02-23 19:35:32 -0500 |
commit | fc272ec7a2dfe002b823c78f8ef0eb88042e2762 (patch) | |
tree | f6eb0a8ba75f656c042816f971316deb8ee3cf80 /drivers/target | |
parent | 94387aa7cec8c5386b405b852cf3e5be38456fc7 (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.c | 10 |
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 | ||