⬢ DragonFlyBSD Kernel Audit
DF-4837 / fix.diff
← back to finding ↓ download raw
--- 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);