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

Andrew Thompson thompsa at FreeBSD.org
Thu Apr 9 21:10:35 PDT 2009


On Thu, Apr 09, 2009 at 08:48:01PM -0600, Scott Long wrote:
> I've never liked the root_mount_hold() thing, but I'll get into that
> below.  This patch is absolutely wrong for CAM.  I think it'll work
> on SIMs that set PIM_SEQSCAN, but it'll almost certainly cause
> root_mount_rel() to be called multiple times for drivers that don't
> set it, which is the vast majority of the drivers in the tree.  It
> looks like it works for umass because umass only allows 1 target to
> be probed on the bus.  But given the multiple reports to the mailing
> lists of failures caused by this revision, even if it works, it's
> only be accident.
> 
> So please back this out, it's causing numerous reports of unbootable
> systems.  I'm very happy to discuss the right way to get usb, umass,
> and CAM to configure themselves correctly into the boot sequence.  I'll
> even go so far as to help get the rest of GEOM and the graid stuff
> working right so we can kill this root_mount_hold() hack entirely.

Done. Thanks for the explanation, I am back from holiday next week and
will catch up.

Andrew

> 
> Andrew Thompson wrote:
>> 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-head mailing list