Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Apr 2014 20:19:01 +0000 (UTC)
From:      Sean Bruno <sbruno@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r264354 - head/sys/dev/ciss
Message-ID:  <201404112019.s3BKJ1Px026708@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sbruno
Date: Fri Apr 11 20:19:01 2014
New Revision: 264354
URL: http://svnweb.freebsd.org/changeset/base/264354

Log:
  Fix insta-panic on assert of unlocked periph mtx in ciss(4) when
  logical volume state changes.
  
  Currently, I view this as a critical fix for users and will MFC this rapidly as
  my testing has shown data loss when the disk is failed by removing it when
  under some amount of write activity and this code panics the box.
  
  Reviewed by:	mav@ scottl@
  MFC after:	3 days
  Sponsored by:	Yahoo! Inc.

Modified:
  head/sys/dev/ciss/ciss.c

Modified: head/sys/dev/ciss/ciss.c
==============================================================================
--- head/sys/dev/ciss/ciss.c	Fri Apr 11 20:15:53 2014	(r264353)
+++ head/sys/dev/ciss/ciss.c	Fri Apr 11 20:19:01 2014	(r264354)
@@ -180,8 +180,6 @@ static int	ciss_cam_emulate(struct ciss_
 static void	ciss_cam_poll(struct cam_sim *sim);
 static void	ciss_cam_complete(struct ciss_request *cr);
 static void	ciss_cam_complete_fixup(struct ciss_softc *sc, struct ccb_scsiio *csio);
-static struct cam_periph *ciss_find_periph(struct ciss_softc *sc,
-					   int bus, int target);
 static int	ciss_name_device(struct ciss_softc *sc, int bus, int target);
 
 /* periodic status monitoring */
@@ -3413,27 +3411,6 @@ ciss_cam_complete_fixup(struct ciss_soft
 
 
 /********************************************************************************
- * Find a peripheral attached at (target)
- */
-static struct cam_periph *
-ciss_find_periph(struct ciss_softc *sc, int bus, int target)
-{
-    struct cam_periph	*periph;
-    struct cam_path	*path;
-    int			status;
-
-    status = xpt_create_path(&path, NULL, cam_sim_path(sc->ciss_cam_sim[bus]),
-			     target, 0);
-    if (status == CAM_REQ_CMP) {
-	periph = cam_periph_find(path, NULL);
-	xpt_free_path(path);
-    } else {
-	periph = NULL;
-    }
-    return(periph);
-}
-
-/********************************************************************************
  * Name the device at (target)
  *
  * XXX is this strictly correct?
@@ -3442,12 +3419,22 @@ static int
 ciss_name_device(struct ciss_softc *sc, int bus, int target)
 {
     struct cam_periph	*periph;
+    struct cam_path	*path;
+    int			status;
 
     if (CISS_IS_PHYSICAL(bus))
 	return (0);
-    if ((periph = ciss_find_periph(sc, bus, target)) != NULL) {
+
+    status = xpt_create_path(&path, NULL, cam_sim_path(sc->ciss_cam_sim[bus]),
+			     target, 0);
+
+    if (status == CAM_REQ_CMP) {
+	xpt_path_lock(path);
+	periph = cam_periph_find(path, NULL);
 	sprintf(sc->ciss_logical[bus][target].cl_name, "%s%d",
 		periph->periph_name, periph->unit_number);
+	xpt_path_unlock(path);
+	xpt_free_path(path);
 	return(0);
     }
     sc->ciss_logical[bus][target].cl_name[0] = 0;



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