Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Oct 2012 15:20:59 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r241939 - stable/9/sys/cam/scsi
Message-ID:  <201210231520.q9NFKx7N095418@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210231520.q9NFKx7N095418>