freebsd-skq/sys/cam/scsi
ken 477d3db78f Fix error recovery behavior in the pass(4) driver.
After FreeBSD SVN revision 236814, the pass(4) driver changed from
only doing error recovery when the CAM_PASS_ERR_RECOVER flag was
set on a CCB to sometimes doing error recovery if the passed in
retry count was non-zero.

Error recovery would happen if two conditions were met:

1.  The error recovery action was simply a retry.  (Which is most
    cases.)
2.  The retry_count is non-zero. (Which happened a lot because of
    cut-and-pasted code.)

This explains a bug I noticed in with camcontrol:

# camcontrol tur da34 -v
Unit is ready
# camcontrol reset da34
Reset of 1:172:0 was successful

At this point, there should be a Unit Attention:

# camcontrol tur da34 -v
Unit is ready

No Unit Attention.

Try it again:

# camcontrol reset da34
Reset of 1:172:0 was successful

Now set the retry_count to 0 for the TUR:

# camcontrol tur da34 -v -C 0
Unit is not ready
(pass42:mps1:0:172:0): TEST UNIT READY. CDB: 00 00 00 00 00 00
(pass42:mps1:0:172:0): CAM status: SCSI Status Error
(pass42:mps1:0:172:0): SCSI status: Check Condition
(pass42:mps1:0:172:0): SCSI sense: UNIT ATTENTION asc:29,2 (SCSI bus reset occurred)
(pass42:mps1:0:172:0): Field Replaceable Unit: 2

There is the unit attention. camcontrol(8) has a default
retry_count of 1, in case someone sets the -E flag without
setting -C.

The CAM_PASS_ERR_RECOVER behavior was only broken with the
CAMIOCOMMAND ioctl, which is the synchronous pass(4) API.  It has
worked as intended (error recovery is only done when the flag
is set) in the asynchronous API (CAMIOQUEUE ioctl).

sys/cam/scsi/scsi_pass.c:
	In passsendccb(), when calling cam_periph_runccb(), only
	specify the error routine when CAM_PASS_ERR_RECOVER is set.

share/man/man4/pass.4:
	Document that CAM_PASS_ERR_RECOVER is needed to enable
	error recovery.

Reported by:	Terry Kennedy <TERRY@glaver.org>
PR:		kern/218572
MFC after:	1 week
Sponsored by:	Spectra Logic
2017-05-03 20:59:47 +00:00
..
scsi_all.c Don't bother retrying errors for encrypted drives that are locked. 2017-05-03 14:53:27 +00:00
scsi_all.h Add infrastructure to the ATA and SCSI transports that supports 2017-04-19 15:04:52 +00:00
scsi_cd.c Add infrastructure to the ATA and SCSI transports that supports 2017-04-19 15:04:52 +00:00
scsi_cd.h Add CD/DVD Capabilities and Mechanical Status Page. 2015-09-29 09:09:37 +00:00
scsi_ch.c Release ccb if mode_buffer allocation fails. 2017-03-28 00:39:41 +00:00
scsi_ch.h sys/cam: spelling fixes in comments. 2016-04-29 21:05:48 +00:00
scsi_da.c Reorder the minimum_cmd_size code to make it a little smaller and 2017-04-20 20:46:34 +00:00
scsi_da.h Improve support for informational exceptions. 2016-12-19 10:25:47 +00:00
scsi_dvcfg.h
scsi_enc_internal.h Add infrastructure to the ATA and SCSI transports that supports 2017-04-19 15:04:52 +00:00
scsi_enc_safte.c Allow sleepable allocations in enclosure daemon threads. 2016-05-10 16:20:36 +00:00
scsi_enc_ses.c Make SES status updates more aggressive. 2016-11-29 13:48:36 +00:00
scsi_enc.c Add infrastructure to the ATA and SCSI transports that supports 2017-04-19 15:04:52 +00:00
scsi_enc.h Add API to obtain primary enclosure name and ID for /dev/sesX devices. 2015-11-21 10:22:01 +00:00
scsi_iu.h
scsi_low.c Remove dead mentions of CAM target mode APIs from drivers. 2017-02-19 17:27:58 +00:00
scsi_low.h sys/cam: spelling fixes in comments. 2016-04-29 21:05:48 +00:00
scsi_message.h Add partial support for QUERY TMF to CAM and isp(4). 2015-10-23 18:34:18 +00:00
scsi_pass.c Fix error recovery behavior in the pass(4) driver. 2017-05-03 20:59:47 +00:00
scsi_pass.h Add asynchronous command support to the pass(4) driver, and the new 2015-12-03 20:54:55 +00:00
scsi_pt.c Convert sys/cam to use make_dev_s(). 2016-01-07 20:22:55 +00:00
scsi_pt.h
scsi_sa.c Add label annotations to CAM sysctls. 2016-12-14 12:53:33 +00:00
scsi_sa.h Add the SCSI SSC Manufacturer assigned serial number VPD page. 2017-05-02 14:52:28 +00:00
scsi_ses.h Add support for EIIOE flag in Additional Element Status. 2016-11-07 18:21:53 +00:00
scsi_sg.c Convert sys/cam to use make_dev_s(). 2016-01-07 20:22:55 +00:00
scsi_sg.h Overhaul CAM SG driver IOCTL interfaces. 2014-06-02 19:53:53 +00:00
scsi_targ_bh.c
scsi_target.c Make pass, sg and targ drivers respect HBA's maxio. 2015-09-30 13:31:37 +00:00
scsi_targetio.h
scsi_xpt.c Add infrastructure to the ATA and SCSI transports that supports 2017-04-19 15:04:52 +00:00
smp_all.c sys: use our nitems() macro when param.h is available. 2016-04-21 19:40:10 +00:00
smp_all.h