• Eric Sandeen's avatar
    xfs: allow inode allocations in post-growfs disk space · d1f8a33f
    Eric Sandeen authored
    commit 9de67c3b upstream.
    
    Today, if we perform an xfs_growfs which adds allocation groups,
    mp->m_maxagi is not properly updated when the growfs is complete.
    
    Therefore inodes will continue to be allocated only in the
    AGs which existed prior to the growfs, and the new space
    won't be utilized.
    
    This is because of this path in xfs_growfs_data_private():
    
    xfs_growfs_data_private
    	xfs_initialize_perag(mp, nagcount, &nagimax);
    		if (mp->m_flags & XFS_MOUNT_32BITINODES)
    			index = xfs_set_inode32(mp);
    		else
    			index = xfs_set_inode64(mp);
    
    		if (maxagi)
    			*maxagi = index;
    
    where xfs_set_inode* iterates over the (old) agcount in
    mp->m_sb.sb_agblocks, which has not yet been updated
    in the growfs path.  So "index" will be returned based on
    the old agcount, not the new one, and new AGs are not available
    for inode allocation.
    
    Fix this by explicitly passing the proper AG count (which
    xfs_initialize_perag() already has) down another level,
    so that xfs_set_inode* can make the proper decision about
    acceptable AGs for inode allocation in the potentially
    newly-added AGs.
    
    This has been broken since 3.7, when these two
    xfs_set_inode* functions were added in commit 2d2194f6.
    Prior to that, we looped over "agcount" not sb_agblocks
    in these calculations.
    Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    d1f8a33f
xfs_super.c 48.2 KB