diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-05-23 00:48:35 -0700 |
---|---|---|
committer | Jiri Slaby <jslaby@suse.cz> | 2014-06-20 17:34:12 +0200 |
commit | a12e3e7bfc80023f8ef4ab17eebeb0e344494036 (patch) | |
tree | a25af429b6b46d7d782a7ebf7e615622e599e668 /drivers | |
parent | 3e1b305b53c104d93e1f5d4ac1e682bdf31bb139 (diff) | |
download | linux-stable-a12e3e7bfc80023f8ef4ab17eebeb0e344494036.tar.gz linux-stable-a12e3e7bfc80023f8ef4ab17eebeb0e344494036.tar.bz2 linux-stable-a12e3e7bfc80023f8ef4ab17eebeb0e344494036.zip |
iser-target: Add missing target_put_sess_cmd for ImmedateData failure
commit 6cc44a6fb46e1ecc1c28125aa8fa34d317aa9ea7 upstream.
This patch addresses a bug where an early exception for SCSI WRITE
with ImmediateData=Yes was missing the target_put_sess_cmd() call
to drop the extra se_cmd->cmd_kref reference obtained during the
normal iscsit_setup_scsi_cmd() codepath execution.
This bug was manifesting itself during session shutdown within
isert_cq_rx_comp_err() where target_wait_for_sess_cmds() would
end up waiting indefinately for the last se_cmd->cmd_kref put to
occur for the failed SCSI WRITE + ImmediateData descriptors.
This fix follows what traditional iscsi-target code already does
for the same failure case within iscsit_get_immediate_data().
Reported-by: Sagi Grimberg <sagig@dev.mellanox.co.il>
Cc: Sagi Grimberg <sagig@dev.mellanox.co.il>
Cc: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/infiniband/ulp/isert/ib_isert.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index e6737607a088..8f23786c74e9 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c @@ -1081,6 +1081,8 @@ sequence_cmd: if (!rc && dump_payload == false && unsol_data) iscsit_set_unsoliticed_dataout(cmd); + else if (dump_payload && imm_data) + target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); return 0; } |