Btrfs: more return code checking
Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
aa5d6bed25
commit
0f70abe2b3
2 changed files with 21 additions and 11 deletions
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
|
|
||||||
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)
|
||||||
* 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 @@ check_failed:
|
||||||
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 @@ check_failed:
|
||||||
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 @@ check_pending:
|
||||||
if (ins->offset != 1)
|
if (ins->offset != 1)
|
||||||
BUG();
|
BUG();
|
||||||
return 0;
|
return 0;
|
||||||
|
error:
|
||||||
|
release_path(root, &path);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue