Pull up following revision(s) (requested by buhrow in ticket #1916):

sys/dev/pci/mpii.c: revision 1.30

Fixes for PR kern/57133:

I can now explain why this assert is firing and have a fix for it.  It is a  regression introduced in R1.22 of mpii.c.

        If a request comes in and the IOC returns a MPII_SCSIIO_STATUS_CHECK_COND condition, after
 a successful transfer, or one that is a recovered error,
 mpii(4) correctly sets the xs->error to XS_SENSE, but incorrectly sets xs->resid to 0 before
 returning the xfer to the upper scsi layers.  Once the upper layers get it, they notice the
 XS_SENSE check condition and because it's a retryable error, they increment xs_requeuecnt, set
 ERESTART and send the xfer request down to the mpii(4) layer again for a retry. What they do
 not do is reset xs->resid equal to xs->datalen.  When the xfer comes down to mpii(4) again, the
 assert happens.  The fix is for the mpii(4) driver to leave xs->resid alone when it encounters
 a MPII_SCSIIO_STATUS_CHECK_COND condition.

This bug affects NetBSD-10, netbsd-9 and netbsd-8.
This commit is contained in:
martin 2023-10-26 15:13:38 +00:00
parent 18d3054374
commit d16ec04f8a
1 changed files with 2 additions and 4 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: mpii.c,v 1.8.10.7 2022/09/29 14:38:24 snj Exp $ */
/* $NetBSD: mpii.c,v 1.8.10.8 2023/10/26 15:13:38 martin Exp $ */
/* OpenBSD: mpii.c,v 1.115 2012/04/11 13:29:14 naddy Exp */
/*
* Copyright (c) 2010 Mike Belopuhov <mkb@crypt.org.ru>
@ -20,7 +20,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: mpii.c,v 1.8.10.7 2022/09/29 14:38:24 snj Exp $");
__KERNEL_RCSID(0, "$NetBSD: mpii.c,v 1.8.10.8 2023/10/26 15:13:38 martin Exp $");
#include "bio.h"
@ -3225,7 +3225,6 @@ mpii_scsi_cmd_done(struct mpii_ccb *ccb)
}
KASSERT(xs->error == XS_NOERROR);
KASSERT(xs->resid == xs->datalen);
KASSERT(xs->status == SCSI_OK);
if (ccb->ccb_rcb == NULL) {
@ -3284,7 +3283,6 @@ mpii_scsi_cmd_done(struct mpii_ccb *ccb)
break;
case MPII_SCSIIO_STATUS_CHECK_COND:
xs->resid = 0;
xs->error = XS_SENSE;
break;