Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Apr 2011 11:23:50 +0300
From:      Alexander Motin <mav@FreeBSD.org>
To:        Kostik Belousov <kostikbel@gmail.com>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r221101 - in head/sys/geom: . concat journal mirror raid3 shsec stripe virstor
Message-ID:  <4DB7D296.7020300@FreeBSD.org>
In-Reply-To: <20110427080325.GV48734@deviant.kiev.zoral.com.ua>
References:  <201104270010.p3R0AQQv044866@svn.freebsd.org> <20110427080325.GV48734@deviant.kiev.zoral.com.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
Kostik Belousov wrote:
> 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 ?

Yes, we can and sometimes do. But the new GENERIC kernels in CURRENT
switch everything to the adaX.

> Wouldn't this hack then wreak the havoc ? Can the hack be put under the
> control of some tunable ?

I can't imagine useful situation when device name part of the hardcoded
provider name is important. Only partition name sometimes is.

-- 
Alexander Motin



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