aboutsummaryrefslogtreecommitdiff
path: root/sys/geom/geom_subr.c
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2011-04-27 00:10:26 +0000
committerAlexander Motin <mav@FreeBSD.org>2011-04-27 00:10:26 +0000
commit90f2be24301fc6b17fcba2ec8f236cc0f0da607e (patch)
tree5ef8db534c3e8ba0bf7276c5dc63282d3f429e66 /sys/geom/geom_subr.c
parentcec9f109bb610c8304e08adc7d6ad229b6bcfcdd (diff)
downloadsrc-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.c37
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