Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 4 Jul 2013 04:20:00 +0000 (UTC)
From:      Bryan Venteicher <bryanv@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r252680 - projects/virtio/sys/dev/virtio/scsi
Message-ID:  <201307040420.r644K031048570@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bryanv
Date: Thu Jul  4 04:19:59 2013
New Revision: 252680
URL: http://svnweb.freebsd.org/changeset/base/252680

Log:
  virtio_scsi: Fix SIM lock not owned panic
  
  The CAM locking requirements of registering an async
  callback has changed so the SIM lock must be held. Remove
  code that explicitly dropped the lock around the register.
  
  Also return CAM_SEL_TIMEOUT instead of CAM_TID_INVALID
  for bad targets to avoid a lot console spam during bus
  scans.

Modified:
  projects/virtio/sys/dev/virtio/scsi/virtio_scsi.c

Modified: projects/virtio/sys/dev/virtio/scsi/virtio_scsi.c
==============================================================================
--- projects/virtio/sys/dev/virtio/scsi/virtio_scsi.c	Thu Jul  4 03:24:58 2013	(r252679)
+++ projects/virtio/sys/dev/virtio/scsi/virtio_scsi.c	Thu Jul  4 04:19:59 2013	(r252680)
@@ -542,19 +542,14 @@ vtscsi_register_cam(struct vtscsi_softc 
 		goto fail;
 	}
 
-	VTSCSI_UNLOCK(sc);
-
-	/*
-	 * The async register apparently needs to be done without
-	 * the lock held, otherwise it can recurse on the lock.
-	 */
 	if (vtscsi_register_async(sc) != CAM_REQ_CMP) {
 		error = EIO;
 		device_printf(dev, "cannot register async callback\n");
-		VTSCSI_LOCK(sc);
 		goto fail;
 	}
 
+	VTSCSI_UNLOCK(sc);
+
 	return (0);
 
 fail:
@@ -622,8 +617,6 @@ vtscsi_register_async(struct vtscsi_soft
 {
 	struct ccb_setasync csa;
 
-	VTSCSI_LOCK_NOTOWNED(sc);
-
 	xpt_setup_ccb(&csa.ccb_h, sc->vtscsi_path, 5);
 	csa.ccb_h.func_code = XPT_SASYNC_CB;
 	csa.event_enable = AC_LOST_DEVICE | AC_FOUND_DEVICE;
@@ -1238,7 +1231,7 @@ vtscsi_scsi_cmd_cam_status(struct virtio
 		status = CAM_REQ_ABORTED;
 		break;
 	case VIRTIO_SCSI_S_BAD_TARGET:
-		status = CAM_TID_INVALID;
+		status = CAM_SEL_TIMEOUT;
 		break;
 	case VIRTIO_SCSI_S_RESET:
 		status = CAM_SCSI_BUS_RESET;



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