btrfs: qgroup: use xarray to track dirty extents in transaction
authorJunchao Sun <sunjunchao2870@gmail.com>
Fri, 7 Jun 2024 14:30:21 +0000 (22:30 +0800)
committerDavid Sterba <dsterba@suse.com>
Tue, 10 Sep 2024 14:51:18 +0000 (16:51 +0200)
commit3cce39a8ca4e7565b6ac1fbcf858171bf07c3757
treed4b39b6b9c5029c51ae0c1198821e844e6d5ef11
parent14ed830d10322007565af3a0da39948f229a72d6
btrfs: qgroup: use xarray to track dirty extents in transaction

Use xarray to track dirty extents to reduce the size of the struct
btrfs_qgroup_extent_record from 64 bytes to 40 bytes.  The xarray is
more cache line friendly, it also reduces the complexity of insertion
and search code compared to rb tree.

Another change introduced is about error handling.  Before this patch,
the result of btrfs_qgroup_trace_extent_nolock() is always a success. In
this patch, because of this function calls the function xa_store() which
has the possibility to fail, so mark qgroup as inconsistent if error
happened and then free preallocated memory. Also we preallocate memory
before spin_lock(), if memory preallcation failed, error handling is the
same the existing code.

Suggested-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Junchao Sun <sunjunchao2870@gmail.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/delayed-ref.c
fs/btrfs/delayed-ref.h
fs/btrfs/qgroup.c
fs/btrfs/qgroup.h
fs/btrfs/transaction.c