|
@@ -6166,16 +6166,8 @@ static int update_block_group(struct btrfs_trans_handle *trans,
|
|
* dirty list to avoid races between cleaner kthread and space
|
|
* dirty list to avoid races between cleaner kthread and space
|
|
* cache writeout.
|
|
* cache writeout.
|
|
*/
|
|
*/
|
|
- if (!alloc && old_val == 0) {
|
|
|
|
- spin_lock(&info->unused_bgs_lock);
|
|
|
|
- if (list_empty(&cache->bg_list)) {
|
|
|
|
- btrfs_get_block_group(cache);
|
|
|
|
- trace_btrfs_add_unused_block_group(cache);
|
|
|
|
- list_add_tail(&cache->bg_list,
|
|
|
|
- &info->unused_bgs);
|
|
|
|
- }
|
|
|
|
- spin_unlock(&info->unused_bgs_lock);
|
|
|
|
- }
|
|
|
|
|
|
+ if (!alloc && old_val == 0)
|
|
|
|
+ btrfs_mark_bg_unused(cache);
|
|
|
|
|
|
btrfs_put_block_group(cache);
|
|
btrfs_put_block_group(cache);
|
|
total -= num_bytes;
|
|
total -= num_bytes;
|
|
@@ -9987,15 +9979,8 @@ int btrfs_read_block_groups(struct btrfs_fs_info *info)
|
|
if (btrfs_chunk_readonly(info, cache->key.objectid)) {
|
|
if (btrfs_chunk_readonly(info, cache->key.objectid)) {
|
|
inc_block_group_ro(cache, 1);
|
|
inc_block_group_ro(cache, 1);
|
|
} else if (btrfs_block_group_used(&cache->item) == 0) {
|
|
} else if (btrfs_block_group_used(&cache->item) == 0) {
|
|
- spin_lock(&info->unused_bgs_lock);
|
|
|
|
- /* Should always be true but just in case. */
|
|
|
|
- if (list_empty(&cache->bg_list)) {
|
|
|
|
- btrfs_get_block_group(cache);
|
|
|
|
- trace_btrfs_add_unused_block_group(cache);
|
|
|
|
- list_add_tail(&cache->bg_list,
|
|
|
|
- &info->unused_bgs);
|
|
|
|
- }
|
|
|
|
- spin_unlock(&info->unused_bgs_lock);
|
|
|
|
|
|
+ ASSERT(list_empty(&cache->bg_list));
|
|
|
|
+ btrfs_mark_bg_unused(cache);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -10914,3 +10899,16 @@ void btrfs_wait_for_snapshot_creation(struct btrfs_root *root)
|
|
!atomic_read(&root->will_be_snapshotted));
|
|
!atomic_read(&root->will_be_snapshotted));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+void btrfs_mark_bg_unused(struct btrfs_block_group_cache *bg)
|
|
|
|
+{
|
|
|
|
+ struct btrfs_fs_info *fs_info = bg->fs_info;
|
|
|
|
+
|
|
|
|
+ spin_lock(&fs_info->unused_bgs_lock);
|
|
|
|
+ if (list_empty(&bg->bg_list)) {
|
|
|
|
+ btrfs_get_block_group(bg);
|
|
|
|
+ trace_btrfs_add_unused_block_group(bg);
|
|
|
|
+ list_add_tail(&bg->bg_list, &fs_info->unused_bgs);
|
|
|
|
+ }
|
|
|
|
+ spin_unlock(&fs_info->unused_bgs_lock);
|
|
|
|
+}
|