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

View File

@ -165,7 +165,10 @@ int Monitor(mddev_dev_t devlist,
if (devlist == NULL) { if (devlist == NULL) {
mddev_ident_t mdlist = conf_get_ident(NULL); mddev_ident_t mdlist = conf_get_ident(NULL);
for (; mdlist; mdlist=mdlist->next) { 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) if (st == NULL)
continue; continue;
st->devname = strdup(mdlist->devname); st->devname = strdup(mdlist->devname);

View File

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

10
mdadm.c
View File

@ -1082,16 +1082,6 @@ int main(int argc, char *argv[])
exit(1); exit(1);
} }
for (; array_list; array_list = array_list->next) { 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) if (array_list->autof == 0)
array_list->autof = autof; array_list->autof = autof;