• Song Liu's avatar
    md/r5cache: fix io_unit handling in r5l_log_endio() · a9501d74
    Song Liu authored
    In r5l_log_endio(), once log->io_list_lock is released, the io unit
    may be accessed (or even freed) by other threads. Current code
    doesn't handle the io_unit properly, which leads to potential race
    conditions.
    
    This patch solves this race condition by:
    
    1. Add a pending_stripe count flush_payload. Multiple flush_payloads
       are counted as only one pending_stripe. Flag has_flush_payload is
       added to show whether the io unit has flush_payload;
    2. In r5l_log_endio(), check flags has_null_flush and
       has_flush_payload with log->io_list_lock held. After the lock
       is released, this IO unit is only accessed when we know the
       pending_stripe counter cannot be zeroed by other threads.
    Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    a9501d74
raid5-cache.c 87.3 KB