summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorAaron Lu <aaron.lu@intel.com>2013-04-27 09:33:07 +0800
committerJeff Garzik <jgarzik@redhat.com>2013-04-30 18:02:45 -0400
commitd66af4df0837f21bf267305dc5ccab2d29e24d86 (patch)
treef71109c378a242c909add6ee47b6cac8510e82be /fs
parent3f1317a2be018d03435d48645df6d17eaa2a8421 (diff)
downloadlinux-d66af4df0837f21bf267305dc5ccab2d29e24d86.tar.bz2
[libata] acpi: make ata_ap_acpi_handle not block
Since commit 30dcf76acc, ata_ap_acpi_handle will always do a namespace walk, which requires acquiring an acpi namespace mutex. This made it impossible to be used when calling path has held a spinlock. For example, it can occur in the following code path for pata_acpi: ata_scsi_queuecmd (ap->lock is acquired) __ata_scsi_queuecmd ata_scsi_translate ata_qc_issue pacpi_qc_issue ata_acpi_stm ata_ap_acpi_handle acpi_get_child acpi_walk_namespace acpi_ut_acquire_mutex (acquire mutex while holding lock) This caused scheduling while atomic bug, as reported in bug #56781. Actually, ata_ap_acpi_handle doesn't have to walk the namespace every time it is called, it can simply return the bound acpi handle on the corresponding SCSI host. The reason previously it is not done this way is, ata_ap_acpi_handle is used in the binding function ata_acpi_bind_host by ata_acpi_gtm when the handle is not bound to the SCSI host yet. Since we already have the ATA port's handle in its binding function, we can simply use it instead of calling ata_ap_acpi_handle there. So introduce a new function __ata_acpi_gtm, where it will receive an acpi handle param in addition to the ATA port which is solely used for debug statement. With this change, we can make ata_ap_acpi_handle simply return the bound handle for SCSI host instead of walking the acpi namespace now. Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=56781 Reported-and-tested-by: <kenzopl@o2.pl> Cc: <stable@vger.kernel.org> Signed-off-by: Aaron Lu <aaron.lu@intel.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'fs')
0 files changed, 0 insertions, 0 deletions