mdmon: remove devices from container

Once the monitor thread has kicked a drive from all managed arrays mdadm
-r is permitted.  We are guaranteed that the drive is marked failed at
this point, so allow the drive to be re-added as a spare.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Dan Williams 2008-08-19 14:55:12 +10:00 committed by NeilBrown
parent ae6aad8239
commit 7bc1962f8c
2 changed files with 25 additions and 2 deletions

View File

@ -228,12 +228,35 @@ static void manage_container(struct mdstat_ent *mdstat,
* about spare assignment.... probably not.
*/
if (mdstat->devcnt != container->devcnt) {
struct mdinfo **cdp, *cd, *di, *mdi;
int found;
/* read /sys/block/NAME/md/dev-??/block/dev to find out
* what is there, and compare with container->info.devs
* To see what is removed and what is added.
* These need to be remove from, or added to, the array
*/
// FIXME
mdi = sysfs_read(-1, mdstat->devnum, GET_DEVS);
if (!mdi)
return;
/* check for removals */
for (cdp = &container->devs; *cdp; ) {
found = 0;
for (di = mdi->devs; di; di = di->next)
if (di->disk.major == (*cdp)->disk.major &&
di->disk.minor == (*cdp)->disk.minor) {
found = 1;
break;
}
if (!found) {
cd = *cdp;
*cdp = (*cdp)->next;
free(cd);
} else
cdp = &(*cdp)->next;
}
sysfs_free(mdi);
container->devcnt = mdstat->devcnt;
}
}

View File

@ -292,7 +292,7 @@ int main(int argc, char *argv[])
container->devs = NULL;
for (di = mdi->devs; di; di = di->next) {
struct mdinfo *cd = malloc(sizeof(*cd));
cd = di;
*cd = *di;
cd->next = container->devs;
container->devs = cd;
}