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;
}
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]++;
*/
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]);
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);