summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-queue.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ata/ata-queue.c')
-rw-r--r--sys/dev/ata/ata-queue.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/dev/ata/ata-queue.c b/sys/dev/ata/ata-queue.c
index b438467..707dfe9 100644
--- a/sys/dev/ata/ata-queue.c
+++ b/sys/dev/ata/ata-queue.c
@@ -237,8 +237,14 @@ ata_start(device_t dev)
void
ata_finish(struct ata_request *request)
{
+ struct ata_channel *ch = device_get_softc(request->parent);
- if (dumping) {
+ /*
+ * if in ATA_STALL_QUEUE state or request has ATA_R_DIRECT flags set
+ * we need to call ata_complete() directly here (no taskqueue involvement)
+ */
+ if (dumping ||
+ (ch->state & ATA_STALL_QUEUE) || (request->flags & ATA_R_DIRECT)) {
ATA_DEBUG_RQ(request, "finish directly");
ata_completed(request, 0);
}
OpenPOWER on IntegriCloud