u64 old_root_bytenr;
u64 old_root_used;
struct btrfs_root *tree_root = root->fs_info->tree_root;
- bool extent_root = (root->objectid == BTRFS_EXTENT_TREE_OBJECTID);
+ struct btrfs_fs_info *fs_info = root->fs_info;
old_root_used = btrfs_root_used(&root->root_item);
btrfs_write_dirty_block_groups(trans, root);
while (1) {
old_root_bytenr = btrfs_root_bytenr(&root->root_item);
+
+ /*
+ * We can only break out if our root matches the root item and
+ * we either have more roots to process or we have no more roots
+ * to process and there are no empty bgs.
+ */
if (old_root_bytenr == root->node->start &&
old_root_used == btrfs_root_used(&root->root_item) &&
- (!extent_root ||
+ (!list_empty(&fs_info->dirty_cowonly_roots) ||
list_empty(&trans->transaction->dirty_bgs)))
break;
return ret;
old_root_used = btrfs_root_used(&root->root_item);
- if (extent_root) {
+ if (list_empty(&fs_info->dirty_cowonly_roots)) {
ret = btrfs_write_dirty_block_groups(trans, root);
if (ret)
return ret;