Author: mav
Date: Tue Oct 23 15:20:59 2012
New Revision: 241939
URL: http://svn.freebsd.org/changeset/base/241939

Log:
  MFC r241410:
  There are SCSI conditions that are not an errors. In those cases cderror()
  returns zero while request status is not CAM_REQ_CMP.  That could cause
  partial device attach or other unexpected results.

Modified:
  stable/9/sys/cam/scsi/scsi_cd.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/cam/scsi/scsi_cd.c
==============================================================================
--- stable/9/sys/cam/scsi/scsi_cd.c     Tue Oct 23 15:18:16 2012        
(r241938)
+++ stable/9/sys/cam/scsi/scsi_cd.c     Tue Oct 23 15:20:59 2012        
(r241939)
@@ -1661,6 +1661,7 @@ cddone(struct cam_periph *periph, union 
                                               * bytes.
                                               */
                struct     cd_params *cdp;
+               int error;
 
                cdp = &softc->params;
 
@@ -1669,28 +1670,26 @@ cddone(struct cam_periph *periph, union 
                cdp->disksize = scsi_4btoul (rdcap->addr) + 1;
                cdp->blksize = scsi_4btoul (rdcap->length);
 
-               if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) {
+               /*
+                * Retry any UNIT ATTENTION type errors.  They
+                * are expected at boot.
+                */
+               if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP ||
+                   (error = cderror(done_ccb, CAM_RETRY_SELTO,
+                               SF_RETRY_UA | SF_NO_PRINT)) == 0) {
 
                        snprintf(announce_buf, sizeof(announce_buf),
                                "cd present [%lu x %lu byte records]",
                                cdp->disksize, (u_long)cdp->blksize);
 
                } else {
-                       int     error;
-                       /*
-                        * Retry any UNIT ATTENTION type errors.  They
-                        * are expected at boot.
-                        */
-                       error = cderror(done_ccb, CAM_RETRY_SELTO,
-                                       SF_RETRY_UA | SF_NO_PRINT);
                        if (error == ERESTART) {
                                /*
                                 * A retry was scheuled, so
                                 * just return.
                                 */
                                return;
-                       } else if (error != 0) {
-
+                       } else {
                                struct scsi_sense_data *sense;
                                int asc, ascq;
                                int sense_key, error_code;
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "[email protected]"

Reply via email to