Incremental: Factor out search of mdstat
As we will soon use it in two places. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
7d91c3f547
commit
3a97f21010
148
Incremental.c
148
Incremental.c
|
@ -44,6 +44,11 @@ static int Incremental_container(struct supertype *st, char *devname,
|
|||
int verbose, int runstop, int autof,
|
||||
int trustworthy);
|
||||
|
||||
static struct mddev_ident_s *search_mdstat(struct supertype *st,
|
||||
struct mdinfo *info,
|
||||
char *devname,
|
||||
int verbose, int *rvp);
|
||||
|
||||
int Incremental(char *devname, int verbose, int runstop,
|
||||
struct supertype *st, char *homehost, int require_homehost,
|
||||
int autof)
|
||||
|
@ -87,7 +92,7 @@ int Incremental(char *devname, int verbose, int runstop,
|
|||
*/
|
||||
struct stat stb;
|
||||
struct mdinfo info, dinfo;
|
||||
struct mddev_ident_s *array_list, *match;
|
||||
struct mddev_ident_s *match;
|
||||
char chosen_name[1024];
|
||||
int rv = 1;
|
||||
struct map_ent *mp, *map = NULL;
|
||||
|
@ -161,71 +166,11 @@ int Incremental(char *devname, int verbose, int runstop,
|
|||
|
||||
memset(&info, 0, sizeof(info));
|
||||
st->ss->getinfo_super(st, &info, NULL);
|
||||
|
||||
/* 3/ Check if there is a match in mdadm.conf */
|
||||
|
||||
array_list = conf_get_ident(NULL);
|
||||
match = NULL;
|
||||
for (; array_list; array_list = array_list->next) {
|
||||
if (array_list->uuid_set &&
|
||||
same_uuid(array_list->uuid, info.uuid, st->ss->swapuuid)
|
||||
== 0) {
|
||||
if (verbose >= 2 && array_list->devname)
|
||||
fprintf(stderr, Name
|
||||
": UUID differs from %s.\n",
|
||||
array_list->devname);
|
||||
continue;
|
||||
}
|
||||
if (array_list->name[0] &&
|
||||
strcasecmp(array_list->name, info.name) != 0) {
|
||||
if (verbose >= 2 && array_list->devname)
|
||||
fprintf(stderr, Name
|
||||
": Name differs from %s.\n",
|
||||
array_list->devname);
|
||||
continue;
|
||||
}
|
||||
if (array_list->devices &&
|
||||
!match_oneof(array_list->devices, devname)) {
|
||||
if (verbose >= 2 && array_list->devname)
|
||||
fprintf(stderr, Name
|
||||
": Not a listed device for %s.\n",
|
||||
array_list->devname);
|
||||
continue;
|
||||
}
|
||||
if (array_list->super_minor != UnSet &&
|
||||
array_list->super_minor != info.array.md_minor) {
|
||||
if (verbose >= 2 && array_list->devname)
|
||||
fprintf(stderr, Name
|
||||
": Different super-minor to %s.\n",
|
||||
array_list->devname);
|
||||
continue;
|
||||
}
|
||||
if (!array_list->uuid_set &&
|
||||
!array_list->name[0] &&
|
||||
!array_list->devices &&
|
||||
array_list->super_minor == UnSet) {
|
||||
if (verbose >= 2 && array_list->devname)
|
||||
fprintf(stderr, Name
|
||||
": %s doesn't have any identifying information.\n",
|
||||
array_list->devname);
|
||||
continue;
|
||||
}
|
||||
/* FIXME, should I check raid_disks and level too?? */
|
||||
|
||||
if (match) {
|
||||
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);
|
||||
else
|
||||
fprintf(stderr, Name
|
||||
": multiple lines in mdadm.conf match\n");
|
||||
}
|
||||
rv = 2;
|
||||
goto out;
|
||||
}
|
||||
match = array_list;
|
||||
}
|
||||
match = search_mdstat(st, &info, devname, verbose, &rv);
|
||||
if (!match && rv == 2)
|
||||
goto out;
|
||||
|
||||
if (match && match->devname
|
||||
&& strcasecmp(match->devname, "<ignore>") == 0) {
|
||||
|
@ -601,6 +546,79 @@ out:
|
|||
return rv;
|
||||
}
|
||||
|
||||
static struct mddev_ident_s *search_mdstat(struct supertype *st,
|
||||
struct mdinfo *info,
|
||||
char *devname,
|
||||
int verbose, int *rvp)
|
||||
{
|
||||
struct mddev_ident_s *array_list, *match;
|
||||
array_list = conf_get_ident(NULL);
|
||||
match = NULL;
|
||||
for (; array_list; array_list = array_list->next) {
|
||||
if (array_list->uuid_set &&
|
||||
same_uuid(array_list->uuid, info->uuid, st->ss->swapuuid)
|
||||
== 0) {
|
||||
if (verbose >= 2 && array_list->devname)
|
||||
fprintf(stderr, Name
|
||||
": UUID differs from %s.\n",
|
||||
array_list->devname);
|
||||
continue;
|
||||
}
|
||||
if (array_list->name[0] &&
|
||||
strcasecmp(array_list->name, info->name) != 0) {
|
||||
if (verbose >= 2 && array_list->devname)
|
||||
fprintf(stderr, Name
|
||||
": Name differs from %s.\n",
|
||||
array_list->devname);
|
||||
continue;
|
||||
}
|
||||
if (array_list->devices &&
|
||||
!match_oneof(array_list->devices, devname)) {
|
||||
if (verbose >= 2 && array_list->devname)
|
||||
fprintf(stderr, Name
|
||||
": Not a listed device for %s.\n",
|
||||
array_list->devname);
|
||||
continue;
|
||||
}
|
||||
if (array_list->super_minor != UnSet &&
|
||||
array_list->super_minor != info->array.md_minor) {
|
||||
if (verbose >= 2 && array_list->devname)
|
||||
fprintf(stderr, Name
|
||||
": Different super-minor to %s.\n",
|
||||
array_list->devname);
|
||||
continue;
|
||||
}
|
||||
if (!array_list->uuid_set &&
|
||||
!array_list->name[0] &&
|
||||
!array_list->devices &&
|
||||
array_list->super_minor == UnSet) {
|
||||
if (verbose >= 2 && array_list->devname)
|
||||
fprintf(stderr, Name
|
||||
": %s doesn't have any identifying information.\n",
|
||||
array_list->devname);
|
||||
continue;
|
||||
}
|
||||
/* FIXME, should I check raid_disks and level too?? */
|
||||
|
||||
if (match) {
|
||||
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);
|
||||
else
|
||||
fprintf(stderr, Name
|
||||
": multiple lines in mdadm.conf match\n");
|
||||
}
|
||||
*rvp = 2;
|
||||
match = NULL;
|
||||
break;
|
||||
}
|
||||
match = array_list;
|
||||
}
|
||||
return match;
|
||||
}
|
||||
|
||||
static void find_reject(int mdfd, struct supertype *st, struct mdinfo *sra,
|
||||
int number, __u64 events, int verbose,
|
||||
char *array_name)
|
||||
|
|
Loading…
Reference in New Issue