• NeilBrown's avatar
    md/raid5: simplfy delaying of writes while metadata is updated. · 16d997b7
    NeilBrown authored
    If a device fails during a write, we must ensure the failure is
    recorded in the metadata before the completion of the write is
    acknowleged.
    
    Commit c3cce6cd ("md/raid5: ensure device failure recorded before
    write request returns.")  added code for this, but it was
    unnecessarily complicated.  We already had similar functionality for
    handling updates to the bad-block-list, thanks to Commit de393cde
    ("md: make it easier to wait for bad blocks to be acknowledged.")
    
    So revert most of the former commit, and instead avoid collecting
    completed writes if MD_CHANGE_PENDING is set.  raid5d() will then flush
    the metadata and retry the stripe_head.
    As this change can leave a stripe_head ready for handling immediately
    after handle_active_stripes() returns, we change raid5_do_work() to
    pause when MD_CHANGE_PENDING is set, so that it doesn't spin.
    
    We check MD_CHANGE_PENDING *after* analyse_stripe() as it could be set
    asynchronously.  After analyse_stripe(), we have collected stable data
    about the state of devices, which will be used to make decisions.
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    16d997b7
raid5.c 238 KB