svn commit: r221101 - in head/sys/geom: . concat journal mirror raid3 shsec stripe virstor

Kostik Belousov kostikbel at gmail.com
Wed Apr 27 08:03:50 UTC 2011


On Wed, Apr 27, 2011 at 12:10:26AM +0000, Alexander Motin wrote:
> Author: mav
> Date: Wed Apr 27 00:10:26 2011
> New Revision: 221101
> URL: http://svn.freebsd.org/changeset/base/221101
> 
> Log:
>   Implement relaxed comparision for hardcoded provider names to make it
>   ignore adX/adaY difference in both directions to simplify migration to
>   the CAM-based ATA or back.
> 
> Modified:
>   head/sys/geom/concat/g_concat.c
>   head/sys/geom/geom.h
>   head/sys/geom/geom_subr.c
>   head/sys/geom/journal/g_journal.c
>   head/sys/geom/mirror/g_mirror.c
>   head/sys/geom/raid3/g_raid3.c
>   head/sys/geom/shsec/g_shsec.c
>   head/sys/geom/stripe/g_stripe.c
>   head/sys/geom/virstor/g_virstor.c
> 
> Modified: head/sys/geom/concat/g_concat.c
> ==============================================================================
> --- head/sys/geom/concat/g_concat.c	Tue Apr 26 23:00:32 2011	(r221100)
> +++ head/sys/geom/concat/g_concat.c	Wed Apr 27 00:10:26 2011	(r221101)
> @@ -678,7 +678,8 @@ g_concat_taste(struct g_class *mp, struc
>  	if (md.md_version < 4)
>  		md.md_provsize = pp->mediasize;
>  
> -	if (md.md_provider[0] != '\0' && strcmp(md.md_provider, pp->name) != 0)
> +	if (md.md_provider[0] != '\0' &&
> +	    !g_compare_names(md.md_provider, pp->name))
>  		return (NULL);
>  	if (md.md_provsize != pp->mediasize)
>  		return (NULL);
> 
> Modified: head/sys/geom/geom.h
> ==============================================================================
> --- head/sys/geom/geom.h	Tue Apr 26 23:00:32 2011	(r221100)
> +++ head/sys/geom/geom.h	Wed Apr 27 00:10:26 2011	(r221101)
> @@ -238,6 +238,7 @@ void g_waitidlelock(void);
>  /* geom_subr.c */
>  int g_access(struct g_consumer *cp, int nread, int nwrite, int nexcl);
>  int g_attach(struct g_consumer *cp, struct g_provider *pp);
> +int g_compare_names(const char *namea, const char *nameb);
>  void g_destroy_consumer(struct g_consumer *cp);
>  void g_destroy_geom(struct g_geom *pp);
>  void g_destroy_provider(struct g_provider *pp);
> 
> Modified: head/sys/geom/geom_subr.c
> ==============================================================================
> --- head/sys/geom/geom_subr.c	Tue Apr 26 23:00:32 2011	(r221100)
> +++ head/sys/geom/geom_subr.c	Wed Apr 27 00:10:26 2011	(r221101)
> @@ -1017,6 +1017,43 @@ g_getattr__(const char *attr, struct g_c
>  	return (0);
>  }
>  
> +static int
> +g_get_device_prefix_len(const char *name)
> +{
> +	int len;
> +
> +	if (strncmp(name, "ada", 3) == 0)
> +		len = 3;
> +	else if (strncmp(name, "ad", 2) == 0)
> +		len = 2;
> +	else
> +		return (0);
> +	if (name[len] < '0' || name[len] > '9')
> +		return (0);
> +	do {
> +		len++;
> +	} while (name[len] >= '0' && name[len] <= '9');
> +	return (len);
> +}
> +
> +int
> +g_compare_names(const char *namea, const char *nameb)
> +{
> +	int deva, devb;
> +
> +	if (strcmp(namea, nameb) == 0)
> +		return (1);
> +	deva = g_get_device_prefix_len(namea);
> +	if (deva == 0)
> +		return (0);
> +	devb = g_get_device_prefix_len(nameb);
> +	if (devb == 0)
> +		return (0);
> +	if (strcmp(namea + deva, nameb + devb) == 0)
> +		return (1);
> +	return (0);
> +}
> +
This is most likely my misunderstanding of things.

Can we have a legitimate situation where both ada* and ad* devices coexist
on the same system ? E.g. on-board AHCI and legacy PATA controller ?

Wouldn't this hack then wreak the havoc ? Can the hack be put under the
control of some tunable ?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/svn-src-all/attachments/20110427/b9fe3960/attachment.pgp


More information about the svn-src-all mailing list