• Brian Foster's avatar
    xfs: update free inode record logic to support sparse inode records · 999633d3
    Brian Foster authored
    xfs_difree_inobt() uses logic in a couple places that assume inobt
    records refer to fully allocated chunks. Specifically, the use of
    mp->m_ialloc_inos can cause problems for inode chunks that are sparsely
    allocated. Sparse inode chunks can, by definition, define a smaller
    number of inodes than a full inode chunk.
    
    Fix the logic that determines whether an inode record should be removed
    from the inobt to use the ir_free mask rather than ir_freecount. Fix the
    agi counters modification to use ir_freecount to add the actual number
    of inodes freed rather than assuming a full inode chunk.
    
    Also make sure that we preserve the behavior to not remove inode chunks
    if the block size is large enough for multiple inode chunks (e.g.,
    bsize=64k, isize=512). This behavior was previously implicit in that in
    such configurations, ir.freecount of a single record never matches
    m_ialloc_inos. Hence, add some comments as well.
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    999633d3
xfs_ialloc.c 58.5 KB