Re2: usb panic

Matthew Dillon dillon at apollo.backplane.com
Tue Jan 13 14:23:49 PST 2004


    Try this patch.  I only give it a 50-50 chance of working... the 
    timeout I am trying to fix here is known to cause crashes, but the 
    timeout causing your crash could be a different timeout.  There are lots 
    of timeouts in the USB subsystem.

						-Matt

Index: umass/umass.c
===================================================================
RCS file: /cvs/src/sys/dev/usbmisc/umass/umass.c,v
retrieving revision 1.6
diff -u -r1.6 umass.c
--- umass/umass.c	30 Dec 2003 01:01:47 -0000	1.6
+++ umass/umass.c	13 Jan 2004 22:20:44 -0000
@@ -529,6 +529,7 @@
 	struct scsi_sense	cam_scsi_test_unit_ready;
 
 	int			maxlun;			/* maximum LUN number */
+	struct callout_handle	rescan_timeout;
 };
 
 #ifdef USB_DEBUG
@@ -2144,9 +2145,10 @@
 {
 	struct umass_softc *sc = (struct umass_softc *) addr;
 	struct cam_path *path;
-	union ccb *ccb = malloc(sizeof(union ccb), M_USBDEV, M_WAITOK);
+	union ccb *ccb;
 
-	memset(ccb, 0, sizeof(union ccb));
+	sc->rescan_timeout.callout = NULL;
+	ccb = malloc(sizeof(union ccb), M_USBDEV, M_WAITOK|M_ZERO);
 
 	DPRINTF(UDMASS_SCSI, ("scbus%d: scanning for %s:%d:%d:%d\n",
 		cam_sim_path(sc->umass_sim),
@@ -2179,17 +2181,15 @@
 			cam_sim_path(sc->umass_sim));
 
 	if (!cold) {
-		/* Notify CAM of the new device after 1 second delay. Any
+		/* 
+		 * Notify CAM of the new device after 1 second delay. Any
 		 * failure is benign, as the user can still do it by hand
 		 * (camcontrol rescan <busno>). Only do this if we are not
 		 * booting, because CAM does a scan after booting has
 		 * completed, when interrupts have been enabled.
 		 */
-
-		/* XXX This will bomb if the driver is unloaded between attach
-		 * and execution of umass_cam_rescan.
-		 */
-		timeout(umass_cam_rescan, sc, MS_TO_TICKS(200));
+		sc->rescan_timeout =
+			timeout(umass_cam_rescan, sc, MS_TO_TICKS(200));
 	}
 
 	return(0);	/* always succesfull */
@@ -2202,6 +2202,10 @@
 Static int
 umass_cam_detach_sim(struct umass_softc *sc)
 {
+	if (sc->rescan_timeout.callout) {
+		untimeout(umass_cam_rescan, sc, sc->rescan_timeout);
+		sc->rescan_timeout.callout = NULL;
+	}
 	if (sc->umass_sim) {
 		if (xpt_bus_deregister(cam_sim_path(sc->umass_sim)))
 			cam_sim_free(sc->umass_sim, /*free_devq*/TRUE);





More information about the Kernel mailing list