From ad8077debb2c18cb67e30b7ca636237486081690 Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Wed, 28 Feb 2007 16:46:22 -0500 Subject: [PATCH] --- yaml --- r: 128255 b: refs/heads/master c: 0f70abe2b39d19171d4133d2ffdf77fb9113106a h: refs/heads/master i: 128253: 105d55911a65ab0294f4c2042d8d718b0ee558a7 128251: 73a57cd6041fb2cbd5ae3bd6ed4d24c61bba14e4 128247: d2f725c8de3760369208b112eac18b8feef5bdfc 128239: e9a39c5d1d717dfa88b4c5bf01313b5afe168785 128223: 993804e4a77a4d7a5c800e21a603cd3b038ae515 128191: 07381f3f0ab3ce24018a45de14b2bb68faf702eb 128127: a2ab7ef893688dd9eefc0db75ce39331513b61aa 127999: c3235cfcfeead2886fbe3590299afabe7ec72392 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/ctree.c | 17 ++++++++++++----- trunk/fs/btrfs/extent-tree.c | 15 +++++++++------ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index 07b7e7fa5a6b..9b7d2cc8d332 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: aa5d6bed255d7f8c655a8f10d760f4247bc8385c +refs/heads/master: 0f70abe2b39d19171d4133d2ffdf77fb9113106a diff --git a/trunk/fs/btrfs/ctree.c b/trunk/fs/btrfs/ctree.c index be2be0272513..273239932255 100644 --- a/trunk/fs/btrfs/ctree.c +++ b/trunk/fs/btrfs/ctree.c @@ -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) { diff --git a/trunk/fs/btrfs/extent-tree.c b/trunk/fs/btrfs/extent-tree.c index 97715bae7847..074f4b182f16 100644 --- a/trunk/fs/btrfs/extent-tree.c +++ b/trunk/fs/btrfs/extent-tree.c @@ -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 @@ 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; } /*