Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Jul 2015 15:49:29 -0400
From:      "Kenneth D. Merry" <ken@FreeBSD.ORG>
To:        Alexander Motin <mav@FreeBSD.org>
Cc:        Kohji Okuno <okuno.kohji@jp.panasonic.com>, freebsd-current@freebsd.org
Subject:   Re: Why shoud we cause panic in scsi_da.c?
Message-ID:  <20150714194929.GA51157@doriath.kdm.org>
In-Reply-To: <55A3D960.5000704@FreeBSD.org>
References:  <20150709.150520.1823457260978955949.okuno.kohji@jp.panasonic.com> <20150713.171110.531869520391748650.okuno.kohji@jp.panasonic.com> <55A37933.3000802@selasky.org> <20150713.175143.290106286605820529.okuno.kohji@jp.panasonic.com> <55A3D960.5000704@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Jul 13, 2015 at 18:29:36 +0300, Alexander Motin wrote:
> Hi.
> 
> On 13.07.2015 11:51, Kohji Okuno wrote:
> >> On 07/13/15 10:11, Kohji Okuno wrote:
> >>> Could you comment on my quesion?
> >>>
> >>>> I found panic() in scsi_da.c. Please find the following.
> >>>> I think we should return with error without panic().
> >>>> What do you think about this?
> >>>>
> >>>> scsi_da.c:
> >>>> 3018	                } else if (bp != NULL) {
> >>>> 3019 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0)
> >>>> 3020	                                panic("REQ_CMP with QFRZN");
> >>>>
> >>
> >> It looks to me more like an KASSERT() is appropriate here.
> 
> As I can see, this panic() call was added by ken@ about 15 years ago.
> I've added him to CC in case he has some idea why it was done. From my
> personal opinion I don't see much reasons to allow CAM_DEV_QFRZN to be
> returned only together with error. While is may have little sense in
> case of successful command completion, I don't think it should be
> treated as error. Simply removing this panic is probably a bad idea,
> since if it happens device will just remain frozen forever, that will be
> will be difficult to diagnose, but I would better just dropped device
> freeze in that case same as in case of completion with error.

I put it there because it indicates a software error.  The queue shouldn't
be frozen if the command is successful.  The reason for freezing the queue
is to allow error recovery to happen.  The queue will get unfrozen after
error recovery completes.

We could alternately just print a diagnostic message, unfreeze the queue
and move on, but the idea is to allow the driver writer to detect and
correct his error immediately.

As for the original poster's problem, he has uncovered a bug that needs to
be fixed.  (And I don't mean in the da(4) driver.  The bug is in the
component that left the queue frozen.  Most likely in the USB driver, but
it will take a little more investigation.)  The panic worked as intended. :)

Ken
-- 
Kenneth Merry
ken@FreeBSD.ORG



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150714194929.GA51157>