Commit 0f70abe2 authored by Chris Mason's avatar Chris Mason Committed by David Woodhouse

Btrfs: more return code checking

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent aa5d6bed
...@@ -1087,7 +1087,9 @@ static int del_ptr(struct ctree_root *root, struct ctree_path *path, int level) ...@@ -1087,7 +1087,9 @@ static int del_ptr(struct ctree_root *root, struct ctree_path *path, int level)
break; break;
} }
level++; level++;
free_extent(root, blocknr, 1); wret = free_extent(root, blocknr, 1);
if (wret)
ret = wret;
if (!path->nodes[level]) if (!path->nodes[level])
BUG(); BUG();
} }
...@@ -1136,7 +1138,9 @@ int del_item(struct ctree_root *root, struct ctree_path *path) ...@@ -1136,7 +1138,9 @@ int del_item(struct ctree_root *root, struct ctree_path *path)
wret = del_ptr(root, path, 1); wret = del_ptr(root, path, 1);
if (wret) if (wret)
ret = wret; ret = wret;
free_extent(root, leaf_buf->blocknr, 1); wret = free_extent(root, leaf_buf->blocknr, 1);
if (wret)
ret = wret;
} }
} else { } else {
int used = leaf_space_used(leaf, 0, leaf->header.nritems); int used = leaf_space_used(leaf, 0, leaf->header.nritems);
...@@ -1173,7 +1177,9 @@ int del_item(struct ctree_root *root, struct ctree_path *path) ...@@ -1173,7 +1177,9 @@ int del_item(struct ctree_root *root, struct ctree_path *path)
if (wret) if (wret)
ret = wret; ret = wret;
tree_block_release(root, leaf_buf); tree_block_release(root, leaf_buf);
free_extent(root, blocknr, 1); wret = free_extent(root, blocknr, 1);
if (wret)
ret = wret;
} else { } else {
tree_block_release(root, leaf_buf); tree_block_release(root, leaf_buf);
} }
...@@ -1184,7 +1190,8 @@ int del_item(struct ctree_root *root, struct ctree_path *path) ...@@ -1184,7 +1190,8 @@ int del_item(struct ctree_root *root, struct ctree_path *path)
/* /*
* walk up the tree as far as required to find the next leaf. * 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) int next_leaf(struct ctree_root *root, struct ctree_path *path)
{ {
...@@ -1196,7 +1203,7 @@ int next_leaf(struct ctree_root *root, struct ctree_path *path) ...@@ -1196,7 +1203,7 @@ int next_leaf(struct ctree_root *root, struct ctree_path *path)
while(level < MAX_LEVEL) { while(level < MAX_LEVEL) {
if (!path->nodes[level]) if (!path->nodes[level])
return -1; return 1;
slot = path->slots[level] + 1; slot = path->slots[level] + 1;
c = path->nodes[level]; c = path->nodes[level];
if (slot >= c->node.header.nritems) { if (slot >= c->node.header.nritems) {
......
...@@ -105,8 +105,8 @@ int free_extent(struct ctree_root *root, u64 blocknr, u64 num_blocks) ...@@ -105,8 +105,8 @@ int free_extent(struct ctree_root *root, u64 blocknr, u64 num_blocks)
* ins->offset == number of blocks * ins->offset == number of blocks
* Any available blocks before search_start are skipped. * Any available blocks before search_start are skipped.
*/ */
int find_free_extent(struct ctree_root *orig_root, u64 num_blocks, static int find_free_extent(struct ctree_root *orig_root, u64 num_blocks,
u64 search_start, u64 search_end, struct key *ins) u64 search_start, u64 search_end, struct key *ins)
{ {
struct ctree_path path; struct ctree_path path;
struct key *key; struct key *key;
...@@ -125,10 +125,8 @@ int find_free_extent(struct ctree_root *orig_root, u64 num_blocks, ...@@ -125,10 +125,8 @@ int find_free_extent(struct ctree_root *orig_root, u64 num_blocks,
ins->flags = 0; ins->flags = 0;
start_found = 0; start_found = 0;
ret = search_slot(root, ins, &path, 0); ret = search_slot(root, ins, &path, 0);
if (ret < 0) { if (ret < 0)
release_path(root, &path); goto error;
return ret;
}
while (1) { while (1) {
l = &path.nodes[0]->leaf; l = &path.nodes[0]->leaf;
...@@ -137,6 +135,8 @@ int find_free_extent(struct ctree_root *orig_root, u64 num_blocks, ...@@ -137,6 +135,8 @@ int find_free_extent(struct ctree_root *orig_root, u64 num_blocks,
ret = next_leaf(root, &path); ret = next_leaf(root, &path);
if (ret == 0) if (ret == 0)
continue; continue;
if (ret < 0)
goto error;
if (!start_found) { if (!start_found) {
ins->objectid = search_start; ins->objectid = search_start;
ins->offset = num_blocks; ins->offset = num_blocks;
...@@ -187,6 +187,9 @@ int find_free_extent(struct ctree_root *orig_root, u64 num_blocks, ...@@ -187,6 +187,9 @@ int find_free_extent(struct ctree_root *orig_root, u64 num_blocks,
if (ins->offset != 1) if (ins->offset != 1)
BUG(); BUG();
return 0; return 0;
error:
release_path(root, &path);
return ret;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment