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:
parent
ae6aad8239
commit
7bc1962f8c
25
managemon.c
25
managemon.c
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue