diff options
| -rw-r--r-- | fs/btrfs/disk-io.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/ioctl.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/qgroup.c | 12 | ||||
| -rw-r--r-- | fs/btrfs/qgroup.h | 3 | 
4 files changed, 13 insertions, 6 deletions
| diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index f5b2a7fb4575..7857f64e1cae 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3864,7 +3864,7 @@ void close_ctree(struct btrfs_root *root)  	smp_mb();  	/* wait for the qgroup rescan worker to stop */ -	btrfs_qgroup_wait_for_completion(fs_info); +	btrfs_qgroup_wait_for_completion(fs_info, false);  	/* wait for the uuid_scan task to finish */  	down(&fs_info->uuid_tree_rescan_sem); diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 14ed1e9e6bc8..b2a2da5893af 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -5084,7 +5084,7 @@ static long btrfs_ioctl_quota_rescan_wait(struct file *file, void __user *arg)  	if (!capable(CAP_SYS_ADMIN))  		return -EPERM; -	return btrfs_qgroup_wait_for_completion(root->fs_info); +	return btrfs_qgroup_wait_for_completion(root->fs_info, true);  }  static long _btrfs_ioctl_set_received_subvol(struct file *file, diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 3fe295e2c84a..13eb6a7a4db1 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c @@ -995,7 +995,7 @@ int btrfs_quota_disable(struct btrfs_trans_handle *trans,  		goto out;  	fs_info->quota_enabled = 0;  	fs_info->pending_quota_state = 0; -	btrfs_qgroup_wait_for_completion(fs_info); +	btrfs_qgroup_wait_for_completion(fs_info, false);  	spin_lock(&fs_info->qgroup_lock);  	quota_root = fs_info->quota_root;  	fs_info->quota_root = NULL; @@ -2494,7 +2494,8 @@ btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info)  	return 0;  } -int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info) +int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info, +				     bool interruptible)  {  	int running;  	int ret = 0; @@ -2505,9 +2506,14 @@ int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info)  	spin_unlock(&fs_info->qgroup_lock);  	mutex_unlock(&fs_info->qgroup_rescan_lock); -	if (running) +	if (!running) +		return 0; + +	if (interruptible)  		ret = wait_for_completion_interruptible(  					&fs_info->qgroup_rescan_completion); +	else +		wait_for_completion(&fs_info->qgroup_rescan_completion);  	return ret;  } diff --git a/fs/btrfs/qgroup.h b/fs/btrfs/qgroup.h index 710887c06aaf..af3e5578cad7 100644 --- a/fs/btrfs/qgroup.h +++ b/fs/btrfs/qgroup.h @@ -46,7 +46,8 @@ int btrfs_quota_disable(struct btrfs_trans_handle *trans,  			struct btrfs_fs_info *fs_info);  int btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info);  void btrfs_qgroup_rescan_resume(struct btrfs_fs_info *fs_info); -int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info); +int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info, +				     bool interruptible);  int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans,  			      struct btrfs_fs_info *fs_info, u64 src, u64 dst);  int btrfs_del_qgroup_relation(struct btrfs_trans_handle *trans, | 
