Patch "iscsi-target: Fix TMR reference leak during session shutdown" has been added to the 3.18-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
iscsi-target: Fix TMR reference leak during session shutdown
to the 3.18-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
iscsi-target-fix-tmr-reference-leak-during-session-shutdown.patch
and it can be found in the queue-3.18 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
efb2ea770bb3b0f40007530bc8b0c22f36e1c5ebMon Sep 17 00:00:00 2001
From: Nicholas Bellinger <[email protected]>
Date: Thu, 23 Mar 2017 17:19:24 -0700
Subject: iscsi-target: Fix TMR reference leak during session shutdown
From: Nicholas Bellinger <[email protected]>
commit efb2ea770bb3b0f40007530bc8b0c22f36e1c5eb upstream.
This patch fixes a iscsi-target specific TMR reference leak during session shutdown, that could occur when a TMR was quiesced before the hand-off back to iscsi-target code via transport_cmd_check_stop_to_fabric().
The reference leak happens because iscsit_free_cmd() was incorrectly skipping the final target_put_sess_cmd() for TMRs when transport_generic_free_cmd() returned zero because the se_cmd->cmd_kref did not reach zero, due to the missing se_cmd assignment in original code.
The result was iscsi_cmd and it's associated se_cmd memory would be freed once se_sess->sess_cmd_map where released, but the associated se_tmr_req was leaked and remained part of se_device->dev_tmr_list.
This bug would manfiest itself as kernel paging request OOPsen in core_tmr_lun_reset(), when a left-over se_tmr_req attempted to dereference it's se_cmd pointer that had already been released during normal session shutdown.
To address this bug, go ahead and treat ISCSI_OP_SCSI_CMD and ISCSI_OP_SCSI_TMFUNC the same when there is an extra se_cmd->cmd_kref to drop in iscsit_free_cmd(), and use op_scsi to signal __iscsit_free_cmd() when the former needs to clear any further iscsi related I/O state.
--- drivers/target/iscsi/iscsi_target_util.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/target/iscsi/iscsi_target_util.c +7 -5
@@ -731,21 +731,23 @@ void iscsit_free_cmd(struct iscsi_cmd *c {struct se_cmd *se_cmd =NULL ;int rc; +bool op_scsi = false;/* * Determine if a struct se_cmd is associated with * this struct iscsi_cmd. */ switch (cmd->iscsi_opcode) {case ISCSI_OP_SCSI_CMD : - se_cmd = &cmd->se_cmd; -__iscsit_free_cmd (cmd, true, shutdown); + op_scsi = true;/* * Fallthrough */ case ISCSI_OP_SCSI_TMFUNC : - rc =transport_generic_free_cmd (&cmd->se_cmd, shutdown); -if (!rc && shutdown && se_cmd && se_cmd->se_sess) { -__iscsit_free_cmd (cmd, true, shutdown); + se_cmd = &cmd->se_cmd; +__iscsit_free_cmd (cmd, op_scsi, shutdown); + rc =transport_generic_free_cmd (se_cmd, shutdown); +if (!rc && shutdown && se_cmd->se_sess) { +__iscsit_free_cmd (cmd, op_scsi, shutdown);target_put_sess_cmd (se_cmd); }break ;
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/iscsi-target-drop-work-around-for-legacy-globalsan-initiator.patch queue-3.18/iscsi-target-fix-tmr-reference-leak-during-session-shutdown.patch