diff options
author | NeilBrown <neilb@suse.de> | 2008-11-04 10:51:12 +0100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2008-11-04 10:51:12 +0100 |
commit | f2e55eccfb92969c3e11bc5d4883315f2e866a14 (patch) | |
tree | 41d9383f638fa80ca94f8b79afe8bceb9adca1cd /mdopen.c | |
parent | Assemble: revise detection of 'autoassemble' mode. (diff) | |
download | mdadm-f2e55eccfb92969c3e11bc5d4883315f2e866a14.tar.xz mdadm-f2e55eccfb92969c3e11bc5d4883315f2e866a14.zip |
mdopen: use small sequence number for uniquifying array names.
Rather than appending the md minor number, we now append a small
sequence number to make sure name in /dev/md/ that aren't LOCAL are
unique. As the map file is locked while we do this, we are sure
of no losing any races.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'mdopen.c')
-rw-r--r-- | mdopen.c | 32 |
1 files changed, 23 insertions, 9 deletions
@@ -269,19 +269,33 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy, * reasonable length and remove '/' */ char *cp; + struct map_ent *map = NULL; + int conflict = 1; + int unum = 0; + int cnlen; strncpy(cname, name, 200); cname[200] = 0; while ((cp = strchr(cname, '/')) != NULL) *cp = '-'; - if (trustworthy == METADATA) - /* always add device number to metadata */ - sprintf(cname+strlen(cname), "%d", num); - else if (trustworthy == FOREIGN && - strchr(cname, ':') == NULL) - /* add _%d to FOREIGN array that don't have - * a 'host:' prefix - */ - sprintf(cname+strlen(cname), "_%d", num<0?(-1-num):num); + if (trustworthy == LOCAL || + (trustworthy == FOREIGN && strchr(cname, ':') != NULL)) { + /* Only need suffix if there is a conflict */ + if (map_by_name(&map, cname) == NULL) + conflict = 0; + } + cnlen = strlen(cname); + while (conflict) { + if (trustworthy == METADATA) + sprintf(cname+cnlen, "%d", unum); + else + /* add _%d to FOREIGN array that don't + * a 'host:' prefix + */ + sprintf(cname+cnlen, "_%d", unum); + unum++; + if (map_by_name(&map, cname) == NULL) + conflict = 0; + } } if (cname[0] == 0) strcpy(chosen, devname); |