linux/fs/xfs/libxfs
Darrick J. Wong 84d6961910 xfs: preallocate blocks for worst-case btree expansion
To gracefully handle the situation where a CoW operation turns a
single refcount extent into a lot of tiny ones and then run out of
space when a tree split has to happen, use the per-AG reserved block
pool to pre-allocate all the space we'll ever need for a maximal
btree.  For a 4K block size, this only costs an overhead of 0.3% of
available disk space.

When reflink is enabled, we have an unfortunate problem with rmap --
since we can share a block billions of times, this means that the
reverse mapping btree can expand basically infinitely.  When an AG is
so full that there are no free blocks with which to expand the rmapbt,
the filesystem will shut down hard.

This is rather annoying to the user, so use the AG reservation code to
reserve a "reasonable" amount of space for rmap.  We'll prevent
reflinks and CoW operations if we think we're getting close to
exhausting an AG's free space rather than shutting down, but this
permanent reservation should be enough for "most" users.  Hopefully.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
[hch@lst.de: ensure that we invalidate the freed btree buffer]
Signed-off-by: Christoph Hellwig <hch@lst.de>
2016-10-05 16:26:27 -07:00
..
xfs_ag_resv.c xfs: preallocate blocks for worst-case btree expansion 2016-10-05 16:26:27 -07:00
xfs_ag_resv.h xfs: set up per-AG free space reservations 2016-09-19 10:30:52 +10:00
xfs_alloc.c xfs: reserve AG space for the refcount btree root 2016-10-03 09:11:24 -07:00
xfs_alloc.h Merge branch 'xfs-4.9-log-recovery-fixes' into for-next 2016-10-03 09:56:28 +11:00
xfs_alloc_btree.c xfs: remove the get*keys and update_keys btree ops pointers 2016-08-03 12:22:12 +10:00
xfs_alloc_btree.h
xfs_attr.c xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_attr_leaf.c xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_attr_leaf.h xfs: make several functions static 2016-06-01 17:38:15 +10:00
xfs_attr_remote.c xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_attr_remote.h
xfs_attr_sf.h xfs: move struct xfs_attr_shortform to xfs_da_format.h 2016-02-08 15:00:01 +11:00
xfs_bit.c libxfs: Optimize the loop for xfs_bitmap_empty 2016-01-04 16:10:19 +11:00
xfs_bit.h
xfs_bmap.c xfs: create a separate cow extent size hint for the allocator 2016-10-05 16:26:26 -07:00
xfs_bmap.h xfs: support removing extents from CoW fork 2016-10-05 13:55:40 -07:00
xfs_bmap_btree.c xfs: introduce the CoW fork 2016-10-04 18:06:40 -07:00
xfs_bmap_btree.h
xfs_btree.c xfs: define the on-disk refcount btree format 2016-10-03 09:11:18 -07:00
xfs_btree.h xfs: define the on-disk refcount btree format 2016-10-03 09:11:18 -07:00
xfs_cksum.h
xfs_da_btree.c xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_da_btree.h xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_da_format.c xfs: kill xfs_dir2_inou_t 2016-07-20 11:48:31 +10:00
xfs_da_format.h xfs: fix attr shortform structure alignment on cris 2016-08-03 10:59:42 +10:00
xfs_defer.c xfs: defer should allow ->finish_item to request a new transaction 2016-09-19 10:26:25 +10:00
xfs_defer.h xfs: implement deferred bmbt map/unmap operations 2016-10-04 11:05:44 -07:00
xfs_dir2.c xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_dir2.h xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_dir2_block.c xfs: print name of verifier if it fails 2016-01-04 16:10:19 +11:00
xfs_dir2_data.c xfs: print name of verifier if it fails 2016-01-04 16:10:19 +11:00
xfs_dir2_leaf.c xfs: print name of verifier if it fails 2016-01-04 16:10:19 +11:00
xfs_dir2_node.c xfs: always set rvalp in xfs_dir2_node_trim_free 2016-03-15 11:44:18 +11:00
xfs_dir2_priv.h xfs: move type conversion functions to xfs_dir.h 2014-12-04 09:43:17 +11:00
xfs_dir2_sf.c xfs: kill xfs_dir2_inou_t 2016-07-20 11:48:31 +10:00
xfs_dquot_buf.c xfs: handle dquot buffer readahead in log recovery correctly 2016-01-12 07:04:01 +11:00
xfs_format.h xfs: create a separate cow extent size hint for the allocator 2016-10-05 16:26:26 -07:00
xfs_fs.h xfs: create a separate cow extent size hint for the allocator 2016-10-05 16:26:26 -07:00
xfs_ialloc.c xfs: add owner field to extent allocation and freeing 2016-08-03 11:33:42 +10:00
xfs_ialloc.h xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_ialloc_btree.c xfs: set up per-AG free space reservations 2016-09-19 10:30:52 +10:00
xfs_ialloc_btree.h xfs: allocate sparse inode chunks on full chunk allocation failure 2015-05-29 09:18:32 +10:00
xfs_inode_buf.c xfs: create a separate cow extent size hint for the allocator 2016-10-05 16:26:26 -07:00
xfs_inode_buf.h xfs: create a separate cow extent size hint for the allocator 2016-10-05 16:26:26 -07:00
xfs_inode_fork.c xfs: introduce the CoW fork 2016-10-04 18:06:40 -07:00
xfs_inode_fork.h xfs: introduce the CoW fork 2016-10-04 18:06:40 -07:00
xfs_log_format.h xfs: create a separate cow extent size hint for the allocator 2016-10-05 16:26:26 -07:00
xfs_log_recover.h xfs: support a crc verification only log record pass 2016-01-04 15:55:10 +11:00
xfs_log_rlimit.c xfs: move most of xfs_sb.h to xfs_format.h 2014-11-28 14:27:09 +11:00
xfs_quota_defs.h xfs: wire up Q_XGETNEXTQUOTA / get_nextdqblk 2016-02-08 11:27:38 +11:00
xfs_refcount.c xfs: store in-progress CoW allocations in the refcount btree 2016-10-05 16:26:05 -07:00
xfs_refcount.h xfs: store in-progress CoW allocations in the refcount btree 2016-10-05 16:26:05 -07:00
xfs_refcount_btree.c xfs: preallocate blocks for worst-case btree expansion 2016-10-05 16:26:27 -07:00
xfs_refcount_btree.h xfs: preallocate blocks for worst-case btree expansion 2016-10-05 16:26:27 -07:00
xfs_rmap.c xfs: introduce the CoW fork 2016-10-04 18:06:40 -07:00
xfs_rmap.h xfs: propagate bmap updates to rmapbt 2016-08-03 12:16:05 +10:00
xfs_rmap_btree.c xfs: preallocate blocks for worst-case btree expansion 2016-10-05 16:26:27 -07:00
xfs_rmap_btree.h xfs: preallocate blocks for worst-case btree expansion 2016-10-05 16:26:27 -07:00
xfs_rtbitmap.c xfs: make several functions static 2016-06-01 17:38:15 +10:00
xfs_sb.c xfs: define the on-disk refcount btree format 2016-10-03 09:11:18 -07:00
xfs_sb.h xfs: remove unused function definitions 2016-02-08 14:58:07 +11:00
xfs_shared.h xfs: define the on-disk refcount btree format 2016-10-03 09:11:18 -07:00
xfs_symlink_remote.c xfs: print name of verifier if it fails 2016-01-04 16:10:19 +11:00
xfs_trans_resv.c xfs: account for the refcount btree in the alloc/free log reservation 2016-10-03 09:11:19 -07:00
xfs_trans_resv.h xfs: define the on-disk refcount btree format 2016-10-03 09:11:18 -07:00
xfs_trans_space.h xfs: clean up XFS_MIN_FREELIST macros 2015-06-22 10:13:30 +10:00
xfs_types.h xfs: introduce the CoW fork 2016-10-04 18:06:40 -07:00