diff options
Diffstat (limited to 'fs/btrfs/delayed-ref.c')
| -rw-r--r-- | fs/btrfs/delayed-ref.c | 19 | 
1 files changed, 14 insertions, 5 deletions
diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index 9e98295de7ce..e1b0651686f7 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c @@ -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;  |