|
@@ -540,8 +540,10 @@ add_delayed_ref_head(struct btrfs_fs_info *fs_info,
|
|
|
struct btrfs_delayed_ref_head *head_ref,
|
|
|
struct btrfs_qgroup_extent_record *qrecord,
|
|
|
u64 bytenr, u64 num_bytes, u64 ref_root, u64 reserved,
|
|
|
- int action, int is_data, int *qrecord_inserted_ret,
|
|
|
+ int action, int is_data, int is_system,
|
|
|
+ int *qrecord_inserted_ret,
|
|
|
int *old_ref_mod, int *new_ref_mod)
|
|
|
+
|
|
|
{
|
|
|
struct btrfs_delayed_ref_head *existing;
|
|
|
struct btrfs_delayed_ref_root *delayed_refs;
|
|
@@ -585,6 +587,7 @@ add_delayed_ref_head(struct btrfs_fs_info *fs_info,
|
|
|
head_ref->ref_mod = count_mod;
|
|
|
head_ref->must_insert_reserved = must_insert_reserved;
|
|
|
head_ref->is_data = is_data;
|
|
|
+ head_ref->is_system = is_system;
|
|
|
head_ref->ref_tree = RB_ROOT;
|
|
|
INIT_LIST_HEAD(&head_ref->ref_add_list);
|
|
|
RB_CLEAR_NODE(&head_ref->href_node);
|
|
@@ -772,6 +775,7 @@ int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info,
|
|
|
struct btrfs_delayed_ref_root *delayed_refs;
|
|
|
struct btrfs_qgroup_extent_record *record = NULL;
|
|
|
int qrecord_inserted;
|
|
|
+ int is_system = (ref_root == BTRFS_CHUNK_TREE_OBJECTID);
|
|
|
|
|
|
BUG_ON(extent_op && extent_op->is_data);
|
|
|
ref = kmem_cache_alloc(btrfs_delayed_tree_ref_cachep, GFP_NOFS);
|
|
@@ -800,8 +804,8 @@ int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info,
|
|
|
*/
|
|
|
head_ref = add_delayed_ref_head(fs_info, trans, head_ref, record,
|
|
|
bytenr, num_bytes, 0, 0, action, 0,
|
|
|
- &qrecord_inserted, old_ref_mod,
|
|
|
- new_ref_mod);
|
|
|
+ is_system, &qrecord_inserted,
|
|
|
+ old_ref_mod, new_ref_mod);
|
|
|
|
|
|
add_delayed_tree_ref(fs_info, trans, head_ref, &ref->node, bytenr,
|
|
|
num_bytes, parent, ref_root, level, action);
|
|
@@ -868,7 +872,7 @@ int btrfs_add_delayed_data_ref(struct btrfs_fs_info *fs_info,
|
|
|
*/
|
|
|
head_ref = add_delayed_ref_head(fs_info, trans, head_ref, record,
|
|
|
bytenr, num_bytes, ref_root, reserved,
|
|
|
- action, 1, &qrecord_inserted,
|
|
|
+ action, 1, 0, &qrecord_inserted,
|
|
|
old_ref_mod, new_ref_mod);
|
|
|
|
|
|
add_delayed_data_ref(fs_info, trans, head_ref, &ref->node, bytenr,
|
|
@@ -898,9 +902,14 @@ int btrfs_add_delayed_extent_op(struct btrfs_fs_info *fs_info,
|
|
|
delayed_refs = &trans->transaction->delayed_refs;
|
|
|
spin_lock(&delayed_refs->lock);
|
|
|
|
|
|
+ /*
|
|
|
+ * extent_ops just modify the flags of an extent and they don't result
|
|
|
+ * in ref count changes, hence it's safe to pass false/0 for is_system
|
|
|
+ * argument
|
|
|
+ */
|
|
|
add_delayed_ref_head(fs_info, trans, head_ref, NULL, bytenr,
|
|
|
num_bytes, 0, 0, BTRFS_UPDATE_DELAYED_HEAD,
|
|
|
- extent_op->is_data, NULL, NULL, NULL);
|
|
|
+ extent_op->is_data, 0, NULL, NULL, NULL);
|
|
|
|
|
|
spin_unlock(&delayed_refs->lock);
|
|
|
return 0;
|