[prev in list] [next in list] [prev in thread] [next in thread]
List: freebsd-scsi
Subject: Re: Problem with current sa(4) driver
From: J Wunsch <j () uriah ! heep ! sax ! de>
Date: 2001-04-18 20:53:55
[Download RAW message or body]
As Justin T. Gibbs wrote:
> While it is true that the sa driver should be filtering out this
> particular case because there is no error, returning ERESTART for
> NO_SENSE is also wrong. You should be able to fix that by changing
> the table entry for that sense code in cam_periph.c.
You mean, like this?
Index: cam_periph.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/cam_periph.c,v
retrieving revision 1.34
diff -c -r1.34 cam_periph.c
*** cam_periph.c 2001/04/04 18:24:35 1.34
--- cam_periph.c 2001/04/17 17:46:11
***************
*** 1369,1374 ****
--- 1369,1376 ----
switch (err_action & SS_MASK) {
case SS_NOP:
+ error = 0;
+ break;
case SS_RETRY:
action_string = "Retrying Command";
error = ERESTART;
Tried this, it fixes the problem with ILI's, sa(4) now properly
returns a short read. However, it uncovers a new bug that was just
waiting around...
% dd if=/dev/sa0 of=/dev/null bs=10k
dd: /dev/sa0: Input/output error
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1+0 records in
1+0 records out
10240 bytes transferred in 70.992489 secs (144 bytes/sec)
/var/log/messages says:
(sa0:sym0:0:1:0): READ(06). CDB: 8 0 0 28 0 0
(sa0:sym0:0:1:0): CAM Status: SCSI Status Error
(sa0:sym0:0:1:0): SCSI Status: Check Condition
(sa0:sym0:0:1:0): NO SENSE info:2800 asc:0,1
(sa0:sym0:0:1:0): Filemark detected
(sa0:sym0:0:1:0): Retries Exhausted
So now, when hitting the EOM filemark, we get an EIO. Again, this
looks like something where sa(4) should IMHO special-case the error
decision, instead of relying on cam_periph_error() to DTRT (which it
cannot).
I tried to manually patch the return value of cam_periph_error() to 0
in kgdb, but this just gets me back at the second problem:
% ps axl
UID PID PPID CPU PRI NI VSZ RSS WCHAN STAT TT TIME COMMAND
...
107 373 1 0 -8 0 244 33 cbwait DWE p0- 0:00.00 dd if=/dev/sa0 of=/dev/null bs=10
It sits there, and waits indefinately. I'm at a loss here to see why
this happens. :-(
> ERESTART means the error recovery code has already re-queued the
> CCB to retry the operation. By ignoring this code, you are telling
> the caller of saerror() to complete the command normally resulting in
> an eventual release of this particular ccb back to the free pool.
OK, understood, thanks for the explanation!
--
cheers, J"org .-.-. --... ...-- -.. . DL8DTL
http://www.sax.de/~joerg/ NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-scsi" in the body of the message
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic