aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-12-15 01:05:00 -0500
committerJeff Garzik <jeff@garzik.org>2007-12-17 20:33:12 -0500
commit7f9ad9b8b96855f529f4fe9db0bf32cd3f14c01b (patch)
tree955a9d2d53d7956319442e0321e37119a962ee9e
parentce2e0abbd31b047ac7be740d28ef710f5bbdb105 (diff)
libata: ata_dev_disable() should be called from EH context
ata_port_detach() calls ata_dev_disable() with host lock held but ata_dev_disable() should be called from EH context. ata_port_detach() steals EH context by setting ATA_PFLAG_UNLOADAING and flushing EH. Drop locking around ata_dev_disable() and note that ata_port_detach() owns EH context at that point. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/ata/libata-core.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 99a18cea316a..c316eacbeddd 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -7210,18 +7210,14 @@ static void ata_port_detach(struct ata_port *ap)
7210 7210
7211 ata_port_wait_eh(ap); 7211 ata_port_wait_eh(ap);
7212 7212
7213 /* EH is now guaranteed to see UNLOADING, so no new device 7213 /* EH is now guaranteed to see UNLOADING - EH context belongs
7214 * will be attached. Disable all existing devices. 7214 * to us. Disable all existing devices.
7215 */ 7215 */
7216 spin_lock_irqsave(ap->lock, flags);
7217
7218 ata_port_for_each_link(link, ap) { 7216 ata_port_for_each_link(link, ap) {
7219 ata_link_for_each_dev(dev, link) 7217 ata_link_for_each_dev(dev, link)
7220 ata_dev_disable(dev); 7218 ata_dev_disable(dev);
7221 } 7219 }
7222 7220
7223 spin_unlock_irqrestore(ap->lock, flags);
7224
7225 /* Final freeze & EH. All in-flight commands are aborted. EH 7221 /* Final freeze & EH. All in-flight commands are aborted. EH
7226 * will be skipped and retrials will be terminated with bad 7222 * will be skipped and retrials will be terminated with bad
7227 * target. 7223 * target.