diff options
author | Alexander Motin <mav@FreeBSD.org> | 2011-04-27 00:10:26 +0000 |
---|---|---|
committer | Alexander Motin <mav@FreeBSD.org> | 2011-04-27 00:10:26 +0000 |
commit | 90f2be24301fc6b17fcba2ec8f236cc0f0da607e (patch) | |
tree | 5ef8db534c3e8ba0bf7276c5dc63282d3f429e66 /sys/geom/geom_subr.c | |
parent | cec9f109bb610c8304e08adc7d6ad229b6bcfcdd (diff) | |
download | src-90f2be24301fc6b17fcba2ec8f236cc0f0da607e.tar.gz src-90f2be24301fc6b17fcba2ec8f236cc0f0da607e.zip |
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.
Notes
Notes:
svn path=/head/; revision=221101
Diffstat (limited to 'sys/geom/geom_subr.c')
-rw-r--r-- | sys/geom/geom_subr.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c index b001c5fcaed0..a0958f30da0b 100644 --- a/sys/geom/geom_subr.c +++ b/sys/geom/geom_subr.c @@ -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 |