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

Btrfs: more return code checking

parent aa5d6bed
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -1087,7 +1087,9 @@ static int del_ptr(struct ctree_root *root, struct ctree_path *path, int level)
			break;
		}
		level++;
		free_extent(root, blocknr, 1);
		wret = free_extent(root, blocknr, 1);
		if (wret)
			ret = wret;
		if (!path->nodes[level])
			BUG();
	}
@@ -1136,7 +1138,9 @@ int del_item(struct ctree_root *root, struct ctree_path *path)
			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);
@@ -1173,7 +1177,9 @@ int del_item(struct ctree_root *root, struct ctree_path *path)
				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);
			}
@@ -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.
 * 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)
{
@@ -1196,7 +1203,7 @@ 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) {
+9 −6
Original line number Diff line number Diff line
@@ -105,7 +105,7 @@ int free_extent(struct ctree_root *root, u64 blocknr, u64 num_blocks)
 * 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,
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;
@@ -125,10 +125,8 @@ int find_free_extent(struct ctree_root *orig_root, u64 num_blocks,
	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;
@@ -137,6 +135,8 @@ int find_free_extent(struct ctree_root *orig_root, u64 num_blocks,
			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;
@@ -187,6 +187,9 @@ int find_free_extent(struct ctree_root *orig_root, u64 num_blocks,
	if (ins->offset != 1)
		BUG();
	return 0;
error:
	release_path(root, &path);
	return ret;
}

/*