| From 9253e667ab50fd4611a60e1cdd6a6e05a1d91cf1 Mon Sep 17 00:00:00 2001 |
| From: Sagi Grimberg <sagig@mellanox.com> |
| Date: Thu, 4 Jun 2015 19:49:19 +0300 |
| Subject: iser-target: Fix variable-length response error completion |
| |
| From: Sagi Grimberg <sagig@mellanox.com> |
| |
| commit 9253e667ab50fd4611a60e1cdd6a6e05a1d91cf1 upstream. |
| |
| Since commit "2426bd456a6 target: Report correct response ..." |
| we might get a command with data_size that does not fit to |
| the number of allocated data sg elements. Given that we rely on |
| cmd t_data_nents which might be different than the data_size, |
| we sometimes receive local length error completion. The correct |
| approach would be to take the command data_size into account when |
| constructing the ib sg_list. |
| |
| Signed-off-by: Sagi Grimberg <sagig@mellanox.com> |
| Signed-off-by: Jenny Falkovich <jennyf@mellanox.com> |
| Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/infiniband/ulp/isert/ib_isert.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/infiniband/ulp/isert/ib_isert.c |
| +++ b/drivers/infiniband/ulp/isert/ib_isert.c |
| @@ -2316,7 +2316,6 @@ isert_build_rdma_wr(struct isert_conn *i |
| page_off = offset % PAGE_SIZE; |
| |
| send_wr->sg_list = ib_sge; |
| - send_wr->num_sge = sg_nents; |
| send_wr->wr_id = (uintptr_t)&isert_cmd->tx_desc; |
| /* |
| * Perform mapping of TCM scatterlist memory ib_sge dma_addr. |
| @@ -2336,14 +2335,17 @@ isert_build_rdma_wr(struct isert_conn *i |
| ib_sge->addr, ib_sge->length, ib_sge->lkey); |
| page_off = 0; |
| data_left -= ib_sge->length; |
| + if (!data_left) |
| + break; |
| ib_sge++; |
| isert_dbg("Incrementing ib_sge pointer to %p\n", ib_sge); |
| } |
| |
| + send_wr->num_sge = ++i; |
| isert_dbg("Set outgoing sg_list: %p num_sg: %u from TCM SGLs\n", |
| send_wr->sg_list, send_wr->num_sge); |
| |
| - return sg_nents; |
| + return send_wr->num_sge; |
| } |
| |
| static int |