• David Chinner's avatar
    [XFS] Account for inode cluster alignment in all allocations · 75de2a91
    David Chinner authored
    At ENOSPC, we can get a filesystem shutdown due to a cancelling a dirty
    transaction in xfs_mkdir or xfs_create. This is due to the initial
    allocation attempt not taking into account inode alignment and hence we
    can prepare the AGF freelist for allocation when it's not actually
    possible to do an allocation. This results in inode allocation returning
    ENOSPC with a dirty transaction, and hence we shut down the filesystem.
    
    Because the first allocation is an exact allocation attempt, we must tell
    the allocator that the alignment does not affect the allocation attempt.
    i.e. we will accept any extent alignment as long as the extent starts at
    the block we want. Unfortunately, this means that if the longest free
    extent is less than the length + alignment necessary for fallback
    allocation attempts but is long enough to attempt a non-aligned
    allocation, we will modify the free list.
    
    If we then have the exact allocation fail, all other allocation attempts
    will also fail due to the alignment constraint being taken into account.
    Hence the initial attempt needs to set the "alignment slop" field so that
    alignment, while not required, must be taken into account when determining
    if there is enough space left in the AG to do the allocation.
    
    That means if the exact allocation fails, we will not dirty the freelist
    if there is not enough space available fo a subsequent allocation to
    succeed. Hence we get an ENOSPC error back to userspace without shutting
    down the filesystem.
    
    SGI-PV: 978886
    SGI-Modid: xfs-linux-melb:xfs-kern:30699a
    Signed-off-by: default avatarDavid Chinner <dgc@sgi.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@infradead.org>
    Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
    75de2a91
xfs_ialloc.c 41.7 KB