]> bbs.cooldavid.org Git - net-next-2.6.git/commit - drivers/ata/libata-core.c
[PATCH] libata: implement ata_exec_internal()
authorTejun Heo <htejun@gmail.com>
Tue, 13 Dec 2005 05:48:31 +0000 (14:48 +0900)
committerJeff Garzik <jgarzik@pobox.com>
Tue, 13 Dec 2005 06:34:45 +0000 (01:34 -0500)
commita2a7a662f80d8b7f2295a36de1f9b033ed0b910c
treea04872ba93c1eff094d2d37a0435e1d965d43f22
parent575ab52a218e4ff0667a6cbd972c3af443ee8713
[PATCH] libata: implement ata_exec_internal()

This patch implements ata_exec_internal() function which performs
libata internal command execution.  Previously, this was done by each
user by manually initializing a qc, issueing it, waiting for its
completion and handling errors.  In addition to obvious code
factoring, using ata_exec_internal() fixes the following bugs.

* qc not freed on issue failure
* ap->qactive clearing could race with the next internal command
* race between timeout handling and irq
* ignoring error condition not represented in tf->status

Also, qc & hardware are not accessed anymore once it's completed,
making internal commands more conformant with general semantics.
ata_exec_internal() also makes it easy to issue internal commands from
multiple threads if that becomes necessary.

This patch only implements ata_exec_internal().  A following patch
will convert all users.

Signed-off-by: Tejun Heo <htejun@gmail.com>
--

Jeff, all patches have been regenerated against upstream branch as of
today.  (575ab52a218e4ff0667a6cbd972c3af443ee8713)

Also, I took out a debug printk from ata_exec_internal (don't know how
that one got left there).  Other than that, all patches are identical
to the previous posting.

Thanks. :-)
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
drivers/scsi/libata-core.c
include/linux/libata.h