• Song Liu's avatar
    md/r5cache: gracefully handle journal device errors for writeback mode · 70d466f7
    Song Liu authored
    For the raid456 with writeback cache, when journal device failed during
    normal operation, it is still possible to persist all data, as all
    pending data is still in stripe cache. However, it is necessary to handle
    journal failure gracefully.
    
    During journal failures, the following logic handles the graceful shutdown
    of journal:
    1. raid5_error() marks the device as Faulty and schedules async work
       log->disable_writeback_work;
    2. In disable_writeback_work (r5c_disable_writeback_async), the mddev is
       suspended, set to write through, and then resumed. mddev_suspend()
       flushes all cached stripes;
    3. All cached stripes need to be flushed carefully to the RAID array.
    
    This patch fixes issues within the process above:
    1. In r5c_update_on_rdev_error() schedule disable_writeback_work for
       journal failures;
    2. In r5c_disable_writeback_async(), wait for MD_SB_CHANGE_PENDING,
       since raid5_error() updates superblock.
    3. In handle_stripe(), allow stripes with data in journal (s.injournal > 0)
       to make progress during log_failed;
    4. In delay_towrite(), if log failed only process data in the cache (skip
       new writes in dev->towrite);
    5. In __get_priority_stripe(), process loprio_list during journal device
       failures.
    6. In raid5_remove_disk(), wait for all cached stripes are flushed before
       calling log_exit().
    Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    70d466f7
raid5.c 237 KB