• David Jeffery's avatar
    md/raid1: release pending accounting for an I/O only after write-behind is also finished · c91114c2
    David Jeffery authored
    When using RAID1 and write-behind, md can deadlock when errors occur. With
    write-behind, r1bio structs can be accounted by raid1 as queued but not
    counted as pending. The pending count is dropped when the original bio is
    returned complete but write-behind for the r1bio may still be active.
    
    This breaks the accounting used in some conditions to know when the raid1
    md device has reached an idle state. It can result in calls to
    freeze_array deadlocking. freeze_array will never complete from a negative
    "unqueued" value being calculated due to a queued count larger than the
    pending count.
    
    To properly account for write-behind, move the call to allow_barrier from
    call_bio_endio to raid_end_bio_io. When using write-behind, md can call
    call_bio_endio before all write-behind I/O is complete. Using
    raid_end_bio_io for the point to call allow_barrier will release the
    pending count at a point where all I/O for an r1bio, even write-behind, is
    done.
    Signed-off-by: default avatarDavid Jeffery <djeffery@redhat.com>
    Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
    c91114c2
raid1.c 92.8 KB