This series refactors chunk allocation, device_extent allocation and extent allocation functions and make them generalized to be able to implement other allocation policy easily. On top of this series, we can simplify some part of the "btrfs: zoned block device support" series as adding a new type of chunk allocator and extent allocator for zoned block devices. Furthermore, we will be able to implement and test some other allocator in the idea page of the wiki e.g. SSD caching, dedicated metadata drive, chunk allocation groups, and so on. This series has no functional changes except introducing "enum btrfs_chunk_allocation_policy" and "enum btrfs_extent_allocation_policy". * Refactoring chunk/dev_extent allocator Two functions are separated from find_free_dev_extent_start(). dev_extent_search_start() decides the starting position of the search. dev_extent_hole_check() checks if a hole found is suitable for device extent allocation. __btrfs_alloc_chunk() is split into four functions. set_parameters() initializes the parameters of an allocation. gather_device_info() loops over devices and gather information of them. decide_stripe_size() decides the size of chunk and device_extent. And, create_chunk() creates a chunk and device extents. * Refactoring extent allocator Three functions are introduced in find_free_extent(). prepare_allocation() initializes the parameters and gives a hint byte to start the allocation with. do_allocation() handles the actual allocation in a given block group. release_block_group() is called when it gives up an allocation from a block group, so the allocation context should be reset. Two functions are introduced in find_free_extent_update_loop(). found_extent() is called when the allocator finally find a proper extent. chunk_allocation_failed() is called when it failed to allocate a new chunk. An allocator implementation can use this hook to set the next stage to try e.g. LOOP_NO_EMPTY_SIZE. Furthermore, LOOP_NO_EMPTY_SIZE stage is tweaked so that other allocator than the current clustered allocator skips this stage. * Patch organization Patch 1 is a trivial patch to fix the type of an argument of find_free_extent_update_loop(). Patch 2 removes a BUG_ON from __btrfs_alloc_chunk(). Patches 3-10 refactors chunk and device_extent allocation functions: find_free_dev_extent_start() and __btrfs_alloc_chunk(). Patches 11-21 refactors extent allocation function: find_free_extent() and find_free_extent_update_loop(). * Changelog - v2 - Stop separating "clustered_alloc_info" from find_free_extent_ctl - Change return type of dev_extent_hole_check() to bool - Rename set_parameters() to init_alloc_chunk_ctl() - Add a patch to remove BUG_ON from __btrfs_alloc_chunk() Naohiro Aota (21): btrfs: change type of full_search to bool btrfs: do not BUG_ON with invalid profile btrfs: introduce chunk allocation policy btrfs: refactor find_free_dev_extent_start() btrfs: introduce alloc_chunk_ctl btrfs: factor out init_alloc_chunk_ctl btrfs: factor out gather_device_info() btrfs: factor out decide_stripe_size() btrfs: factor out create_chunk() btrfs: parameterize dev_extent_min btrfs: introduce extent allocation policy btrfs: move hint_byte into find_free_extent_ctl btrfs: move vairalbes for clustered allocation into find_free_extent_ctl btrfs: factor out do_allocation() btrfs: drop unnecessary arguments from clustered allocation functions btrfs: factor out release_block_group() btrfs: factor out found_extent() btrfs: drop unnecessary arguments from find_free_extent_update_loop() btrfs: factor out chunk_allocation_failed() btrfs: skip LOOP_NO_EMPTY_SIZE if not clustered allocation btrfs: factor out prepare_allocation() fs/btrfs/extent-tree.c | 313 +++++++++++++++++++++----------- fs/btrfs/volumes.c | 398 +++++++++++++++++++++++++++-------------- fs/btrfs/volumes.h | 6 + 3 files changed, 481 insertions(+), 236 deletions(-) -- 2.25.0