• Song Liu's avatar
    md/r5cache: flush data only stripes in r5l_recovery_log() · a85dd7b8
    Song Liu authored
    For safer operation, all arrays start in write-through mode, which has been
    better tested and is more mature. And actually the write-through/write-mode
    isn't persistent after array restarted, so we always start array in
    write-through mode. However, if recovery found data-only stripes before the
    shutdown (from previous write-back mode), it is not safe to start the array in
    write-through mode, as write-through mode can not handle stripes with data in
    write-back cache. To solve this problem, we flush all data-only stripes in
    r5l_recovery_log(). When r5l_recovery_log() returns, the array starts with
    empty cache in write-through mode.
    
    This logic is implemented in r5c_recovery_flush_data_only_stripes():
    
    1. enable write back cache
    2. flush all stripes
    3. wake up conf->mddev->thread
    4. wait for all stripes get flushed (reuse wait_for_quiescent)
    5. disable write back cache
    
    The wait in 4 will be waked up in release_inactive_stripe_list()
    when conf->active_stripes reaches 0.
    
    It is safe to wake up mddev->thread here because all the resource
    required for the thread has been initialized.
    Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    a85dd7b8
md.c 234 KB