aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/qgroup.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/qgroup.c')
-rw-r--r--fs/btrfs/qgroup.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index 7f38cce2528d..d059d86c3131 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -2070,6 +2070,8 @@ out:
2070 } else { 2070 } else {
2071 pr_err("btrfs: qgroup scan failed with %d\n", err); 2071 pr_err("btrfs: qgroup scan failed with %d\n", err);
2072 } 2072 }
2073
2074 complete_all(&fs_info->qgroup_rescan_completion);
2073} 2075}
2074 2076
2075static void 2077static void
@@ -2110,6 +2112,7 @@ btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info)
2110 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_RESCAN; 2112 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_RESCAN;
2111 memset(&fs_info->qgroup_rescan_progress, 0, 2113 memset(&fs_info->qgroup_rescan_progress, 0,
2112 sizeof(fs_info->qgroup_rescan_progress)); 2114 sizeof(fs_info->qgroup_rescan_progress));
2115 init_completion(&fs_info->qgroup_rescan_completion);
2113 2116
2114 /* clear all current qgroup tracking information */ 2117 /* clear all current qgroup tracking information */
2115 for (n = rb_first(&fs_info->qgroup_tree); n; n = rb_next(n)) { 2118 for (n = rb_first(&fs_info->qgroup_tree); n; n = rb_next(n)) {
@@ -2126,3 +2129,21 @@ btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info)
2126 2129
2127 return 0; 2130 return 0;
2128} 2131}
2132
2133int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info)
2134{
2135 int running;
2136 int ret = 0;
2137
2138 mutex_lock(&fs_info->qgroup_rescan_lock);
2139 spin_lock(&fs_info->qgroup_lock);
2140 running = fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN;
2141 spin_unlock(&fs_info->qgroup_lock);
2142 mutex_unlock(&fs_info->qgroup_rescan_lock);
2143
2144 if (running)
2145 ret = wait_for_completion_interruptible(
2146 &fs_info->qgroup_rescan_completion);
2147
2148 return ret;
2149}