diff options
author | emaste <emaste@FreeBSD.org> | 2012-02-13 01:44:12 +0000 |
---|---|---|
committer | emaste <emaste@FreeBSD.org> | 2012-02-13 01:44:12 +0000 |
commit | 748cf05a77ebd633e384c1dd4a818cc8b538af55 (patch) | |
tree | 1c0215b109602526fd0ded212aa2a42a8c7f1f61 | |
parent | 80ea6de190c8b732ffca4edf07d1a680ad172b12 (diff) | |
download | FreeBSD-src-748cf05a77ebd633e384c1dd4a818cc8b538af55.zip FreeBSD-src-748cf05a77ebd633e384c1dd4a818cc8b538af55.tar.gz |
Fix panic after "WARNING - ATA_IDENTIFY taskqueue timeout"
When performing a firmware upgrade via atacontrol[1] the subsequent
command may time out producing the error message above. When this
happens the callout could still be active, and the system would then
panic due to a destroyed semaphore.
Instead, ensure that the callout is done first, via callout_drain.
Note that this fix applies to the "old" ata(4) and so isn't applicable
to the default configuration in HEAD. It is still applicable to
stable/8.
[1] http://lists.freebsd.org/pipermail/freebsd-current/2012-January/031122.html
Submitted by: Nima Misaghian
Reviewed by: rstone, attilio, mav
Obtained from: SVOS
MFC after: 3 days
-rw-r--r-- | sys/dev/ata/ata-queue.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/sys/dev/ata/ata-queue.c b/sys/dev/ata/ata-queue.c index 27fbf7f..a58423b 100644 --- a/sys/dev/ata/ata-queue.c +++ b/sys/dev/ata/ata-queue.c @@ -112,6 +112,7 @@ ata_queue_request(struct ata_request *request) ATA_DEBUG_RQ(request, "wait for completion"); if (!dumping && sema_timedwait(&request->done, request->timeout * hz * 4)) { + callout_drain(&request->callout); device_printf(request->dev, "WARNING - %s taskqueue timeout " "- completing request directly\n", |