svn commit: r272654 - stable/10/sys/dev/iscsi_initiator

Alexander Motin mav at FreeBSD.org
Mon Oct 6 15:11:09 UTC 2014


Author: mav
Date: Mon Oct  6 15:11:08 2014
New Revision: 272654
URL: https://svnweb.freebsd.org/changeset/base/272654

Log:
  MFC r272308: Fix old iSCSI initiator to work with new CAM locking.
  
  This switches code to using xpt_rescan() routine, irrelevant to locking.
  Using xpt_action() directly requires knowledge about higher level locks,
  that SIM does not need to have.
  
  This code is obsolete, but that is not a reason to crash.

Modified:
  stable/10/sys/dev/iscsi_initiator/isc_cam.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/iscsi_initiator/isc_cam.c
==============================================================================
--- stable/10/sys/dev/iscsi_initiator/isc_cam.c	Mon Oct  6 15:03:08 2014	(r272653)
+++ stable/10/sys/dev/iscsi_initiator/isc_cam.c	Mon Oct  6 15:11:08 2014	(r272654)
@@ -125,7 +125,7 @@ scan_callback(struct cam_periph *periph,
 
      debug_called(8);
 
-     free(ccb, M_TEMP);
+     xpt_free_ccb(ccb);
 
      if(sp->flags & ISC_SCANWAIT) {
 	  sp->flags &= ~ISC_SCANWAIT;
@@ -141,30 +141,15 @@ ic_scan(isc_session_t *sp)
      debug_called(8);
      sdebug(2, "scanning sid=%d", sp->sid);
 
-     if((ccb = malloc(sizeof(union ccb), M_TEMP, M_WAITOK | M_ZERO)) == NULL) {
-	  xdebug("scan failed (can't allocate CCB)");
-	  return ENOMEM; // XXX
-     }
-
      sp->flags &= ~ISC_CAMDEVS;
      sp->flags |= ISC_SCANWAIT;
 
-     CAM_LOCK(sp);
-     if(xpt_create_path(&sp->cam_path, NULL, cam_sim_path(sp->cam_sim),
-			0, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
-	  xdebug("can't create cam path");
-	  CAM_UNLOCK(sp);
-	  free(ccb, M_TEMP);
-	  return ENODEV; // XXX
-     }
-     xpt_setup_ccb(&ccb->ccb_h, sp->cam_path, 5/*priority (low)*/);
-     ccb->ccb_h.func_code	= XPT_SCAN_BUS;
+     ccb = xpt_alloc_ccb();
+     ccb->ccb_h.path		= sp->cam_path;
      ccb->ccb_h.cbfcnp		= scan_callback;
-     ccb->crcn.flags		= CAM_FLAG_NONE;
      ccb->ccb_h.spriv_ptr0	= sp;
 
-     xpt_action(ccb);
-     CAM_UNLOCK(sp);
+     xpt_rescan(ccb);
 
      while(sp->flags & ISC_SCANWAIT)
 	  tsleep(sp, PRIBIO, "ffp", 5*hz); // the timeout time should
@@ -374,6 +359,16 @@ ic_init(isc_session_t *sp)
 	  return ENXIO;
      }
      sp->cam_sim = sim;
+     if(xpt_create_path(&sp->cam_path, NULL, cam_sim_path(sp->cam_sim),
+	    CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
+	  xpt_bus_deregister(cam_sim_path(sp->cam_sim));
+	  cam_sim_free(sim, /*free_devq*/TRUE);
+	  CAM_UNLOCK(sp);
+#if __FreeBSD_version >= 700000
+	  mtx_destroy(&sp->cam_mtx);
+#endif
+	  return ENXIO;
+     }
      CAM_UNLOCK(sp);
 
      sdebug(1, "cam subsystem initialized");


More information about the svn-src-all mailing list