config: Don't require an array to have a device name.

i.e. in mdadm.conf you can have a line like

   ARRAY uuid=whatever

and it will use auto-name-generation to give a name to the array at
assemble-time.  The is different from blind auto-assembly in that the
array will be treated as 'local'.
This commit is contained in:
NeilBrown 2008-11-04 20:50:38 +11:00
parent 215bb3f776
commit fe056d1fb0
4 changed files with 23 additions and 25 deletions

View File

@ -154,7 +154,7 @@ int Incremental(char *devname, int verbose, int runstop,
if (array_list->uuid_set &&
same_uuid(array_list->uuid, info.uuid, st->ss->swapuuid)
== 0) {
if (verbose >= 2)
if (verbose >= 2 && array_list->devname)
fprintf(stderr, Name
": UUID differs from %s.\n",
array_list->devname);
@ -162,7 +162,7 @@ int Incremental(char *devname, int verbose, int runstop,
}
if (array_list->name[0] &&
strcasecmp(array_list->name, info.name) != 0) {
if (verbose >= 2)
if (verbose >= 2 && array_list->devname)
fprintf(stderr, Name
": Name differs from %s.\n",
array_list->devname);
@ -170,7 +170,7 @@ int Incremental(char *devname, int verbose, int runstop,
}
if (array_list->devices &&
!match_oneof(array_list->devices, devname)) {
if (verbose >= 2)
if (verbose >= 2 && array_list->devname)
fprintf(stderr, Name
": Not a listed device for %s.\n",
array_list->devname);
@ -178,7 +178,7 @@ int Incremental(char *devname, int verbose, int runstop,
}
if (array_list->super_minor != UnSet &&
array_list->super_minor != info.array.md_minor) {
if (verbose >= 2)
if (verbose >= 2 && array_list->devname)
fprintf(stderr, Name
": Different super-minor to %s.\n",
array_list->devname);
@ -188,7 +188,7 @@ int Incremental(char *devname, int verbose, int runstop,
!array_list->name[0] &&
!array_list->devices &&
array_list->super_minor == UnSet) {
if (verbose >= 2)
if (verbose >= 2 && array_list->devname)
fprintf(stderr, Name
": %s doesn't have any identifying information.\n",
array_list->devname);
@ -197,10 +197,15 @@ int Incremental(char *devname, int verbose, int runstop,
/* FIXME, should I check raid_disks and level too?? */
if (match) {
if (verbose >= 0)
fprintf(stderr, Name
if (verbose >= 0) {
if (match->devname && array_list->devname)
fprintf(stderr, Name
": we match both %s and %s - cannot decide which to use.\n",
match->devname, array_list->devname);
match->devname, array_list->devname);
else
fprintf(stderr, Name
": multiple lines in mdadm.conf match\n");
}
return 2;
}
match = array_list;
@ -656,7 +661,8 @@ int IncrementalScan(int verbose)
}
/* Ok, we can try this one. Maybe it needs a bitmap */
for (mddev = devs ; mddev ; mddev = mddev->next)
if (strcmp(mddev->devname, me->path) == 0)
if (mddev->devname
&& strcmp(mddev->devname, me->path) == 0)
break;
if (mddev && mddev->bitmap_file) {
/*

View File

@ -165,7 +165,10 @@ int Monitor(mddev_dev_t devlist,
if (devlist == NULL) {
mddev_ident_t mdlist = conf_get_ident(NULL);
for (; mdlist; mdlist=mdlist->next) {
struct state *st = malloc(sizeof *st);
struct state *st;
if (mdlist->devname == NULL)
continue;
st = malloc(sizeof *st);
if (st == NULL)
continue;
st->devname = strdup(mdlist->devname);

View File

@ -529,14 +529,12 @@ void arrayline(char *line)
w);
}
}
if (mis.devname == NULL)
fprintf(stderr, Name ": ARRAY line with no device\n");
else if (mis.uuid_set == 0 && mis.devices == NULL && mis.super_minor == UnSet && mis.name[0] == 0)
if (mis.uuid_set == 0 && mis.devices == NULL && mis.super_minor == UnSet && mis.name[0] == 0)
fprintf(stderr, Name ": ARRAY line %s has no identity information.\n", mis.devname);
else {
mi = malloc(sizeof(*mi));
*mi = mis;
mi->devname = strdup(mis.devname);
mi->devname = mis.devname ? strdup(mis.devname) : NULL;
mi->next = NULL;
*mddevlp = mi;
mddevlp = &mi->next;
@ -721,7 +719,8 @@ mddev_ident_t conf_get_ident(char *dev)
mddev_ident_t rv;
load_conffile();
rv = mddevlist;
while (dev && rv && strcmp(dev, rv->devname)!=0)
while (dev && rv && (rv->devname == NULL
|| strcmp(dev, rv->devname)!=0))
rv = rv->next;
return rv;
}

10
mdadm.c
View File

@ -1082,16 +1082,6 @@ int main(int argc, char *argv[])
exit(1);
}
for (; array_list; array_list = array_list->next) {
mdfd = open_mddev(array_list->devname, 0);
if (mdfd >= 0) {
mdu_array_info_t array;
/* skip if already assembled */
if (ioctl(mdfd, GET_ARRAY_INFO, &array)>=0) {
cnt++;
close(mdfd);
continue;
}
}
if (array_list->autof == 0)
array_list->autof = autof;