]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Incremental: allow assembly of foreign array.
authorNeilBrown <neilb@suse.de>
Wed, 29 Oct 2008 22:48:18 +0000 (09:48 +1100)
committerNeilBrown <neilb@suse.de>
Wed, 29 Oct 2008 22:48:18 +0000 (09:48 +1100)
If a foreign (i.e. not known to be local) array is discovered
by --incremental assembly, we now assemble it.  However we ignore
any name information in the array so as not to potentially create
a name that conflict with a 'local' array.
Also, foreign arrays are always assembled 'read-auto' to avoid writing
anything until the array is actually used.

Signed-off-by: NeilBrown <neilb@suse.de>
Incremental.c
mdopen.c

index d61518ab83bd7e37f350de2c10211c4430d48d7c..7148a734a883b598adb2b3fb40e67ff537e6d85b 100644 (file)
@@ -84,6 +84,7 @@ int Incremental(char *devname, int verbose, int runstop,
        char *avail;
        int active_disks;
        struct createinfo *ci = conf_get_create_info();
+       char *name;
 
 
        /* 1/ Check if devices is permitted by mdadm.conf */
@@ -199,14 +200,18 @@ int Incremental(char *devname, int verbose, int runstop,
                match = array_list;
        }
 
-       /* 3a/ if not, check for homehost match.  If no match, reject. */
+       /* 3a/ if not, check for homehost match.  If no match, continue
+        * but don't trust the 'name' in the array. Thus a 'random' minor
+        * number will be assigned, and the device name will be based
+        * on that. */
+       name = info.name;
        if (!match) {
                if (homehost == NULL ||
                    st->ss->match_home(st, homehost) == 0) {
                        if (verbose >= 0)
                                fprintf(stderr, Name
              ": not found in mdadm.conf and not identified by homehost.\n");
-                       return 2;
+                       name = NULL;
                }
        }
        /* 4/ Determine device number. */
@@ -237,11 +242,11 @@ int Incremental(char *devname, int verbose, int runstop,
                char *np, *ep;
                if ((autof&7) == 3 || (autof&7) == 5)
                        use_partitions = 0;
-               np = strchr(info.name, ':');
+               np = name ? strchr(name, ':') : ":NONAME";
                if (np)
                        np++;
                else
-                       np = info.name;
+                       np = name;
                devnum = strtoul(np, &ep, 10);
                if (ep > np && *ep == 0) {
                        /* This is a number.  Let check that it is unused. */
@@ -264,7 +269,7 @@ int Incremental(char *devname, int verbose, int runstop,
        }
        mdfd = open_mddev_devnum(match ? match->devname : NULL,
                                 devnum,
-                                info.name,
+                                name,
                                 chosen_name, autof >> 3);
        if (mdfd < 0) {
                fprintf(stderr, Name ": failed to open %s: %s.\n",
@@ -452,7 +457,8 @@ int Incremental(char *devname, int verbose, int runstop,
                        close(bmfd);
                }
                sra = sysfs_read(mdfd, devnum, 0);
-               if (sra == NULL || active_disks >= info.array.working_disks)
+               if ((sra == NULL || active_disks >= info.array.working_disks)
+                   && name != NULL)
                        rv = ioctl(mdfd, RUN_ARRAY, NULL);
                else
                        rv = sysfs_set_str(sra, NULL,
index 4fbcb484a21c2e856bdb4067a96a68135b796260..9250e4bacf3062b308157c83480de7561603ed1c 100644 (file)
--- a/mdopen.c
+++ b/mdopen.c
@@ -282,7 +282,7 @@ int open_mddev_devnum(char *devname, int devnum, char *name,
 
        if (devname)
                strcpy(chosen_name, devname);
-       else if (name && strchr(name,'/') == NULL) {
+       else if (name && *name && strchr(name,'/') == NULL) {
                char *n = strchr(name, ':');
                if (n) n++; else n = name;
                if (isdigit(*n) && devnum < 0)