• Song Liu's avatar
    md/r5cache: shift complex rmw from read path to write path · 07e83364
    Song Liu authored
    Write back cache requires a complex RMW mechanism, where old data is
    read into dev->orig_page for prexor, and then xor is done with
    dev->page. This logic is already implemented in the write path.
    
    However, current read path is not awared of this requirement. When
    the array is optimal, the RMW is not required, as the data are
    read from raid disks. However, when the target stripe is degraded,
    complex RMW is required to generate right data.
    
    To keep read path as clean as possible, we handle read path by
    flushing degraded, in-journal stripes before processing reads to
    missing dev.
    
    Specifically, when there is read requests to a degraded stripe
    with data in journal, handle_stripe_fill() calls
    r5c_make_stripe_write_out() and exits. Then handle_stripe_dirtying()
    will do the complex RMW and flush the stripe to RAID disks. After
    that, read requests are handled.
    
    There is one more corner case when there is non-overwrite bio for
    the missing (or out of sync) dev. handle_stripe_dirtying() will not
    be able to process the non-overwrite bios without constructing the
    data in handle_stripe_fill(). This is fixed by delaying non-overwrite
    bios in handle_stripe_dirtying(). So handle_stripe_fill() works on
    these bios after the stripe is flushed to raid disks.
    Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    07e83364
raid5.c 231 KB