mdmon: allow incremental assembly of containers.

If mdmon sees a device added to a container, it should assume it is
a new spare.  It could be a part of the array that just hadn't been
assembled yet.  So check first.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2009-03-10 16:28:22 +11:00
parent bc17324f5e
commit 661dce3617
2 changed files with 22 additions and 0 deletions

View File

@ -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);

View File

@ -1335,6 +1335,7 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info)
info->component_size = ddf->dlist->size - info->data_offset;
} else {
info->disk.number = -1;
info->disk.raid_disk = -1;
// info->disk.raid_disk = find refnum in the table and use index;
}
info->disk.state = (1 << MD_DISK_SYNC);