btrfs: zoned: fix double counting of split ordered extent
btrfs_add_ordered_extent_*() add num_bytes to fs_info->ordered_bytes.
Then, splitting an ordered extent will call btrfs_add_ordered_extent_*()
again for split extents, leading to double counting of the region of
a split extent. These leaked bytes are finally reported at unmount time
as follow:
BTRFS info (device dm-1): at unmount dio bytes count 364544
Fix the double counting by subtracting split extent's size from
fs_info->ordered_bytes.
Fixes: d22002fd37 ("btrfs: zoned: split ordered extent when bio is sent")
CC: stable@vger.kernel.org # 5.12+
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
committed by
David Sterba
parent
c124706900
commit
f79645df80
@@ -1049,6 +1049,7 @@ static int clone_ordered_extent(struct btrfs_ordered_extent *ordered, u64 pos,
|
|||||||
u64 len)
|
u64 len)
|
||||||
{
|
{
|
||||||
struct inode *inode = ordered->inode;
|
struct inode *inode = ordered->inode;
|
||||||
|
struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
|
||||||
u64 file_offset = ordered->file_offset + pos;
|
u64 file_offset = ordered->file_offset + pos;
|
||||||
u64 disk_bytenr = ordered->disk_bytenr + pos;
|
u64 disk_bytenr = ordered->disk_bytenr + pos;
|
||||||
u64 num_bytes = len;
|
u64 num_bytes = len;
|
||||||
@@ -1066,6 +1067,13 @@ static int clone_ordered_extent(struct btrfs_ordered_extent *ordered, u64 pos,
|
|||||||
else
|
else
|
||||||
type = __ffs(flags_masked);
|
type = __ffs(flags_masked);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The splitting extent is already counted and will be added again
|
||||||
|
* in btrfs_add_ordered_extent_*(). Subtract num_bytes to avoid
|
||||||
|
* double counting.
|
||||||
|
*/
|
||||||
|
percpu_counter_add_batch(&fs_info->ordered_bytes, -num_bytes,
|
||||||
|
fs_info->delalloc_batch);
|
||||||
if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered->flags)) {
|
if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered->flags)) {
|
||||||
WARN_ON_ONCE(1);
|
WARN_ON_ONCE(1);
|
||||||
ret = btrfs_add_ordered_extent_compress(BTRFS_I(inode),
|
ret = btrfs_add_ordered_extent_compress(BTRFS_I(inode),
|
||||||
|
|||||||
Reference in New Issue
Block a user