• Yu Kuai's avatar
    md: delay remove_and_add_spares() for read only array to md_start_sync() · 81e2ce1b
    Yu Kuai authored
    Before this patch, for read-only array:
    
    md_check_recovery() check that 'MD_RECOVERY_NEEDED' is set, then it will
    call remove_and_add_spares() directly to try to remove and add rdevs
    from array.
    
    After this patch:
    
    1) md_check_recovery() check that 'MD_RECOVERY_NEEDED' is set, and the
       worker 'sync_work' is not pending, and there are rdevs can be added
       or removed, then it will queue new work md_start_sync();
    2) md_start_sync() will call remove_and_add_spares() and exist;
    
    This change make sure that array reconfiguration is independent from
    daemon, and it'll be much easier to synchronize it with io, consier
    that io may rely on daemon thread to be done.
    
    Also fix a problem that 'pers->spars_active' is called after
    remove_and_add_spares(), which order is wrong, because spares must
    active first, and then remove_and_add_spares() can add spares to the
    array, like what read-write case does:
    
    1) daemon set 'MD_RECOVERY_RUNNING', register new sync thread to do
       recovery;
    2) recovery is done, md_do_sync() set 'MD_RECOVERY_DONE' before return;
    3) daemon call 'pers->spars_active', and clear 'MD_RECOVERY_RUNNING';
    4) in the next round of daemon, call remove_and_add_spares() to add
       spares to the array.
    Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
    Signed-off-by: default avatarSong Liu <song@kernel.org>
    Link: https://lore.kernel.org/r/20230825031622.1530464-8-yukuai1@huaweicloud.com
    81e2ce1b
md.c 264 KB