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.
This commit is contained in:
Alexander Motin 2011-04-27 00:10:26 +00:00
parent cec9f109bb
commit 90f2be2430
9 changed files with 53 additions and 10 deletions

View File

@ -678,7 +678,8 @@ g_concat_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
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);

View File

@ -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);

View File

@ -1017,6 +1017,43 @@ g_getattr__(const char *attr, struct g_consumer *cp, void *var, int len)
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);
}
#if defined(DIAGNOSTIC) || defined(DDB)
/*
* This function walks the mesh and returns a non-zero integer if it

View File

@ -2527,7 +2527,8 @@ g_journal_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
return (NULL);
gp = NULL;
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 != 0 && md.md_provsize != pp->mediasize)
return (NULL);

View File

@ -3007,7 +3007,8 @@ g_mirror_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
return (NULL);
gp = NULL;
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 != 0 && md.md_provsize != pp->mediasize)
return (NULL);

View File

@ -3329,7 +3329,8 @@ g_raid3_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
return (NULL);
gp = NULL;
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 != 0 && md.md_provsize != pp->mediasize)
return (NULL);

View File

@ -673,7 +673,8 @@ g_shsec_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
if (md.md_version < 1)
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);

View File

@ -952,7 +952,8 @@ g_stripe_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
if (md.md_version < 3)
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);

View File

@ -809,10 +809,9 @@ g_virstor_taste(struct g_class *mp, struct g_provider *pp, int flags)
/* If the provider name is hardcoded, use the offered provider only
* if it's been offered with its proper name (the one used in
* the label command). */
if (md.provider[0] != '\0') {
if (strcmp(md.provider, pp->name) != 0)
return (NULL);
}
if (md.provider[0] != '\0' &&
!g_compare_names(md.provider, pp->name))
return (NULL);
/* Iterate all geoms this class already knows about to see if a new
* geom instance of this class needs to be created (in case the provider