• D
    [XFS] Fix a synchronous buftarg flush deadlock when freezing. · 585e6d88
    David Chinner 提交于
    At the last stage of a freeze, we flush the buftarg synchronously over and
    over again until it succeeds twice without skipping any buffers.
    
    The delwri list flush skips pinned buffers, but tries to flush all others.
    It removes the buffers from the delwri list, then tries to lock them one
    at a time as it traverses the list to issue the I/O. It holds them locked
    until we issue all of the I/O and then unlocks them once we've waited for
    it to complete.
    
    The problem is that during a freeze, the filesystem may still be doing
    stuff - like flushing delalloc data buffers - in the background and hence
    we can be trying to lock buffers that were on the delwri list at the same
    time. Hence we can get ABBA deadlocks between threads doing allocation and
    the buftarg flush (freeze) thread.
    
    Fix it by skipping locked (and pinned) buffers as we traverse the delwri
    buffer list.
    
    SGI-PV: 957195
    SGI-Modid: xfs-linux-melb:xfs-kern:27535a
    Signed-off-by: NDavid Chinner <dgc@sgi.com>
    Signed-off-by: NTim Shimmin <tes@sgi.com>
    585e6d88
xfs_buf.c 41.6 KB