From 661dce36178960a20a5bcbb3bbf92e721df1bec0 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 10 Mar 2009 16:28:22 +1100 Subject: 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 --- managemon.c | 21 +++++++++++++++++++++ super-ddf.c | 1 + 2 files changed, 22 insertions(+) diff --git a/managemon.c b/managemon.c index 5f0a61b..e02c77e 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); diff --git a/super-ddf.c b/super-ddf.c index 965b8e2..6455dee 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -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); -- cgit