X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=managemon.c;h=e02c77ea964ef8fa6746ec05f06dc3835f312eb2;hp=5f0a61b5ce106f56d44404ae08b7347f29a1a36f;hb=661dce36178960a20a5bcbb3bbf92e721df1bec0;hpb=bc17324f5e0fd1631bfd9a8d749a34a94da4e621 diff --git a/managemon.c b/managemon.c index 5f0a61b5..e02c77ea 100644 --- a/managemon.c +++ b/managemon.c @@ -241,7 +241,9 @@ static void add_disk_to_container(struct supertype *st, struct mdinfo *sd) { int dfd; char nm[20]; + struct supertype *st2; struct metadata_update *update = NULL; + struct mdinfo info; mdu_disk_info_t dk = { .number = -1, .major = sd->disk.major, @@ -261,6 +263,25 @@ static void add_disk_to_container(struct supertype *st, struct mdinfo *sd) if (dfd < 0) return; + /* Check the metadata and see if it is already part of this + * array + */ + st2 = dup_super(st); + if (st2->ss->load_super(st2, dfd, NULL) == 0) { + st2->ss->getinfo_super(st, &info); + if (st->ss->compare_super(st, st2) == 0 && + info.disk.raid_disk >= 0) { + /* Looks like a good member of array. + * Just accept it. + * mdadm will incorporate any parts into + * active arrays. + */ + st2->ss->free_super(st2); + return; + } + } + st2->ss->free_super(st2); + st->update_tail = &update; st->ss->add_to_super(st, &dk, dfd, NULL); st->ss->write_init_super(st);