Skip to content

Commit df2c95f

Browse files
Qu Wenruomasoncl
authored andcommitted
btrfs: qgroup: Fix qgroup incorrectness caused by log replay
When doing log replay at mount time(after power loss), qgroup will leak numbers of replayed data extents. The cause is almost the same of balance. So fix it by manually informing qgroup for owner changed extents. The bug can be detected by btrfs/119 test case. Cc: Mark Fasheh <[email protected]> Signed-off-by: Qu Wenruo <[email protected]> Reviewed-and-Tested-by: Goldwyn Rodrigues <[email protected]> Signed-off-by: David Sterba <[email protected]> Signed-off-by: Chris Mason <[email protected]>
1 parent 62b9954 commit df2c95f

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

fs/btrfs/tree-log.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "backref.h"
2828
#include "hash.h"
2929
#include "compression.h"
30+
#include "qgroup.h"
3031

3132
/* magic values for the inode_only field in btrfs_log_inode:
3233
*
@@ -680,6 +681,21 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,
680681
ins.type = BTRFS_EXTENT_ITEM_KEY;
681682
offset = key->offset - btrfs_file_extent_offset(eb, item);
682683

684+
/*
685+
* Manually record dirty extent, as here we did a shallow
686+
* file extent item copy and skip normal backref update,
687+
* but modifying extent tree all by ourselves.
688+
* So need to manually record dirty extent for qgroup,
689+
* as the owner of the file extent changed from log tree
690+
* (doesn't affect qgroup) to fs/file tree(affects qgroup)
691+
*/
692+
ret = btrfs_qgroup_insert_dirty_extent(trans, root->fs_info,
693+
btrfs_file_extent_disk_bytenr(eb, item),
694+
btrfs_file_extent_disk_num_bytes(eb, item),
695+
GFP_NOFS);
696+
if (ret < 0)
697+
goto out;
698+
683699
if (ins.objectid > 0) {
684700
u64 csum_start;
685701
u64 csum_end;

0 commit comments

Comments
 (0)