• Dave Chinner's avatar
    xfs: prefer free inodes at ENOSPC over chunk allocation · f08f984c
    Dave Chinner authored
    When an XFS filesystem has free inodes in chunks already allocated
    on disk, it will still allocate new inode chunks if the target AG
    has no free inodes in it. Normally, this is a good idea as it
    preserves locality of all the inodes in a given directory.
    
    However, at ENOSPC this can lead to using the last few remaining
    free filesystem blocks to allocate a new chunk when there are many,
    many free inodes that could be allocated without consuming free
    space. This results in speeding up the consumption of the last few
    blocks and inode create operations then returning ENOSPC when there
    free inodes available because we don't have enough block left in the
    filesystem for directory creation reservations to proceed.
    
    Hence when we are near ENOSPC, we should be attempting to preserve
    the remaining blocks for directory block allocation rather than
    using them for unnecessary inode chunk creation.
    
    This particular behaviour is exposed by xfs/294, when it drives to
    ENOSPC on empty file creation whilst there are still thousands of
    free inodes available for allocation in other AGs in the filesystem.
    
    Hence, when we are within 1% of ENOSPC, change the inode allocation
    behaviour to prefer to use existing free inodes over allocating new
    inode chunks, even though it results is poorer locality of the data
    set. It is more important for the allocations to be space efficient
    near ENOSPC than to have optimal locality for performance, so lets
    modify the inode AG selection code to reflect that fact.
    
    This allows generic/294 to not only pass with this allocator rework
    patchset, but to increase the number of post-ENOSPC empty inode
    allocations to from ~600 to ~9080 before we hit ENOSPC on the
    directory create transaction reservation.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarAllison Henderson <allison.henderson@oracle.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    f08f984c
xfs_ialloc.c 79.6 KB