diff options
author | Tejun Heo <htejun@gmail.com> | 2007-12-15 15:05:00 +0900 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-12-17 20:33:12 -0500 |
commit | 7f9ad9b8b96855f529f4fe9db0bf32cd3f14c01b (patch) | |
tree | 955a9d2d53d7956319442e0321e37119a962ee9e /drivers/ata | |
parent | ce2e0abbd31b047ac7be740d28ef710f5bbdb105 (diff) | |
download | kernel-crypto-7f9ad9b8b96855f529f4fe9db0bf32cd3f14c01b.tar.gz kernel-crypto-7f9ad9b8b96855f529f4fe9db0bf32cd3f14c01b.tar.xz kernel-crypto-7f9ad9b8b96855f529f4fe9db0bf32cd3f14c01b.zip |
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>
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libata-core.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 99a18cea316..c316eacbedd 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) ata_port_wait_eh(ap); - /* EH is now guaranteed to see UNLOADING, so no new device - * will be attached. Disable all existing devices. + /* EH is now guaranteed to see UNLOADING - EH context belongs + * to us. Disable all existing devices. */ - spin_lock_irqsave(ap->lock, flags); - ata_port_for_each_link(link, ap) { ata_link_for_each_dev(dev, link) ata_dev_disable(dev); } - spin_unlock_irqrestore(ap->lock, flags); - /* Final freeze & EH. All in-flight commands are aborted. EH * will be skipped and retrials will be terminated with bad * target. |