{
if (node) {
cache->nr_nodes--;
+ btrfs_put_fs_root(node->root);
kfree(node);
}
}
root = (struct btrfs_root *)node->data;
}
spin_unlock(&rc->reloc_root_tree.lock);
- return root;
+ return btrfs_grab_fs_root(root);
}
static int is_cowonly_root(u64 root_objectid)
err = PTR_ERR(root);
goto out;
}
+ if (!btrfs_grab_fs_root(root)) {
+ err = -ENOENT;
+ goto out;
+ }
if (!test_bit(BTRFS_ROOT_REF_COWS, &root->state))
cur->cowonly = 1;
/* tree root */
ASSERT(btrfs_root_bytenr(&root->root_item) ==
cur->bytenr);
- if (should_ignore_root(root))
+ if (should_ignore_root(root)) {
+ btrfs_put_fs_root(root);
list_add(&cur->list, &useless);
- else
+ } else {
cur->root = root;
+ }
break;
}
ret = btrfs_search_slot(NULL, root, node_key, path2, 0, 0);
path2->lowest_level = 0;
if (ret < 0) {
+ btrfs_put_fs_root(root);
err = ret;
goto out;
}
root->root_key.objectid,
node_key->objectid, node_key->type,
node_key->offset);
+ btrfs_put_fs_root(root);
err = -ENOENT;
goto out;
}
if (!path2->nodes[level]) {
ASSERT(btrfs_root_bytenr(&root->root_item) ==
lower->bytenr);
- if (should_ignore_root(root))
+ if (should_ignore_root(root)) {
+ btrfs_put_fs_root(root);
list_add(&lower->list, &useless);
- else
+ } else {
lower->root = root;
+ }
break;
}
edge = alloc_backref_edge(cache);
if (!edge) {
+ btrfs_put_fs_root(root);
err = -ENOMEM;
goto out;
}
if (!rb_node) {
upper = alloc_backref_node(cache);
if (!upper) {
+ btrfs_put_fs_root(root);
free_backref_edge(cache, edge);
err = -ENOMEM;
goto out;
edge->node[LOWER] = lower;
edge->node[UPPER] = upper;
- if (rb_node)
+ if (rb_node) {
+ btrfs_put_fs_root(root);
break;
+ }
lower = upper;
upper = NULL;
}
new_node->level = node->level;
new_node->lowest = node->lowest;
new_node->checked = 1;
- new_node->root = dest;
+ new_node->root = btrfs_grab_fs_root(dest);
+ ASSERT(new_node->root);
if (!node->lowest) {
list_for_each_entry(edge, &node->lower, list[UPPER]) {
BUG_ON(next->new_bytenr);
BUG_ON(!list_empty(&next->list));
next->new_bytenr = root->node->start;
- next->root = root;
+ btrfs_put_fs_root(next->root);
+ next->root = btrfs_grab_fs_root(root);
+ ASSERT(next->root);
list_add_tail(&next->list,
&rc->backref_cache.changed);
__mark_block_processed(rc, next);
btrfs_record_root_in_trans(trans, root);
root = root->reloc_root;
node->new_bytenr = root->node->start;
- node->root = root;
+ btrfs_put_fs_root(node->root);
+ node->root = btrfs_grab_fs_root(root);
+ ASSERT(node->root);
list_add_tail(&node->list, &rc->backref_cache.changed);
} else {
path->lowest_level = node->level;