From 1c823de16ca28d78ba0b32ba5af8b405c6d7f41d Mon Sep 17 00:00:00 2001 From: Doug Ledford Date: Sat, 21 Mar 2009 01:25:02 +0000 Subject: [PATCH] - Fix a few issues with the new code to determine when a device gets to keep its name and when it doesn't --- mdadm-3.0-foreign.patch | 159 +++++++++++++++++++++++++++++++++------- mdadm.spec | 6 +- 2 files changed, 138 insertions(+), 27 deletions(-) diff --git a/mdadm-3.0-foreign.patch b/mdadm-3.0-foreign.patch index f2686fd..a332cf2 100644 --- a/mdadm-3.0-foreign.patch +++ b/mdadm-3.0-foreign.patch @@ -1,6 +1,21 @@ ---- mdadm-3.0-devel3/Incremental.c.foreign 2009-03-20 17:11:01.000000000 -0400 -+++ mdadm-3.0-devel3/Incremental.c 2009-03-20 17:11:39.000000000 -0400 -@@ -48,8 +48,10 @@ int Incremental(char *devname, int verbo +--- mdadm-3.0-devel3/Incremental.c.foreign 2009-03-20 17:49:20.000000000 -0400 ++++ mdadm-3.0-devel3/Incremental.c 2009-03-20 21:19:50.000000000 -0400 +@@ -29,12 +29,14 @@ + */ + + #include "mdadm.h" ++#include + + static int count_active(struct supertype *st, int mdfd, char **availp, + struct mdinfo *info); + static void find_reject(int mdfd, struct supertype *st, struct mdinfo *sra, + int number, __u64 events, int verbose, + char *array_name); ++static int compare_array_name(char *conf_name, char *sb_name); + + int Incremental(char *devname, int verbose, int runstop, + struct supertype *st, char *homehost, int autof) +@@ -48,8 +50,10 @@ int Incremental(char *devname, int verbo * 2/ Find metadata, reject if none appropriate (check * version/name from args) * 3/ Check if there is a match in mdadm.conf @@ -13,7 +28,7 @@ * 4/ Determine device number. * - If in mdadm.conf with std name, use that * - UUID in /dev/md/mdadm.map use that -@@ -78,7 +80,7 @@ int Incremental(char *devname, int verbo +@@ -78,7 +82,7 @@ int Incremental(char *devname, int verbo */ struct stat stb; struct mdinfo info; @@ -22,8 +37,15 @@ char chosen_name[1024]; int rv; struct map_ent *mp, *map = NULL; -@@ -150,24 +152,37 @@ int Incremental(char *devname, int verbo +@@ -148,26 +152,42 @@ int Incremental(char *devname, int verbo + st->ss->getinfo_super(st, &info); + /* 3/ Check if there is a match in mdadm.conf */ ++ name_to_use = strchr(info.name, ':'); ++ if (name_to_use) ++ name_to_use++; ++ else ++ name_to_use = info.name; array_list = conf_get_ident(NULL); match = NULL; + match_uuid = NULL; @@ -45,15 +67,13 @@ array_list->devname); - continue; - } -+ /* If we match name now and the entry has a uuid, it *must* -+ * match. If we match name, but the entry *doesn't* have -+ * a uuid set, save it off separately so we can tell if we -+ * matched uuid, name, or both, and if both, if they were ++ /* If we match name, save it off separately so we can tell if ++ * we matched uuid, name, or both, and if both, if they were + * the same entry */ if (array_list->name[0] && - strcasecmp(array_list->name, info.name) != 0) { - if (verbose >= 2 && array_list->devname) -+ strcasecmp(array_list->name, info.name) == 0) ++ compare_array_name(array_list->name, info.name)) + match_name = array_list; + else if (array_list->name[0] && verbose >= 2 && + array_list->devname) @@ -67,7 +87,7 @@ if (array_list->devices && !match_oneof(array_list->devices, devname)) { if (verbose >= 2 && array_list->devname) -@@ -197,7 +212,13 @@ int Incremental(char *devname, int verbo +@@ -197,7 +217,13 @@ int Incremental(char *devname, int verbo /* FIXME, should I check raid_disks and level too?? */ if (match) { @@ -82,7 +102,7 @@ if (match->devname && array_list->devname) fprintf(stderr, Name ": we match both %s and %s - cannot decide which to use.\n", -@@ -205,23 +226,54 @@ int Incremental(char *devname, int verbo +@@ -205,23 +231,52 @@ int Incremental(char *devname, int verbo else fprintf(stderr, Name ": multiple lines in mdadm.conf match\n"); @@ -102,29 +122,27 @@ + * likely foreign match. I dropped the homehost test entirely because + * it didn't seem to add any value whatsoever above and beyond what + * these tests can do. */ -+ if (match_uuid == match_name) ++ if (match && match_uuid == match_name) { + /* found in conf, both name and uuid match */ trustworthy = LOCAL; - else if (homehost == NULL || - st->ss->match_home(st, homehost) != 1) -+ else if (match_uuid && match_name) -+ /* found both a name and a uuid match, but not on the same -+ * entry, so use a random name and assume UUID match was -+ * correct but has a bad name just in case the one that -+ * would match the matching name shows up with both a -+ * matching name and a matching UUID */ - trustworthy = FOREIGN; +- trustworthy = FOREIGN; - else -- trustworthy = LOCAL; -+ else if (!match_uuid && match_name) { ++ } else if (match_uuid && match_name) { ++ /* found both a name and a uuid match, but not on the same ++ * entry, so prefer the uuid match (done above) */ + trustworthy = LOCAL; ++ } else if (!match_uuid && match_name) { + /* no uuid match, but name match */ -+ if (match_name->uuid_set) ++ if (match_name->uuid_set) { + /* oops, name that matched had a uuid, it just wasn't + * right, assume there is a local device with both + * a matching name and uuid, so this needs a random + * name */ + trustworthy = FOREIGN; -+ else ++ match = NULL; ++ } else + /* matched name, and the matching entry in conf file + * didn't include a uuid, and this uuid never showed + * up anywhere else in the conf file, so consider it @@ -147,8 +165,66 @@ /* There are three possible sources for 'autof': command line, * ARRAY line in mdadm.conf, or CREATE line in mdadm.conf. +@@ -240,11 +295,6 @@ int Incremental(char *devname, int verbo + return Incremental_container(st, devname, verbose, runstop, + autof, trustworthy); + } +- name_to_use = strchr(info.name, ':'); +- if (name_to_use) +- name_to_use++; +- else +- name_to_use = info.name; + + if ((!name_to_use || name_to_use[0] == 0) && + info.array.level == LEVEL_CONTAINER && +@@ -797,3 +847,45 @@ int Incremental_container(struct superty + map_unlock(&map); + return 0; + } ++ ++static int compare_array_name(char *conf_name, char *sb_name) ++{ ++ char *cptr, *sptr; ++ int conf_num = -1; ++ ++ /* usage of the name variable in the superblock comes in several ++ * flavors: ++ * A) full md pathname (/dev/md0) ++ * B) just the md name (md0) ++ * C) just the md number (0) ++ * D) all of the above, but with hostname: prefixed to it ++ * ++ * Depending on which of those variants we have, we need to alter ++ * how we attempt to match the array name in the mdadm.conf file ++ * which is always a full pathname. We don't match on hostname: ++ * though, so eliminate it from the equation. ++ */ ++ ++ if ((sptr = strchr(sb_name, ':')) == NULL) ++ sptr = sb_name; ++ else ++ sptr++; ++ ++ /* Do we have a full pathname in the superblock name field? */ ++ if (strchr(sptr, '/')) ++ return !strcasecmp(conf_name, sptr); ++ /* If not, is it just a number or an md device name? */ ++ else if (isdigit(sptr[0])) { ++ cptr = conf_name + strlen(conf_name); ++ while (cptr > conf_name && isdigit(cptr[-1])) ++ cptr--; ++ if (cptr[0]) ++ conf_num = strtoul(cptr, NULL, 10); ++ return conf_num == strtoul(sptr, NULL, 10); ++ } /* fall through else, it's a device name but not a full path */ ++ ++ cptr = strcasestr(conf_name, sptr); ++ if (cptr) ++ return !strcasecmp(cptr, sptr); ++ return 0; ++} --- mdadm-3.0-devel3/mdadm.h.foreign 2009-03-10 01:39:41.000000000 -0400 -+++ mdadm-3.0-devel3/mdadm.h 2009-03-20 17:11:01.000000000 -0400 ++++ mdadm-3.0-devel3/mdadm.h 2009-03-20 17:49:20.000000000 -0400 @@ -785,6 +785,7 @@ extern mddev_dev_t conf_get_devs(void); extern int conf_test_dev(char *devname); extern struct createinfo *conf_get_create_info(void); @@ -157,8 +233,39 @@ extern char *conf_get_mailaddr(void); extern char *conf_get_mailfrom(void); extern char *conf_get_program(void); +--- mdadm-3.0-devel3/mdopen.c.foreign 2009-03-20 19:02:38.000000000 -0400 ++++ mdadm-3.0-devel3/mdopen.c 2009-03-20 19:02:43.000000000 -0400 +@@ -159,7 +159,6 @@ int create_mddev(char *dev, char *name, + strcpy(chosen, "/dev/md/"); + cname = chosen + strlen(chosen); + +- + if (dev) { + + if (strncmp(dev, "/dev/md/", 8) == 0) { +@@ -240,12 +239,14 @@ int create_mddev(char *dev, char *name, + if (num < 0 && trustworthy == LOCAL && name) { + /* if name is numeric, use that for num + * if it is not already in use */ +- char *ep; +- num = strtoul(name, &ep, 10); +- if (ep == name || *ep) +- num = -1; +- else if (mddev_busy(use_mdp ? (-1-num) : num)) +- num = -1; ++ char *e = name + strlen(name); ++ while (e > name && isdigit(e[-1])) ++ e--; ++ if (e[0]) { ++ num = strtoul(e, NULL, 10); ++ if (mddev_busy(use_mdp ? (-1-num) : num)) ++ num = -1; ++ } + } + + if (num < 0) { --- mdadm-3.0-devel3/config.c.foreign 2009-03-10 01:39:41.000000000 -0400 -+++ mdadm-3.0-devel3/config.c 2009-03-20 17:11:01.000000000 -0400 ++++ mdadm-3.0-devel3/config.c 2009-03-20 17:49:20.000000000 -0400 @@ -637,7 +637,7 @@ void homehostline(char *line) } } diff --git a/mdadm.spec b/mdadm.spec index 142971a..21679ef 100644 --- a/mdadm.spec +++ b/mdadm.spec @@ -1,7 +1,7 @@ Summary: The mdadm program controls Linux md devices (software RAID arrays) Name: mdadm Version: 3.0 -Release: 0.devel3.4%{?dist} +Release: 0.devel3.5%{?dist} Source: http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}-devel3.tar.bz2 Source1: mdmonitor.init Source2: raid-check @@ -87,6 +87,10 @@ fi %attr(0700,root,root) %dir /var/run/mdadm %changelog +* Fri Mar 20 2009 Doug Ledford - 3.0-0.devel3.5 +- Fix a few issues with the new code to determine when a device gets to + keep its name and when it doesn't + * Fri Mar 20 2009 Doug Ledford - 3.0-0.devel3.4 - Change the perms on the udev rules file, it doesn't need to be +x