mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	btrfs: Move qgroup rescan on quota enable to btrfs_quota_enable
Currently btrfs_run_qgroups is doing a bit too much. Not only is it responsible for synchronizing in-memory state of qgroups to disk but it also contains code to trigger the initial qgroup rescan when quota is enabled initially. This condition is detected by checking that BTRFS_FS_QUOTA_ENABLED is not set and BTRFS_FS_QUOTA_ENABLING is set. Nothing really requires from the code to be structured (and scattered) the way it is so let's streamline things. First move the quota rescan code into btrfs_quota_enable, where its invocation is closer to the use. This also makes the FS_QUOTA_ENABLING flag redundant so let's remove it as well. This has been tested with a full xfstest run with qgroups enabled on the scratch device of every xfstest and no regressions were observed. Signed-off-by: Nikolay Borisov <nborisov@suse.com> Reviewed-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
		
							parent
							
								
									7ce311d552
								
							
						
					
					
						commit
						5d23515be6
					
				
					 2 changed files with 10 additions and 26 deletions
				
			
		| 
						 | 
					@ -707,7 +707,6 @@ struct btrfs_delayed_root;
 | 
				
			||||||
#define BTRFS_FS_LOG_RECOVERING			4
 | 
					#define BTRFS_FS_LOG_RECOVERING			4
 | 
				
			||||||
#define BTRFS_FS_OPEN				5
 | 
					#define BTRFS_FS_OPEN				5
 | 
				
			||||||
#define BTRFS_FS_QUOTA_ENABLED			6
 | 
					#define BTRFS_FS_QUOTA_ENABLED			6
 | 
				
			||||||
#define BTRFS_FS_QUOTA_ENABLING			7
 | 
					 | 
				
			||||||
#define BTRFS_FS_UPDATE_UUID_TREE_GEN		9
 | 
					#define BTRFS_FS_UPDATE_UUID_TREE_GEN		9
 | 
				
			||||||
#define BTRFS_FS_CREATING_FREE_SPACE_TREE	10
 | 
					#define BTRFS_FS_CREATING_FREE_SPACE_TREE	10
 | 
				
			||||||
#define BTRFS_FS_BTREE_ERR			11
 | 
					#define BTRFS_FS_BTREE_ERR			11
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -826,10 +826,8 @@ int btrfs_quota_enable(struct btrfs_trans_handle *trans,
 | 
				
			||||||
	int slot;
 | 
						int slot;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&fs_info->qgroup_ioctl_lock);
 | 
						mutex_lock(&fs_info->qgroup_ioctl_lock);
 | 
				
			||||||
	if (fs_info->quota_root) {
 | 
						if (fs_info->quota_root)
 | 
				
			||||||
		set_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags);
 | 
					 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fs_info->qgroup_ulist = ulist_alloc(GFP_KERNEL);
 | 
						fs_info->qgroup_ulist = ulist_alloc(GFP_KERNEL);
 | 
				
			||||||
	if (!fs_info->qgroup_ulist) {
 | 
						if (!fs_info->qgroup_ulist) {
 | 
				
			||||||
| 
						 | 
					@ -923,8 +921,15 @@ int btrfs_quota_enable(struct btrfs_trans_handle *trans,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	spin_lock(&fs_info->qgroup_lock);
 | 
						spin_lock(&fs_info->qgroup_lock);
 | 
				
			||||||
	fs_info->quota_root = quota_root;
 | 
						fs_info->quota_root = quota_root;
 | 
				
			||||||
	set_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags);
 | 
						set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
 | 
				
			||||||
	spin_unlock(&fs_info->qgroup_lock);
 | 
						spin_unlock(&fs_info->qgroup_lock);
 | 
				
			||||||
 | 
						ret = qgroup_rescan_init(fs_info, 0, 1);
 | 
				
			||||||
 | 
						if (!ret) {
 | 
				
			||||||
 | 
						        qgroup_rescan_zero_tracking(fs_info);
 | 
				
			||||||
 | 
						        btrfs_queue_work(fs_info->qgroup_rescan_workers,
 | 
				
			||||||
 | 
						                         &fs_info->qgroup_rescan_work);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out_free_path:
 | 
					out_free_path:
 | 
				
			||||||
	btrfs_free_path(path);
 | 
						btrfs_free_path(path);
 | 
				
			||||||
out_free_root:
 | 
					out_free_root:
 | 
				
			||||||
| 
						 | 
					@ -2080,17 +2085,9 @@ int btrfs_run_qgroups(struct btrfs_trans_handle *trans,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct btrfs_root *quota_root = fs_info->quota_root;
 | 
						struct btrfs_root *quota_root = fs_info->quota_root;
 | 
				
			||||||
	int ret = 0;
 | 
						int ret = 0;
 | 
				
			||||||
	int start_rescan_worker = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!quota_root)
 | 
						if (!quota_root)
 | 
				
			||||||
		goto out;
 | 
							return ret;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) &&
 | 
					 | 
				
			||||||
	    test_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags))
 | 
					 | 
				
			||||||
		start_rescan_worker = 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (test_and_clear_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags))
 | 
					 | 
				
			||||||
		set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_lock(&fs_info->qgroup_lock);
 | 
						spin_lock(&fs_info->qgroup_lock);
 | 
				
			||||||
	while (!list_empty(&fs_info->dirty_qgroups)) {
 | 
						while (!list_empty(&fs_info->dirty_qgroups)) {
 | 
				
			||||||
| 
						 | 
					@ -2119,18 +2116,6 @@ int btrfs_run_qgroups(struct btrfs_trans_handle *trans,
 | 
				
			||||||
	if (ret)
 | 
						if (ret)
 | 
				
			||||||
		fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT;
 | 
							fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!ret && start_rescan_worker) {
 | 
					 | 
				
			||||||
		ret = qgroup_rescan_init(fs_info, 0, 1);
 | 
					 | 
				
			||||||
		if (!ret) {
 | 
					 | 
				
			||||||
			qgroup_rescan_zero_tracking(fs_info);
 | 
					 | 
				
			||||||
			btrfs_queue_work(fs_info->qgroup_rescan_workers,
 | 
					 | 
				
			||||||
					 &fs_info->qgroup_rescan_work);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ret = 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
out:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue