svn commit: r250179 - head/sys/cam/scsi

Steven Hartland smh at FreeBSD.org
Thu May 2 14:14:58 UTC 2013


Author: smh
Date: Thu May  2 14:14:57 2013
New Revision: 250179
URL: http://svnweb.freebsd.org/changeset/base/250179

Log:
  Update probe flow so that devices with lbp can also disable disksort.
  
  Ensure that delete_available is reset so re-probes after a media change,
  to one with different delete characteristics, will result in the correct
  methods being flagged as available.
  
  Make all ccb state changes use a consistent flow:
  * free()
  * xpt_release_ccb()
  * softc->state = <new state>
  * xpt_schedule()
  
  Reviewed by:	mav
  Approved by:	pjd (mentor)
  MFC after:	1 week

Modified:
  head/sys/cam/scsi/scsi_da.c

Modified: head/sys/cam/scsi/scsi_da.c
==============================================================================
--- head/sys/cam/scsi/scsi_da.c	Thu May  2 13:34:40 2013	(r250178)
+++ head/sys/cam/scsi/scsi_da.c	Thu May  2 14:14:57 2013	(r250179)
@@ -2392,7 +2392,7 @@ out:
 
 		if (!scsi_vpd_supported_page(periph, SVPD_BLOCK_LIMITS)) {
 			/* Not supported skip to next probe */
-			softc->state = DA_STATE_PROBE_ATA;
+			softc->state = DA_STATE_PROBE_BDC;
 			goto skipstate;
 		}
 
@@ -2734,9 +2734,9 @@ dadone(struct cam_periph *periph, union 
 				 * with the short version of the command.
 				 */
 				if (maxsector == 0xffffffff) {
-					softc->state = DA_STATE_PROBE_RC16;
 					free(rdcap, M_SCSIDA);
 					xpt_release_ccb(done_ccb);
+					softc->state = DA_STATE_PROBE_RC16;
 					xpt_schedule(periph, priority);
 					return;
 				}
@@ -2838,9 +2838,9 @@ dadone(struct cam_periph *periph, union 
 				      (error_code == SSD_CURRENT_ERROR) &&
 				      (sense_key == SSD_KEY_ILLEGAL_REQUEST)))) {
 					softc->flags &= ~DA_FLAG_CAN_RC16;
-					softc->state = DA_STATE_PROBE_RC;
 					free(rdcap, M_SCSIDA);
 					xpt_release_ccb(done_ccb);
+					softc->state = DA_STATE_PROBE_RC;
 					xpt_schedule(periph, priority);
 					return;
 				} else
@@ -2897,36 +2897,39 @@ dadone(struct cam_periph *periph, union 
 						  &softc->sysctl_task);
 				xpt_announce_periph(periph, announce_buf);
 
-				if (lbp) {
-					/*
-					 * Based on older SBC-3 spec revisions
-					 * any of the UNMAP methods "may" be
-					 * available via LBP given this flag so
-					 * we flag all of them as availble and
-					 * then remove those which further
-					 * probes confirm aren't available
-					 * later.
-					 *
-					 * We could also check readcap(16) p_type
-					 * flag to exclude one or more invalid
-					 * write same (X) types here
-					 */
-					dadeleteflag(softc, DA_DELETE_WS16, 1);
-					dadeleteflag(softc, DA_DELETE_WS10, 1);
-					dadeleteflag(softc, DA_DELETE_ZERO, 1);
-					dadeleteflag(softc, DA_DELETE_UNMAP, 1);
-
-					softc->state = DA_STATE_PROBE_LBP;
-					xpt_release_ccb(done_ccb);
-					xpt_schedule(periph, priority);
-					return;
-				}
 			} else {
 				xpt_print(periph->path, "fatal error, "
 				    "could not acquire reference count\n");
 			}
 		}
 
+		/* Ensure re-probe doesn't see old delete. */
+		softc->delete_available = 0;
+		if (lbp) {
+			/*
+			 * Based on older SBC-3 spec revisions
+			 * any of the UNMAP methods "may" be
+			 * available via LBP given this flag so
+			 * we flag all of them as availble and
+			 * then remove those which further
+			 * probes confirm aren't available
+			 * later.
+			 *
+			 * We could also check readcap(16) p_type
+			 * flag to exclude one or more invalid
+			 * write same (X) types here
+			 */
+			dadeleteflag(softc, DA_DELETE_WS16, 1);
+			dadeleteflag(softc, DA_DELETE_WS10, 1);
+			dadeleteflag(softc, DA_DELETE_ZERO, 1);
+			dadeleteflag(softc, DA_DELETE_UNMAP, 1);
+
+			xpt_release_ccb(done_ccb);
+			softc->state = DA_STATE_PROBE_LBP;
+			xpt_schedule(periph, priority);
+			return;
+		}
+
 		xpt_release_ccb(done_ccb);
 		softc->state = DA_STATE_PROBE_BDC;
 		xpt_schedule(periph, priority);
@@ -2954,8 +2957,8 @@ dadone(struct cam_periph *periph, union 
 
 			if (lbp->flags & SVPD_LBP_UNMAP) {
 				free(lbp, M_SCSIDA);
-				softc->state = DA_STATE_PROBE_BLK_LIMITS;
 				xpt_release_ccb(done_ccb);
+				softc->state = DA_STATE_PROBE_BLK_LIMITS;
 				xpt_schedule(periph, priority);
 				return;
 			}
@@ -2984,7 +2987,7 @@ dadone(struct cam_periph *periph, union 
 
 		free(lbp, M_SCSIDA);
 		xpt_release_ccb(done_ccb);
-		softc->state = DA_STATE_PROBE_ATA;
+		softc->state = DA_STATE_PROBE_BDC;
 		xpt_schedule(periph, priority);
 		return;
 	}
@@ -3047,7 +3050,7 @@ dadone(struct cam_periph *periph, union 
 
 		free(block_limits, M_SCSIDA);
 		xpt_release_ccb(done_ccb);
-		softc->state = DA_STATE_PROBE_ATA;
+		softc->state = DA_STATE_PROBE_BDC;
 		xpt_schedule(periph, priority);
 		return;
 	}
@@ -3084,8 +3087,8 @@ dadone(struct cam_periph *periph, union 
 		}
 
 		free(bdc, M_SCSIDA);
-		softc->state = DA_STATE_PROBE_ATA;
 		xpt_release_ccb(done_ccb);
+		softc->state = DA_STATE_PROBE_ATA;
 		xpt_schedule(periph, priority);
 		return;
 	}


More information about the svn-src-head mailing list