Commit 725c8463 authored by Chris Mason's avatar Chris Mason

Btrfs: resizer: don't hold the fs_mutex for long periods of time

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 1372f8e6
...@@ -2331,6 +2331,7 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size) ...@@ -2331,6 +2331,7 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size)
struct extent_buffer *leaf; struct extent_buffer *leaf;
u32 nritems; u32 nritems;
int ret; int ret;
int progress = 0;
btrfs_set_super_total_bytes(&info->super_copy, new_size); btrfs_set_super_total_bytes(&info->super_copy, new_size);
block_group_cache = &info->block_group_cache; block_group_cache = &info->block_group_cache;
...@@ -2383,6 +2384,19 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size) ...@@ -2383,6 +2384,19 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size)
} }
btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
if (progress && need_resched()) {
memcpy(&key, &found_key, sizeof(key));
mutex_unlock(&root->fs_info->fs_mutex);
cond_resched();
mutex_lock(&root->fs_info->fs_mutex);
btrfs_release_path(root, path);
btrfs_search_slot(NULL, root, &key, path, 0, 0);
progress = 0;
goto next;
}
progress = 1;
if (btrfs_key_type(&found_key) != BTRFS_EXTENT_ITEM_KEY || if (btrfs_key_type(&found_key) != BTRFS_EXTENT_ITEM_KEY ||
found_key.objectid + found_key.offset <= cur_byte) { found_key.objectid + found_key.offset <= cur_byte) {
path->slots[0]++; path->slots[0]++;
...@@ -2442,7 +2456,7 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size) ...@@ -2442,7 +2456,7 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size)
*/ */
memcpy(&key, &found_key, sizeof(key)); memcpy(&key, &found_key, sizeof(key));
btrfs_release_path(root, path); btrfs_release_path(root, path);
continue; goto resched_check;
} }
btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
...@@ -2465,6 +2479,12 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size) ...@@ -2465,6 +2479,12 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size)
key.objectid = found_key.objectid + 1; key.objectid = found_key.objectid + 1;
btrfs_del_item(trans, root, path); btrfs_del_item(trans, root, path);
btrfs_release_path(root, path); btrfs_release_path(root, path);
resched_check:
if (need_resched()) {
mutex_unlock(&root->fs_info->fs_mutex);
cond_resched();
mutex_lock(&root->fs_info->fs_mutex);
}
} }
clear_extent_dirty(&info->free_space_cache, new_size, (u64)-1, clear_extent_dirty(&info->free_space_cache, new_size, (u64)-1,
GFP_NOFS); GFP_NOFS);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment