Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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

parent 1372f8e6
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -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);