cciss: fix spinlock use
Subsystems (2)
PATCH 1/1 cciss: fix spinlock use
fail_all_cmds is called (only) from do_cciss_intr with spinlock acquired.
So when in an error-handling situation, fail_all_cmds() is called it attempts to *reacquire* the lock. This has been found and analysed by Prarit Bhargava.
This patch removes the spinlock lock/unlock from fail_all_cmds and adds a spin_unlock after the call to fail_all_cmds before return.
Signed-off-by Tomas Henzl <[email protected]>
drivers/block/cciss.c +1 -3
@@ -3181,6 +3181,7 @@ static irqreturn_t do_cciss_intr(int irq, void *dev_id)"cciss: controller cciss%d failed, stopping.\n" , h->ctlr);fail_all_cmds (h->ctlr); +spin_unlock_irqrestore (CCISS_LOCK (h->ctlr), flags);return IRQ_HANDLED ; }
@@ -4230,8 +4231,6 @@ static void fail_all_cmds(unsigned long ctlr)printk (KERN_WARNING "cciss%d: controller not responding.\n" , h->ctlr); h->alive =0 ;/* the controller apparently died... */ -spin_lock_irqsave (CCISS_LOCK (ctlr), flags); -pci_disable_device (h->pdev);/* Make sure it is really dead. */ /* move everything off the request queue onto the completed queue */
@@ -4256,7 +4255,6 @@ static void fail_all_cmds(unsigned long ctlr)complete_scsi_command (c,0 ,0 );#endif } -spin_unlock_irqrestore (CCISS_LOCK (ctlr), flags);return ; }
Signature · 1 line
1.6.0.6