freebsd-dev/sys/cam/scsi
Joerg Wunsch fc89704c57 Fix the `tape drive spinning indefinately upon mt stat' problem.
With the recent changes in the CAM error handling, some problems in
the error handling of sa(4) have been uncovered.  Basically, a number
of conditions that are not actually errors have been mistreated as
genuine errors.  In particular:

. Trying to read in variable length mode with a mismatched blocksize
  between the on-tape (virtual) blocks and the read(2) supplied buffer
  size, causing an ILI SCSI condition, have caused an attempt to retry
  the supposedly `errored' transfer, causing the tape to be read
  continuously until it eventually hit EOM.  Since by default any
  simple mt(1) operation does an initial test read, an `mt stat' was
  sufficient to trigger this bug.

  Note that it's Justin's opinion that treating a NO SENSE as an EIO
  is another bug in CAM.  I feel not authorized to fix cam_periph.c
  without another confirmation that i'm on the right track, however.

. Hitting a filemark caused the read(2) syscall to return EIO, instead
  of returning a `short read'.  Note that the current fix only solves
  this problem in variable length mode.  Fixed length mode uses a
  different code path, and since i didn't grok all the intentions behind
  that handling, i did not touch it (IOW: it's still broken, and you get
  an EIO upon hitting a filemark).

The solution is to keep track of those conditions inside saerror(),
and upon completion to not call cam_periph_error() in that case.  We
need to make sure that the device gets unfrozen if needed though (in
case of actual errors, cam_periph_error() does this on our behalf).

Not objected by:       mjacob (who currently doesn't have the time to
			      review the patch)
2001-04-22 20:13:28 +00:00
..
scsi_all.c Rewrite of the CAM error recovery code. 2001-03-27 05:45:52 +00:00
scsi_all.h Rewrite of the CAM error recovery code. 2001-03-27 05:45:52 +00:00
scsi_cd.c Rewrite of the CAM error recovery code. 2001-03-27 05:45:52 +00:00
scsi_cd.h
scsi_ch.c Rewrite of the CAM error recovery code. 2001-03-27 05:45:52 +00:00
scsi_ch.h
scsi_da.c Last commit was broken.. It always prints '[CTRL-C to abort]'. 2001-03-28 01:37:29 +00:00
scsi_da.h
scsi_dvcfg.h
scsi_low_pisa.c
scsi_low_pisa.h
scsi_low.c o Support AUTO SENSE correctly. 2001-02-25 12:40:30 +00:00
scsi_low.h o Support AUTO SENSE correctly. 2001-02-25 12:40:30 +00:00
scsi_message.h
scsi_pass.c Rewrite of the CAM error recovery code. 2001-03-27 05:45:52 +00:00
scsi_pass.h Rewrite of the CAM error recovery code. 2001-03-27 05:45:52 +00:00
scsi_pt.c Rewrite of the CAM error recovery code. 2001-03-27 05:45:52 +00:00
scsi_pt.h
scsi_sa.c Fix the `tape drive spinning indefinately upon mt stat' problem. 2001-04-22 20:13:28 +00:00
scsi_sa.h
scsi_ses.c Rewrite of the CAM error recovery code. 2001-03-27 05:45:52 +00:00
scsi_ses.h
scsi_targ_bh.c Change the peripheral driver list from a linker set to module driven 2001-02-07 07:05:59 +00:00
scsi_target.c Send the remains (such as I have located) of "block major numbers" to 2001-03-26 12:41:29 +00:00
scsi_targetio.h