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
This commit is contained in:
Ed Maste 2012-02-13 01:44:12 +00:00
parent e8e848ef8e
commit 1707b4455f

View File

@ -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",