break;
}
level++;
- free_extent(root, blocknr, 1);
+ wret = free_extent(root, blocknr, 1);
+ if (wret)
+ ret = wret;
if (!path->nodes[level])
BUG();
}
wret = del_ptr(root, path, 1);
if (wret)
ret = wret;
- free_extent(root, leaf_buf->blocknr, 1);
+ wret = free_extent(root, leaf_buf->blocknr, 1);
+ if (wret)
+ ret = wret;
}
} else {
int used = leaf_space_used(leaf, 0, leaf->header.nritems);
if (wret)
ret = wret;
tree_block_release(root, leaf_buf);
- free_extent(root, blocknr, 1);
+ wret = free_extent(root, blocknr, 1);
+ if (wret)
+ ret = wret;
} else {
tree_block_release(root, leaf_buf);
}
/*
* walk up the tree as far as required to find the next leaf.
- * returns 0 if it found something or -1 if there are no greater leaves.
+ * returns 0 if it found something or 1 if there are no greater leaves.
+ * returns < 0 on io errors.
*/
int next_leaf(struct ctree_root *root, struct ctree_path *path)
{
while(level < MAX_LEVEL) {
if (!path->nodes[level])
- return -1;
+ return 1;
slot = path->slots[level] + 1;
c = path->nodes[level];
if (slot >= c->node.header.nritems) {
* ins->offset == number of blocks
* Any available blocks before search_start are skipped.
*/
-int find_free_extent(struct ctree_root *orig_root, u64 num_blocks,
- u64 search_start, u64 search_end, struct key *ins)
+static int find_free_extent(struct ctree_root *orig_root, u64 num_blocks,
+ u64 search_start, u64 search_end, struct key *ins)
{
struct ctree_path path;
struct key *key;
ins->flags = 0;
start_found = 0;
ret = search_slot(root, ins, &path, 0);
- if (ret < 0) {
- release_path(root, &path);
- return ret;
- }
+ if (ret < 0)
+ goto error;
while (1) {
l = &path.nodes[0]->leaf;
ret = next_leaf(root, &path);
if (ret == 0)
continue;
+ if (ret < 0)
+ goto error;
if (!start_found) {
ins->objectid = search_start;
ins->offset = num_blocks;
if (ins->offset != 1)
BUG();
return 0;
+error:
+ release_path(root, &path);
+ return ret;
}
/*