mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-20 00:26:39 +08:00
target: Fix incorrect usage of nested IRQ spinlocks in ABORT_TASK path
This patch changes core_tmr_abort_task() to use spin_lock -> spin_unlock around se_cmd->t_state_lock while spin_lock_irqsave is held via se_sess->sess_cmd_lock. Signed-off-by: Steve Hodgson <steve@purestorage.com> Signed-off-by: Roland Dreier <roland@purestorage.com> Cc: stable@vger.kernel.org Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
d5627acba9
commit
ab74b3d62f
@ -140,15 +140,15 @@ void core_tmr_abort_task(
|
|||||||
printk("ABORT_TASK: Found referenced %s task_tag: %u\n",
|
printk("ABORT_TASK: Found referenced %s task_tag: %u\n",
|
||||||
se_cmd->se_tfo->get_fabric_name(), ref_tag);
|
se_cmd->se_tfo->get_fabric_name(), ref_tag);
|
||||||
|
|
||||||
spin_lock_irq(&se_cmd->t_state_lock);
|
spin_lock(&se_cmd->t_state_lock);
|
||||||
if (se_cmd->transport_state & CMD_T_COMPLETE) {
|
if (se_cmd->transport_state & CMD_T_COMPLETE) {
|
||||||
printk("ABORT_TASK: ref_tag: %u already complete, skipping\n", ref_tag);
|
printk("ABORT_TASK: ref_tag: %u already complete, skipping\n", ref_tag);
|
||||||
spin_unlock_irq(&se_cmd->t_state_lock);
|
spin_unlock(&se_cmd->t_state_lock);
|
||||||
spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
|
spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
se_cmd->transport_state |= CMD_T_ABORTED;
|
se_cmd->transport_state |= CMD_T_ABORTED;
|
||||||
spin_unlock_irq(&se_cmd->t_state_lock);
|
spin_unlock(&se_cmd->t_state_lock);
|
||||||
|
|
||||||
list_del_init(&se_cmd->se_cmd_list);
|
list_del_init(&se_cmd->se_cmd_list);
|
||||||
kref_get(&se_cmd->cmd_kref);
|
kref_get(&se_cmd->cmd_kref);
|
||||||
|
Loading…
Reference in New Issue
Block a user