btrfs: clear defragmented inodes using postorder in btrfs_cleanup_defrag_inodes()
authorDavid Sterba <dsterba@suse.com>
Tue, 27 Aug 2024 02:05:48 +0000 (04:05 +0200)
committerDavid Sterba <dsterba@suse.com>
Tue, 10 Sep 2024 14:51:19 +0000 (16:51 +0200)
commit276940915f232f8569124811fd8a9524f27f5748
tree3ed84fee9e666e802ba93c11f22847f046bb5d4b
parentffc531652d1039b2c5049a58814d74352f684837
btrfs: clear defragmented inodes using postorder in btrfs_cleanup_defrag_inodes()

btrfs_cleanup_defrag_inodes() is not called frequently, only in remount
or unmount, but the way it frees the inodes in fs_info->defrag_inodes
is inefficient. Each time it needs to locate first node, remove it,
potentially rebalance tree until it's done. This allows to do a
conditional reschedule.

For cleanups the rbtree_postorder_for_each_entry_safe() iterator is
convenient but we can't reschedule and restart iteration because some of
the tree nodes would be already freed.

The cleanup operation is kmem_cache_free() which will likely take the
fast path for most objects so rescheduling should not be necessary.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/defrag.c