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));
  }


_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to