svn commit: r190677 - in head/sys: cam geom

Andrew Thompson thompsa at FreeBSD.org
Fri Apr 3 12:49:34 PDT 2009


Author: thompsa
Date: Fri Apr  3 19:49:33 2009
New Revision: 190677
URL: http://svn.freebsd.org/changeset/base/190677

Log:
  Add interleaving root hold tokens from the CAM probe to disk_create and geom
  provider tasting. This is needed for disk attachments that happen after threads
  are running in the boot process.
  
  Tested by:	rnoland

Modified:
  head/sys/cam/cam_xpt.c
  head/sys/geom/geom.h
  head/sys/geom/geom_disk.c
  head/sys/geom/geom_disk.h
  head/sys/geom/geom_subr.c

Modified: head/sys/cam/cam_xpt.c
==============================================================================
--- head/sys/cam/cam_xpt.c	Fri Apr  3 19:46:12 2009	(r190676)
+++ head/sys/cam/cam_xpt.c	Fri Apr  3 19:49:33 2009	(r190677)
@@ -5139,6 +5139,7 @@ xpt_find_device(struct cam_et *target, l
 typedef struct {
 	union	ccb *request_ccb;
 	struct 	ccb_pathinq *cpi;
+	struct	root_hold_token	*roothold;
 	int	counter;
 } xpt_scan_bus_info;
 
@@ -5201,6 +5202,7 @@ xpt_scan_bus(struct cam_periph *periph, 
 		}
 		scan_info->request_ccb = request_ccb;
 		scan_info->cpi = &work_ccb->cpi;
+		scan_info->roothold = root_mount_hold("CAM", M_NOWAIT);
 
 		/* Cache on our stack so we can work asynchronously */
 		max_target = scan_info->cpi->max_target;
@@ -5232,6 +5234,7 @@ xpt_scan_bus(struct cam_periph *periph, 
 				printf("xpt_scan_bus: xpt_create_path failed"
 				       " with status %#x, bus scan halted\n",
 				       status);
+				root_mount_rel(scan_info->roothold);
 				free(scan_info, M_CAMXPT);
 				request_ccb->ccb_h.status = status;
 				xpt_free_ccb(work_ccb);
@@ -5240,6 +5243,7 @@ xpt_scan_bus(struct cam_periph *periph, 
 			}
 			work_ccb = xpt_alloc_ccb_nowait();
 			if (work_ccb == NULL) {
+				root_mount_rel(scan_info->roothold);
 				free(scan_info, M_CAMXPT);
 				xpt_free_path(path);
 				request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
@@ -5353,6 +5357,7 @@ xpt_scan_bus(struct cam_periph *periph, 
 				xpt_free_ccb(request_ccb);
 				xpt_free_ccb((union ccb *)scan_info->cpi);
 				request_ccb = scan_info->request_ccb;
+				root_mount_rel(scan_info->roothold);
 				free(scan_info, M_CAMXPT);
 				request_ccb->ccb_h.status = CAM_REQ_CMP;
 				xpt_done(request_ccb);
@@ -5372,6 +5377,7 @@ xpt_scan_bus(struct cam_periph *periph, 
 				xpt_free_ccb(request_ccb);
 				xpt_free_ccb((union ccb *)scan_info->cpi);
 				request_ccb = scan_info->request_ccb;
+				root_mount_rel(scan_info->roothold);
 				free(scan_info, M_CAMXPT);
 				request_ccb->ccb_h.status = status;
 				xpt_done(request_ccb);

Modified: head/sys/geom/geom.h
==============================================================================
--- head/sys/geom/geom.h	Fri Apr  3 19:46:12 2009	(r190676)
+++ head/sys/geom/geom.h	Fri Apr  3 19:49:33 2009	(r190677)
@@ -193,6 +193,8 @@ struct g_provider {
 	/* Two fields for the implementing class to use */
 	void			*private;
 	u_int			index;
+
+	struct root_hold_token	*roothold;
 };
 
 /* geom_dev.c */

Modified: head/sys/geom/geom_disk.c
==============================================================================
--- head/sys/geom/geom_disk.c	Fri Apr  3 19:46:12 2009	(r190676)
+++ head/sys/geom/geom_disk.c	Fri Apr  3 19:49:33 2009	(r190677)
@@ -381,6 +381,7 @@ g_disk_create(void *arg, int flag)
 		printf("GEOM: new disk %s\n", gp->name);
 	dp->d_geom = gp;
 	g_error_provider(pp, 0);
+	root_mount_rel(dp->d_roothold);
 }
 
 static void
@@ -467,6 +468,7 @@ disk_create(struct disk *dp, int version
 		    dp->d_sectorsize, DEVSTAT_ALL_SUPPORTED,
 		    DEVSTAT_TYPE_DIRECT, DEVSTAT_PRIORITY_MAX);
 	dp->d_geom = NULL;
+	dp->d_roothold = root_mount_hold(dp->d_name, M_WAITOK);
 	g_disk_ident_adjust(dp->d_ident, sizeof(dp->d_ident));
 	g_post_event(g_disk_create, dp, M_WAITOK, dp, NULL);
 }

Modified: head/sys/geom/geom_disk.h
==============================================================================
--- head/sys/geom/geom_disk.h	Fri Apr  3 19:46:12 2009	(r190676)
+++ head/sys/geom/geom_disk.h	Fri Apr  3 19:49:33 2009	(r190677)
@@ -88,6 +88,8 @@ struct disk {
 
 	/* Fields private to the driver */
 	void			*d_drv1;
+
+	struct root_hold_token	*d_roothold;
 };
 
 #define DISKFLAG_NEEDSGIANT	0x1

Modified: head/sys/geom/geom_subr.c
==============================================================================
--- head/sys/geom/geom_subr.c	Fri Apr  3 19:46:12 2009	(r190676)
+++ head/sys/geom/geom_subr.c	Fri Apr  3 19:49:33 2009	(r190677)
@@ -545,6 +545,10 @@ g_new_provider_event(void *arg, int flag
 		mp->taste(mp, pp, 0);
 		g_topology_assert();
 	}
+	if (pp->roothold != NULL) {
+		root_mount_rel(pp->roothold);
+		pp->roothold = NULL;
+	}
 }
 
 
@@ -581,6 +585,7 @@ g_new_providerf(struct g_geom *gp, const
 	pp->stat = devstat_new_entry(pp, -1, 0, DEVSTAT_ALL_SUPPORTED,
 	    DEVSTAT_TYPE_DIRECT, DEVSTAT_PRIORITY_MAX);
 	LIST_INSERT_HEAD(&gp->provider, pp, provider);
+	pp->roothold = root_mount_hold(pp->name, M_WAITOK);
 	g_post_event(g_new_provider_event, pp, M_WAITOK, pp, gp, NULL);
 	return (pp);
 }


More information about the svn-src-all mailing list