Btrfs: more return code checking
authorChris Mason <chris.mason@oracle.com>
Wed, 28 Feb 2007 21:46:22 +0000 (16:46 -0500)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Wed, 28 Feb 2007 21:46:22 +0000 (16:46 -0500)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.c
fs/btrfs/extent-tree.c

index be2be02..2732399 100644 (file)
@@ -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) {
index 97715ba..074f4b1 100644 (file)
@@ -105,8 +105,8 @@ 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,
-                    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;
@@ -125,10 +125,8 @@ check_failed:
        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 @@ check_failed:
                        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 @@ check_pending:
        if (ins->offset != 1)
                BUG();
        return 0;
+error:
+       release_path(root, &path);
+       return ret;
 }
 
 /*