I had recently started prototyping a mechanism to do inode preallocation
and deferred removal and one of my goals for that work was to also
handle the existing problem where inode chunks are never removed on
filesystems with large block sizes. While hashing the prealloc work out,
it became apparent that the large block size problem could stand on its
The problem is that for fs' where the number of inodes per block is
larger than 64 (e.g., -bsize=64k -isize=512b), a single inode chunk
requires more than one inobt record. For such fs', we don't currently
have enough context on inode removal to determine whether records other
than those for the particular inode can be removed. As such, inode
chunks are never freed. This series aims to provide enough context so
that inode records can be removed once the entire chunk is free.
Patch 1 introduces a new multi-record deletion helper but does not
change existing behavior. Patch 2 is the bulk of the enhancement. In a
nutshell, it provides a mechanism to determine whether an inode chunk
that spans one or more inobt records is completely free and to remove
the entire chunk if so. Patch 3 introduces some inobt record management
So far this has seen medium testing on ppc64 with various block sizes up
to 64k (single and multiple inobt record per chunk configurations).
Thoughts, reviews, flames appreciated.
P.S., Note that this series applies on top of the sparse inode series.
Brian Foster (3):
xfs: create helper to delete multiple inobt records
xfs: remove entire inode chunks when all inodes are free
xfs: inobt record insert/delete tracepoints
fs/xfs/libxfs/xfs_ialloc.c | 270 +++++++++++++++++++++++++++++++++++++++++----
fs/xfs/xfs_trace.h | 32 ++++++
2 files changed, 281 insertions(+), 21 deletions(-)