[XFS] Prevent free space oversubscription and xfssyncd looping.
authorDavid Chinner <dgc@sgi.com>
Thu, 7 Sep 2006 04:26:50 +0000 (14:26 +1000)
committerDavid Chatterton <chatz@sgi.com>
Thu, 7 Sep 2006 04:26:50 +0000 (14:26 +1000)
commit4be536debe3f7b0c62283e77fd6bd8bdb9f83c6f
tree0b1ce616c52cb659fc4341afb13bcccaa2499b6c
parent10387e5eb45c6e48d67102b88229f5bc6037461c
[XFS] Prevent free space oversubscription and xfssyncd looping.

The fix for recent ENOSPC deadlocks introduced certain limitations on
allocations. The fix could cause xfssyncd to loop endlessly if we did not
leave some space free for the allocator to work correctly. Basically, we
needed to ensure that we had at least 4 blocks free for an AG free list
and a block for the inode bmap btree at all times.

However, this did not take into account the fact that each AG has a free
list that needs 4 blocks. Hence any filesystem with more than one AG could
cause oversubscription of free space and make xfssyncd spin forever trying
to allocate space needed for AG freelists that was not available in the
AG.

The following patch reserves space for the free lists in all AGs plus the
inode bmap btree which prevents oversubscription. It also prevents those
blocks from being reported as free space (as they can never be used) and
makes the SMP in-core superblock accounting code and the reserved block
ioctl respect this requirement.

SGI-PV: 955674
SGI-Modid: xfs-linux-melb:xfs-kern:26894a

Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: David Chatterton <chatz@sgi.com>
fs/xfs/xfs_alloc.h
fs/xfs/xfs_fsops.c
fs/xfs/xfs_mount.c
fs/xfs/xfs_vfsops.c