Incremental: allow assembly of foreign array.
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>
This commit is contained in:
parent
4ef2f11e28
commit
7b403fef7e
|
@ -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,
|
||||
|
|
2
mdopen.c
2
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)
|
||||
|
|
Loading…
Reference in New Issue