mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	btrfs: delayed_ref: Add new function to record reserved space into delayed ref
Add new function btrfs_add_delayed_qgroup_reserve() function to record how much space is reserved for that extent. As btrfs only accounts qgroup at run_delayed_refs() time, so newly allocated extent should keep the reserved space until then. So add needed function with related members to do it. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
		
							parent
							
								
									f695fdcef8
								
							
						
					
					
						commit
						f64d5ca868
					
				
					 2 changed files with 43 additions and 0 deletions
				
			
		|  | @ -476,6 +476,8 @@ add_delayed_ref_head(struct btrfs_fs_info *fs_info, | |||
| 	INIT_LIST_HEAD(&head_ref->ref_list); | ||||
| 	head_ref->processing = 0; | ||||
| 	head_ref->total_ref_mod = count_mod; | ||||
| 	head_ref->qgroup_reserved = 0; | ||||
| 	head_ref->qgroup_ref_root = 0; | ||||
| 
 | ||||
| 	/* Record qgroup extent info if provided */ | ||||
| 	if (qrecord) { | ||||
|  | @ -746,6 +748,33 @@ int btrfs_add_delayed_data_ref(struct btrfs_fs_info *fs_info, | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int btrfs_add_delayed_qgroup_reserve(struct btrfs_fs_info *fs_info, | ||||
| 				     struct btrfs_trans_handle *trans, | ||||
| 				     u64 ref_root, u64 bytenr, u64 num_bytes) | ||||
| { | ||||
| 	struct btrfs_delayed_ref_root *delayed_refs; | ||||
| 	struct btrfs_delayed_ref_head *ref_head; | ||||
| 	int ret = 0; | ||||
| 
 | ||||
| 	if (!fs_info->quota_enabled || !is_fstree(ref_root)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	delayed_refs = &trans->transaction->delayed_refs; | ||||
| 
 | ||||
| 	spin_lock(&delayed_refs->lock); | ||||
| 	ref_head = find_ref_head(&delayed_refs->href_root, bytenr, 0); | ||||
| 	if (!ref_head) { | ||||
| 		ret = -ENOENT; | ||||
| 		goto out; | ||||
| 	} | ||||
| 	WARN_ON(ref_head->qgroup_reserved || ref_head->qgroup_ref_root); | ||||
| 	ref_head->qgroup_ref_root = ref_root; | ||||
| 	ref_head->qgroup_reserved = num_bytes; | ||||
| out: | ||||
| 	spin_unlock(&delayed_refs->lock); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| int btrfs_add_delayed_extent_op(struct btrfs_fs_info *fs_info, | ||||
| 				struct btrfs_trans_handle *trans, | ||||
| 				u64 bytenr, u64 num_bytes, | ||||
|  |  | |||
|  | @ -112,6 +112,17 @@ struct btrfs_delayed_ref_head { | |||
| 	 */ | ||||
| 	int total_ref_mod; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * For qgroup reserved space freeing. | ||||
| 	 * | ||||
| 	 * ref_root and reserved will be recorded after | ||||
| 	 * BTRFS_ADD_DELAYED_EXTENT is called. | ||||
| 	 * And will be used to free reserved qgroup space at | ||||
| 	 * run_delayed_refs() time. | ||||
| 	 */ | ||||
| 	u64 qgroup_ref_root; | ||||
| 	u64 qgroup_reserved; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * when a new extent is allocated, it is just reserved in memory | ||||
| 	 * The actual extent isn't inserted into the extent allocation tree | ||||
|  | @ -242,6 +253,9 @@ int btrfs_add_delayed_data_ref(struct btrfs_fs_info *fs_info, | |||
| 			       u64 owner, u64 offset, int action, | ||||
| 			       struct btrfs_delayed_extent_op *extent_op, | ||||
| 			       int no_quota); | ||||
| int btrfs_add_delayed_qgroup_reserve(struct btrfs_fs_info *fs_info, | ||||
| 				     struct btrfs_trans_handle *trans, | ||||
| 				     u64 ref_root, u64 bytenr, u64 num_bytes); | ||||
| int btrfs_add_delayed_extent_op(struct btrfs_fs_info *fs_info, | ||||
| 				struct btrfs_trans_handle *trans, | ||||
| 				u64 bytenr, u64 num_bytes, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Qu Wenruo
						Qu Wenruo