diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2012-01-10 14:16:58 +0100 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2012-01-18 08:30:39 +0000 |
commit | 1dd0a0674530da61cdbfadd88c96949b483a7c19 (patch) | |
tree | 5e47fe019fb7961883b3104a043eff71392c0ff2 | |
parent | e59a41b69a8e116d5ac8c95c4222f5a971f66bbd (diff) | |
download | op-kernel-dev-1dd0a0674530da61cdbfadd88c96949b483a7c19.zip op-kernel-dev-1dd0a0674530da61cdbfadd88c96949b483a7c19.tar.gz |
target: use save/restore lock primitive in core_dec_lacl_count()
It may happen that uasp will free the request in irq conntext, the
callchain:
uasp_cmd_release() -> transport_generic_free_cmd() -> core_dec_lacl_count()
where the last function enables the IRQ. Those irqs are re-disabled
later (due to the spin.*irq_restore) but in between we could get hurt.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r-- | drivers/target/target_core_device.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index 0c5992f..00159a4 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c @@ -320,11 +320,12 @@ int core_free_device_list_for_node( void core_dec_lacl_count(struct se_node_acl *se_nacl, struct se_cmd *se_cmd) { struct se_dev_entry *deve; + unsigned long flags; - spin_lock_irq(&se_nacl->device_list_lock); + spin_lock_irqsave(&se_nacl->device_list_lock, flags); deve = &se_nacl->device_list[se_cmd->orig_fe_lun]; deve->deve_cmds--; - spin_unlock_irq(&se_nacl->device_list_lock); + spin_unlock_irqrestore(&se_nacl->device_list_lock, flags); } void core_update_device_list_access( |