Date: Mon, 02 Feb 2015 12:28:47 -0800 From: Nathan Whitehorn <nwhitehorn@freebsd.org> To: Alexander Motin <mav@freebsd.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r278111 - in head/sys/cam: . scsi Message-ID: <54CFDDFF.7060708@freebsd.org> In-Reply-To: <201502022023.t12KN6ir069698@svn.freebsd.org> References: <201502022023.t12KN6ir069698@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
You may want to look at PR 195479 on this topic. Does this also turn off the infinite console spam? -Nathan On 02/02/15 12:23, Alexander Motin wrote: > Author: mav > Date: Mon Feb 2 20:23:05 2015 > New Revision: 278111 > URL: https://svnweb.freebsd.org/changeset/base/278111 > > Log: > Retry indefinitely on SCSI BUSY status from VMware disks and CDs. > > VMware returns BUSY status when storage has transient connectivity issues. > It is often better to wait and let VM admin fix the problem then crash. > > Discussed with: ken > MFC after: 1 week > > Modified: > head/sys/cam/cam.h > head/sys/cam/cam_periph.c > head/sys/cam/scsi/scsi_cd.c > head/sys/cam/scsi/scsi_da.c > > Modified: head/sys/cam/cam.h > ============================================================================== > --- head/sys/cam/cam.h Mon Feb 2 20:18:47 2015 (r278110) > +++ head/sys/cam/cam.h Mon Feb 2 20:23:05 2015 (r278111) > @@ -121,7 +121,8 @@ enum { > SF_QUIET_IR = 0x04, /* Be quiet about Illegal Request reponses */ > SF_PRINT_ALWAYS = 0x08, /* Always print error status. */ > SF_NO_RECOVERY = 0x10, /* Don't do active error recovery. */ > - SF_NO_RETRY = 0x20 /* Don't do any retries. */ > + SF_NO_RETRY = 0x20, /* Don't do any retries. */ > + SF_RETRY_BUSY = 0x40 /* Retry BUSY status. */ > }; > > /* CAM Status field values */ > > Modified: head/sys/cam/cam_periph.c > ============================================================================== > --- head/sys/cam/cam_periph.c Mon Feb 2 20:18:47 2015 (r278110) > +++ head/sys/cam/cam_periph.c Mon Feb 2 20:23:05 2015 (r278111) > @@ -1359,8 +1359,8 @@ camperiphscsistatuserror(union ccb *ccb, > * Restart the queue after either another > * command completes or a 1 second timeout. > */ > - if (ccb->ccb_h.retry_count > 0) { > - ccb->ccb_h.retry_count--; > + if ((sense_flags & SF_RETRY_BUSY) != 0 || > + (ccb->ccb_h.retry_count--) > 0) { > error = ERESTART; > *relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT > | RELSIM_RELEASE_AFTER_CMDCMPLT; > > Modified: head/sys/cam/scsi/scsi_cd.c > ============================================================================== > --- head/sys/cam/scsi/scsi_cd.c Mon Feb 2 20:18:47 2015 (r278110) > +++ head/sys/cam/scsi/scsi_cd.c Mon Feb 2 20:23:05 2015 (r278111) > @@ -87,14 +87,16 @@ typedef enum { > CD_Q_NONE = 0x00, > CD_Q_NO_TOUCH = 0x01, > CD_Q_BCD_TRACKS = 0x02, > - CD_Q_10_BYTE_ONLY = 0x10 > + CD_Q_10_BYTE_ONLY = 0x10, > + CD_Q_RETRY_BUSY = 0x40 > } cd_quirks; > > #define CD_Q_BIT_STRING \ > "\020" \ > "\001NO_TOUCH" \ > "\002BCD_TRACKS" \ > - "\00510_BYTE_ONLY" > + "\00510_BYTE_ONLY" \ > + "\007RETRY_BUSY" > > typedef enum { > CD_FLAG_INVALID = 0x0001, > @@ -189,6 +191,14 @@ static struct cd_quirk_entry cd_quirk_ta > { > { T_CDROM, SIP_MEDIA_REMOVABLE, "CHINON", "CD-ROM CDS-535","*"}, > /* quirks */ CD_Q_BCD_TRACKS > + }, > + { > + /* > + * VMware returns BUSY status when storage has transient > + * connectivity problems, so better wait. > + */ > + {T_CDROM, SIP_MEDIA_REMOVABLE, "NECVMWar", "VMware IDE CDR10", "*"}, > + /*quirks*/ CD_Q_RETRY_BUSY > } > }; > > @@ -2581,6 +2591,9 @@ cderror(union ccb *ccb, u_int32_t cam_fl > * don't treat UAs as errors. > */ > sense_flags |= SF_RETRY_UA; > + > + if (softc->quirks & CD_Q_RETRY_BUSY) > + sense_flags |= SF_RETRY_BUSY; > return (cam_periph_error(ccb, cam_flags, sense_flags, > &softc->saved_ccb)); > } > > Modified: head/sys/cam/scsi/scsi_da.c > ============================================================================== > --- head/sys/cam/scsi/scsi_da.c Mon Feb 2 20:18:47 2015 (r278110) > +++ head/sys/cam/scsi/scsi_da.c Mon Feb 2 20:23:05 2015 (r278111) > @@ -101,7 +101,8 @@ typedef enum { > DA_Q_NO_PREVENT = 0x04, > DA_Q_4K = 0x08, > DA_Q_NO_RC16 = 0x10, > - DA_Q_NO_UNMAP = 0x20 > + DA_Q_NO_UNMAP = 0x20, > + DA_Q_RETRY_BUSY = 0x40 > } da_quirks; > > #define DA_Q_BIT_STRING \ > @@ -110,7 +111,9 @@ typedef enum { > "\002NO_6_BYTE" \ > "\003NO_PREVENT" \ > "\0044K" \ > - "\005NO_RC16" > + "\005NO_RC16" \ > + "\006NO_UNMAP" \ > + "\007RETRY_BUSY" > > typedef enum { > DA_CCB_PROBE_RC = 0x01, > @@ -359,6 +362,14 @@ static struct da_quirk_entry da_quirk_ta > {T_DIRECT, SIP_MEDIA_FIXED, "STEC", "*", "*"}, > /*quirks*/ DA_Q_NO_UNMAP > }, > + { > + /* > + * VMware returns BUSY status when storage has transient > + * connectivity problems, so better wait. > + */ > + {T_DIRECT, SIP_MEDIA_FIXED, "VMware", "Virtual disk", "*"}, > + /*quirks*/ DA_Q_RETRY_BUSY > + }, > /* USB mass storage devices supported by umass(4) */ > { > /* > @@ -3630,6 +3641,9 @@ daerror(union ccb *ccb, u_int32_t cam_fl > * don't treat UAs as errors. > */ > sense_flags |= SF_RETRY_UA; > + > + if (softc->quirks & DA_Q_RETRY_BUSY) > + sense_flags |= SF_RETRY_BUSY; > return(cam_periph_error(ccb, cam_flags, sense_flags, > &softc->saved_ccb)); > } >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?54CFDDFF.7060708>