On Thu, Feb 12, 2015 at 01:17:07PM -0500, Brian Foster wrote:
> Hi all,
> Here's v4 of sparse inode support for XFS. The changes are primarily
> based on Dave's review comments from v3. The highlights are a refactor
> of the on-disk inobt record format and sparse inode chunk allocation and
> record management code.
> The inobt record refactor introduces a union to distinguish the original
> on-disk format from the new format and an associated change in behavior
> where the in-core record fields can be unconditionally considered valid.
> For example, higher level code can refer to the in-core ir_count field
> regardless of whether the sparse inodes feature is enabled or not. This
> reduces the need for helpers and sb feature check clutter throughout the
> The sparse chunk allocation refactor cleans up the sparse record
> management code such that record merge and inobt updates do not involve
> multiple tree lookups. It also condenses the sparse record management
> code into a single helper (a la xfs_inobt_insert() for full inode
> chunks) that can be used for the inobt and finobt.
> Patches 1-3 are generic preparation patches that do not depend on sparse
> inode bits. Patches 4-7 introduce the sb alignment field, mount feature
> helpers and associated bits. Patches 8-12 introduce the inobt record
> data structure update and associated bits/helpers. Patches 13-17
> implement the sparse chunk and individual inode allocation and free
> mechanisms. Finally, patch 18 enables the ability to mount sparse inode
> enabled filesystems.
> Thoughts, reviews, flames appreciated...
FYI, having looked a bit into pulling some of this back into userspace,
I think I'm going to try and go back to using some of the native bitmap
routines as done in v1 rather than using the generic bitmap stuff. The
only real benefit I see is the use of bitmap_weight(), and that's just
for a debug mode check. I'm not sure it's worth the divergence the whole
thing creates with userspace.
I'll send a new version once I have something, but I'd appreciate any
feedback on the refactoring in patches 8 and 13 in the meantime...
> - Rename sb_spinoalignmt to sb_spino_align.
> - Clean up error/warning messages.
> - Use a union to differentiate old/new xfs_inobt_rec on-disk format.
> Refactor such that in-core record fields are always valid.
> - Rename/move allocmap (bitmap) helper functions and provide extra
> helper for endian conv.
> - Refactor sparse chunk allocation record management code.
> - Clean up #ifdef and label usage for DEBUG mode sparse allocs.
> - Split up and moved some generic, preparatory hunks earlier in series.
> v3: http://oss.sgi.com/archives/xfs/2015-02/msg00110.html
> - Rebase to latest for-next (bulkstat rework, data structure shuffling,
> - Fix issparse helper logic.
> - Update inode alignment model w/ spinodes enabled. All inode records
> are chunk size aligned, sparse allocations cluster size aligned (both
> enforced on mount).
> - Reworked sparse inode record merge logic to coincide w/ new alignment
> - Mark feature as experimental (warn on mount).
> - Include and use block allocation agbno range limit to prevent
> allocation of invalid inode records.
> - Add some DEBUG bits to improve sparse alloc. test coverage.
> v2: http://oss.sgi.com/archives/xfs/2014-11/msg00007.html
> - Use a manually set feature bit instead of dynamic based on the
> existence of sparse inode chunks.
> - Add sb/mp fields for sparse alloc. granularity (use instead of cluster
> - Undo xfs_inobt_insert() loop removal to avoid breakage of larger page
> size arches.
> - Rename sparse record overlap helper and do XFS_LOOKUP_LE search.
> - Use byte of pad space in inobt record for inode count field.
> - Convert bitmap mgmt to use generic bitmap code.
> - Rename XFS_INODES_PER_SPCHUNK to XFS_INODES_PER_HOLEMASK_BIT.
> - Add fs geometry bit for sparse inodes.
> - Rebase to latest for-next (bulkstat refactor).
> v1: http://oss.sgi.com/archives/xfs/2014-07/msg00355.html
> Brian Foster (18):
> xfs: create individual inode alloc. helper
> xfs: update free inode record logic to support sparse inode records
> xfs: support min/max agbno args in block allocator
> xfs: add sparse inode chunk alignment superblock field
> xfs: use sparse chunk alignment for min. inode allocation requirement
> xfs: sparse inode chunks feature helpers and mount requirements
> xfs: add fs geometry bit for sparse inode chunks
> xfs: introduce inode record hole mask for sparse inode chunks
> xfs: use actual inode count for sparse records in bulkstat/inumbers
> xfs: pass inode count through ordered icreate log item
> xfs: handle sparse inode chunks in icreate log recovery
> xfs: helpers to convert holemask to/from generic bitmap
> xfs: allocate sparse inode chunks on full chunk allocation failure
> xfs: randomly do sparse inode allocations in DEBUG mode
> xfs: filter out sparse regions from individual inode allocation
> xfs: only free allocated regions of inode chunks
> xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster()
> xfs: enable sparse inode chunks for v5 superblocks
> fs/xfs/libxfs/xfs_alloc.c | 42 ++-
> fs/xfs/libxfs/xfs_alloc.h | 2 +
> fs/xfs/libxfs/xfs_format.h | 50 +++-
> fs/xfs/libxfs/xfs_fs.h | 1 +
> fs/xfs/libxfs/xfs_ialloc.c | 533
> fs/xfs/libxfs/xfs_ialloc.h | 12 +-
> fs/xfs/libxfs/xfs_ialloc_btree.c | 123 ++++++++-
> fs/xfs/libxfs/xfs_ialloc_btree.h | 14 +
> fs/xfs/libxfs/xfs_sb.c | 30 ++-
> fs/xfs/xfs_fsops.c | 4 +-
> fs/xfs/xfs_inode.c | 28 +-
> fs/xfs/xfs_itable.c | 13 +-
> fs/xfs/xfs_log_recover.c | 26 +-
> fs/xfs/xfs_mount.c | 16 ++
> fs/xfs/xfs_mount.h | 2 +
> fs/xfs/xfs_trace.h | 47 ++++
> 16 files changed, 857 insertions(+), 86 deletions(-)
> xfs mailing list