From: Roland Dreier Date: Tue, 14 Jun 2011 03:55:06 +0000 (-0700) Subject: target: Make se_dev_check_online() locking IRQ-safe X-Git-Tag: v3.1-rc1~305^2~21 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=56e34ee2adb59a35bfa5714bdf4dcb3f4d14a41d;p=platform%2Fkernel%2Flinux-stable.git target: Make se_dev_check_online() locking IRQ-safe se_dev_check_online() is called from transport_lookup_cmd_lun(), which as discussed before may be called from interrupt context. So it needs to use spin_lock_irqsave() instead of spin_lock_irq() to avoid enabling interrupts at the wrong time. Signed-off-by: Roland Dreier Signed-off-by: Nicholas Bellinger --- diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index e25df3b..6d93d96 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c @@ -813,12 +813,13 @@ static void se_dev_stop(struct se_device *dev) int se_dev_check_online(struct se_device *dev) { + unsigned long flags; int ret; - spin_lock_irq(&dev->dev_status_lock); + spin_lock_irqsave(&dev->dev_status_lock, flags); ret = ((dev->dev_status & TRANSPORT_DEVICE_ACTIVATED) || (dev->dev_status & TRANSPORT_DEVICE_DEACTIVATED)) ? 0 : 1; - spin_unlock_irq(&dev->dev_status_lock); + spin_unlock_irqrestore(&dev->dev_status_lock, flags); return ret; }