• Dave Chinner's avatar
    xfs: aborting inodes on shutdown may need buffer lock · d2d7c047
    Dave Chinner authored
    Most buffer io list operations are run with the bp->b_lock held, but
    xfs_iflush_abort() can be called without the buffer lock being held
    resulting in inodes being removed from the buffer list while other
    list operations are occurring. This causes problems with corrupted
    bp->b_io_list inode lists during filesystem shutdown, leading to
    traversals that never end, double removals from the AIL, etc.
    
    Fix this by passing the buffer to xfs_iflush_abort() if we have
    it locked. If the inode is attached to the buffer, we're going to
    have to remove it from the buffer list and we'd have to get the
    buffer off the inode log item to do that anyway.
    
    If we don't have a buffer passed in (e.g. from xfs_reclaim_inode())
    then we can determine if the inode has a log item and if it is
    attached to a buffer before we do anything else. If it does have an
    attached buffer, we can lock it safely (because the inode has a
    reference to it) and then perform the inode abort.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    d2d7c047
xfs_inode.c 106 KB