โฌข DragonFlyBSD Kernel Audit
DF-5050 / fix.diff
โ† back to finding โ†“ download raw
fix.diff โ€” DF-5050: mfi_dump_syspd_blocks (and its caller mfi_syspd_dump)
treat a completed-but-rejected firmware WRITE_10 as dump success.  mfi_mapcmd
only reports transport errors (mfi_send_frame returns 0 for ANY firmware
cmd_status != MFI_STAT_INVALID_STATUS), so every 64K dump chunk is
acknowledged even when the firmware never wrote it (faulted/removed PD) โ€”
savecore then believes an empty/corrupt dump (DF-5027 shape).

Fix: after the DMA unload, check pass->header.cmd_status/scsi_status and
return EIO so do_dump aborts instead of recording fake success.
(The LD twin, mfi_dump_blocks, has the identical omission โ€” mfi_disk
family follow-up.)

--- a/sys/dev/raid/mfi/mfi.c	2026-09-26 11:29:12.879998603 +0000
+++ b/sys/dev/raid/mfi/mfi.c	2026-09-26 11:32:39.393309345 +0000
@@ -2478,6 +2478,15 @@
 	bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap,
 	    BUS_DMASYNC_POSTWRITE);
 	bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
+	if (error == 0 && (pass->header.cmd_status != MFI_STAT_OK ||
+	    pass->header.scsi_status != 0)) {
+		/* DF-5050: mfi_mapcmd only reports transport errors */
+		device_printf(sc->mfi_dev, "syspd dump write rejected: "
+		    "cmd_status=%d scsi_status=%d\n",
+		    pass->header.cmd_status, pass->header.scsi_status);
+		mfi_release_command(cm);
+		return (EIO);
+	}
 	mfi_release_command(cm);
 
 	return (error);