|
@@ -27,6 +27,7 @@
|
|
|
#include "backref.h"
|
|
|
#include "hash.h"
|
|
|
#include "compression.h"
|
|
|
+#include "qgroup.h"
|
|
|
|
|
|
/* magic values for the inode_only field in btrfs_log_inode:
|
|
|
*
|
|
@@ -680,6 +681,21 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,
|
|
|
ins.type = BTRFS_EXTENT_ITEM_KEY;
|
|
|
offset = key->offset - btrfs_file_extent_offset(eb, item);
|
|
|
|
|
|
+ /*
|
|
|
+ * Manually record dirty extent, as here we did a shallow
|
|
|
+ * file extent item copy and skip normal backref update,
|
|
|
+ * but modifying extent tree all by ourselves.
|
|
|
+ * So need to manually record dirty extent for qgroup,
|
|
|
+ * as the owner of the file extent changed from log tree
|
|
|
+ * (doesn't affect qgroup) to fs/file tree(affects qgroup)
|
|
|
+ */
|
|
|
+ ret = btrfs_qgroup_insert_dirty_extent(trans, root->fs_info,
|
|
|
+ btrfs_file_extent_disk_bytenr(eb, item),
|
|
|
+ btrfs_file_extent_disk_num_bytes(eb, item),
|
|
|
+ GFP_NOFS);
|
|
|
+ if (ret < 0)
|
|
|
+ goto out;
|
|
|
+
|
|
|
if (ins.objectid > 0) {
|
|
|
u64 csum_start;
|
|
|
u64 csum_end;
|