mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
Btrfs: resizer: don't hold the fs_mutex for long periods of time
Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
1372f8e609
commit
725c8463ea
1 changed files with 21 additions and 1 deletions
|
@ -2331,6 +2331,7 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size)
|
|||
struct extent_buffer *leaf;
|
||||
u32 nritems;
|
||||
int ret;
|
||||
int progress = 0;
|
||||
|
||||
btrfs_set_super_total_bytes(&info->super_copy, new_size);
|
||||
block_group_cache = &info->block_group_cache;
|
||||
|
@ -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]);
|
||||
|
||||
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 ||
|
||||
found_key.objectid + found_key.offset <= cur_byte) {
|
||||
path->slots[0]++;
|
||||
|
@ -2442,7 +2456,7 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size)
|
|||
*/
|
||||
memcpy(&key, &found_key, sizeof(key));
|
||||
btrfs_release_path(root, path);
|
||||
continue;
|
||||
goto resched_check;
|
||||
}
|
||||
|
||||
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)
|
|||
key.objectid = found_key.objectid + 1;
|
||||
btrfs_del_item(trans, 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,
|
||||
GFP_NOFS);
|
||||
|
|
Loading…
Reference in a new issue