| From a4c15cd957cbd728f685645de7a150df5912591a Mon Sep 17 00:00:00 2001 |
| From: Jenny Derzhavetz <jennyf@mellanox.com> |
| Date: Sun, 6 Sep 2015 14:52:20 +0300 |
| Subject: iser-target: remove command with state ISTATE_REMOVE |
| |
| From: Jenny Derzhavetz <jennyf@mellanox.com> |
| |
| commit a4c15cd957cbd728f685645de7a150df5912591a upstream. |
| |
| As documented in iscsit_sequence_cmd: |
| /* |
| * Existing callers for iscsit_sequence_cmd() will silently |
| * ignore commands with CMDSN_LOWER_THAN_EXP, so force this |
| * return for CMDSN_MAXCMDSN_OVERRUN as well.. |
| */ |
| |
| We need to silently finish a command when it's in ISTATE_REMOVE. |
| This fixes an teardown hang we were seeing where a mis-behaved |
| initiator (triggered by allocation error injections) sent us a |
| cmdsn which was lower than expected. |
| |
| Signed-off-by: Jenny Derzhavetz <jennyf@mellanox.com> |
| Signed-off-by: Sagi Grimberg <sagig@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 | 9 ++++++++- |
| 1 file changed, 8 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/infiniband/ulp/isert/ib_isert.c |
| +++ b/drivers/infiniband/ulp/isert/ib_isert.c |
| @@ -2634,9 +2634,16 @@ isert_get_dataout(struct iscsi_conn *con |
| static int |
| isert_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state) |
| { |
| - int ret; |
| + struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd); |
| + int ret = 0; |
| |
| switch (state) { |
| + case ISTATE_REMOVE: |
| + spin_lock_bh(&conn->cmd_lock); |
| + list_del_init(&cmd->i_conn_node); |
| + spin_unlock_bh(&conn->cmd_lock); |
| + isert_put_cmd(isert_cmd, true); |
| + break; |
| case ISTATE_SEND_NOPIN_WANT_RESPONSE: |
| ret = isert_put_nopin(cmd, conn, false); |
| break; |