diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2012-01-10 08:16:58 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2012-01-18 03:30:39 -0500 |
commit | 1dd0a0674530da61cdbfadd88c96949b483a7c19 (patch) | |
tree | 5e47fe019fb7961883b3104a043eff71392c0ff2 /drivers/target | |
parent | e59a41b69a8e116d5ac8c95c4222f5a971f66bbd (diff) |
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>
Diffstat (limited to 'drivers/target')
-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 0c5992f0d946..00159a4e781f 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( | |||
320 | void core_dec_lacl_count(struct se_node_acl *se_nacl, struct se_cmd *se_cmd) | 320 | void core_dec_lacl_count(struct se_node_acl *se_nacl, struct se_cmd *se_cmd) |
321 | { | 321 | { |
322 | struct se_dev_entry *deve; | 322 | struct se_dev_entry *deve; |
323 | unsigned long flags; | ||
323 | 324 | ||
324 | spin_lock_irq(&se_nacl->device_list_lock); | 325 | spin_lock_irqsave(&se_nacl->device_list_lock, flags); |
325 | deve = &se_nacl->device_list[se_cmd->orig_fe_lun]; | 326 | deve = &se_nacl->device_list[se_cmd->orig_fe_lun]; |
326 | deve->deve_cmds--; | 327 | deve->deve_cmds--; |
327 | spin_unlock_irq(&se_nacl->device_list_lock); | 328 | spin_unlock_irqrestore(&se_nacl->device_list_lock, flags); |
328 | } | 329 | } |
329 | 330 | ||
330 | void core_update_device_list_access( | 331 | void core_update_device_list_access( |