DF-5050 / fix.diff
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); |