DF-4837 / fix.diff
--- a/sys/dev/raid/ida/ida.c +++ b/sys/dev/raid/ida/ida.c @@ -388,7 +388,9 @@ ida_construct_qcb(struct ida_softc *ida) bioq_remove(&ida->bio_queue, bio); qcb->bio = bio; - qcb->flags = 0; + qcb->flags = DMA_DATA_TRANSFER | + ((bp->b_cmd == BUF_CMD_READ) ? DMA_DATA_IN : DMA_DATA_OUT); hwqcb = qcb->hwqcb; bzero(hwqcb, sizeof(struct ida_hdr) + sizeof(struct ida_req)); @@ -332,13 +334,12 @@ ida_command(struct ida_softc *ida, int command, void *data, int datasize, hwqcb = qcb->hwqcb; bzero(hwqcb, sizeof(struct ida_hdr) + sizeof(struct ida_req)); + qcb->flags = flags | IDA_COMMAND; /* set before the dmasync below */ + bus_dmamap_load(ida->buffer_dmat, qcb->dmamap, data, datasize, ida_setup_dmamap, hwqcb, 0); op = qcb->flags & DMA_DATA_IN ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE; bus_dmamap_sync(ida->buffer_dmat, qcb->dmamap, op); hwqcb->hdr.drive = drive; @@ -346,8 +347,6 @@ ida_command(struct ida_softc *ida, int command, void *data, int datasize, KKASSERT(pblkno < 0x100000000ULL); - qcb->flags = flags | IDA_COMMAND; - crit_enter(); STAILQ_INSERT_TAIL(&ida->qcb_queue, qcb, link.stqe); ida_start(ida); |