Excellent work, thank you!

Scott


> On Aug 27, 2019, at 2:57 PM, Alexander Motin <m...@freebsd.org> wrote:
> 
> Some FreeNAS user reported panic after updating to newer version.  On
> the screenshot provided were several BUSY statuses for SATA disk on
> mps(4), followed by panic "Attempt to remove out-of-bounds index -1 from
> queue ...".  In his case I blame ancient LSI firmware or some broken
> hardware, but I was able to reproduce the panic on FreeBSD head debug
> kernel by hacking mps(4) driver to always report BUSY (appeared except
> IDENTIFY and REPORT LUNS).  To diagnose it I inserted assertion into
> xpt_free_ccb(), checking ccb->ccb_h.pinfo.index for values used for
> requests still in send queue.  Not sure it is to be persistent, but in
> this case it lead me directly to this place.
> 
> On 27.08.2019 16:23, Scott Long wrote:
>> This is very concerning, and I wonder if it’s the cause of the mystery 
>> use-after-free / double-complete that I’ve seen for years and have never 
>> been able to catch.  Can you say more about how you found it?
>> 
>> Scott
>> 
>> 
>>> On Aug 27, 2019, at 10:41 AM, Alexander Motin <m...@freebsd.org> wrote:
>>> 
>>> Author: mav
>>> Date: Tue Aug 27 16:41:06 2019
>>> New Revision: 351550
>>> URL: https://svnweb.freebsd.org/changeset/base/351550
>>> 
>>> Log:
>>> Always check cam_periph_error() status for ERESTART.
>>> 
>>> Even if we do not expect retries, we better be sure, since otherwise it
>>> may result in use after free kernel panic.  I've noticed that it retries
>>> SCSI_STATUS_BUSY even with SF_NO_RECOVERY | SF_NO_RETRY.
>>> 
>>> MFC after:  1 week
>>> Sponsored by:       iXsystems, Inc.
>>> 
>>> Modified:
>>> head/sys/cam/scsi/scsi_xpt.c
>>> 
>>> Modified: head/sys/cam/scsi/scsi_xpt.c
>>> ==============================================================================
>>> --- head/sys/cam/scsi/scsi_xpt.c    Tue Aug 27 15:42:08 2019        
>>> (r351549)
>>> +++ head/sys/cam/scsi/scsi_xpt.c    Tue Aug 27 16:41:06 2019        
>>> (r351550)
>>> @@ -1684,8 +1684,9 @@ probe_device_check:
>>>     case PROBE_TUR_FOR_NEGOTIATION:
>>>     case PROBE_DV_EXIT:
>>>             if (cam_ccb_status(done_ccb) != CAM_REQ_CMP) {
>>> -                   cam_periph_error(done_ccb, 0,
>>> -                       SF_NO_PRINT | SF_NO_RECOVERY | SF_NO_RETRY);
>>> +                   if (cam_periph_error(done_ccb, 0, SF_NO_PRINT |
>>> +                       SF_NO_RECOVERY | SF_NO_RETRY) == ERESTART)
>>> +                           goto outr;
>>>             }
>>>             if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
>>>                     /* Don't wedge the queue */
>>> @@ -1735,8 +1736,9 @@ probe_device_check:
>>>             struct ccb_scsiio *csio;
>>> 
>>>             if (cam_ccb_status(done_ccb) != CAM_REQ_CMP) {
>>> -                   cam_periph_error(done_ccb, 0,
>>> -                       SF_NO_PRINT | SF_NO_RECOVERY | SF_NO_RETRY);
>>> +                   if (cam_periph_error(done_ccb, 0, SF_NO_PRINT |
>>> +                       SF_NO_RECOVERY | SF_NO_RETRY) == ERESTART)
>>> +                           goto outr;
>>>             }
>>>             if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
>>>                     /* Don't wedge the queue */
>>> 
>> 
> 
> -- 
> Alexander Motin
> 

_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to