diff options
Diffstat (limited to 'fs/btrfs/qgroup.c')
-rw-r--r-- | fs/btrfs/qgroup.c | 21 |
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 | ||
2075 | static void | 2077 | static 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 | |||
2133 | int 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 | } | ||