• Dave Chinner's avatar
    xfs: fix premature enospc on inode allocation · 7a1df156
    Dave Chinner authored
    After growing a filesystem, XFS can fail to allocate inodes even
    though there is a large amount of space available in the filesystem
    for inodes. The issue is caused by a nearly full allocation group
    having enough free space in it to be considered for inode
    allocation, but not enough contiguous free space to actually
    allocation inodes.  This situation results in successful selection
    of the AG for allocation, then failure of the allocation resulting
    in ENOSPC being reported to the caller.
    
    It is caused by two possible issues. Firstly, we only consider the
    lognest free extent and whether it would fit an inode chunk. If the
    extent is not correctly aligned, then we can't allocate an inode
    chunk in it regardless of the fact that it is large enough. This
    tends to be a permanent error until space in the AG is freed.
    
    The second issue is that we don't actually lock the AGI or AGF when
    we are doing these checks, and so by the time we get to actually
    allocating the inode chunk the space we thought we had in the AG may
    have been allocated. This tends to be a spurious error as it
    requires a race to trigger. Hence this case is ignored in this patch
    as the reported problem is for permanent errors.
    
    The first issue could be addressed by simply taking into account the
    alignment when checking the longest extent. This, however, would
    prevent allocation in AGs that have aligned, exact sized extents
    free. However, this case should be fairly rare compared to the
    number of allocations that occur near ENOSPC that would trigger this
    condition.
    
    Hence, when selecting the inode AG, take into account the inode
    cluster alignment when checking the lognest free extent in the AG.
    If we can't find any AGs with a contiguous free space large
    enough to be aligned, drop the alignment addition and just try for
    an AG that has enough contiguous free space available for an inode
    chunk. This won't prevent issues from occurring, but should avoid
    situations where other AGs have lots of free space but the selected
    AG can't allocate due to alignment constraints.
    Reported-by: default avatarArkadiusz Miskiewicz <arekm@maven.pl>
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    7a1df156
xfs_ialloc.c 57.8 KB