Btrfs: pretend page cache & commit code
Signed-off-by: Chris Mason <chris.mason@oracle.com>
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index afa5bc5..57fa505 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -250,6 +250,7 @@
tree_block_release(root, mid_buf);
/* once for the root ptr */
tree_block_release(root, mid_buf);
+ clean_tree_block(root, mid_buf);
return free_extent(root, blocknr, 1);
}
parent = &parent_buf->node;
@@ -280,6 +281,7 @@
if (right->header.nritems == 0) {
u64 blocknr = right_buf->blocknr;
tree_block_release(root, right_buf);
+ clean_tree_block(root, right_buf);
right_buf = NULL;
right = NULL;
wret = del_ptr(root, path, level + 1, pslot + 1);
@@ -291,7 +293,7 @@
} else {
memcpy(parent->keys + pslot + 1, right->keys,
sizeof(struct key));
- wret = write_tree_block(root, parent_buf);
+ wret = dirty_tree_block(root, parent_buf);
if (wret)
ret = wret;
}
@@ -316,6 +318,7 @@
/* we've managed to empty the middle node, drop it */
u64 blocknr = mid_buf->blocknr;
tree_block_release(root, mid_buf);
+ clean_tree_block(root, mid_buf);
mid_buf = NULL;
mid = NULL;
wret = del_ptr(root, path, level + 1, pslot);
@@ -327,7 +330,7 @@
} else {
/* update the parent key to reflect our changes */
memcpy(parent->keys + pslot, mid->keys, sizeof(struct key));
- wret = write_tree_block(root, parent_buf);
+ wret = dirty_tree_block(root, parent_buf);
if (wret)
ret = wret;
}
@@ -458,7 +461,7 @@
break;
t = &path->nodes[i]->node;
memcpy(t->keys + tslot, key, sizeof(*key));
- wret = write_tree_block(root, path->nodes[i]);
+ wret = dirty_tree_block(root, path->nodes[i]);
if (wret)
ret = wret;
if (tslot != 0)
@@ -508,11 +511,11 @@
src->header.nritems -= push_items;
dst->header.nritems += push_items;
- wret = write_tree_block(root, src_buf);
+ wret = dirty_tree_block(root, src_buf);
if (wret < 0)
ret = wret;
- wret = write_tree_block(root, dst_buf);
+ wret = dirty_tree_block(root, dst_buf);
if (wret < 0)
ret = wret;
return ret;
@@ -566,11 +569,11 @@
src->header.nritems -= push_items;
dst->header.nritems += push_items;
- wret = write_tree_block(root, src_buf);
+ wret = dirty_tree_block(root, src_buf);
if (wret < 0)
ret = wret;
- wret = write_tree_block(root, dst_buf);
+ wret = dirty_tree_block(root, dst_buf);
if (wret < 0)
ret = wret;
return ret;
@@ -612,7 +615,7 @@
tree_block_release(root, root->node);
root->node = t;
t->count++;
- write_tree_block(root, t);
+ dirty_tree_block(root, t);
path->nodes[level] = t;
path->slots[level] = 0;
return 0;
@@ -652,7 +655,7 @@
lower->header.nritems++;
if (lower->keys[1].objectid == 0)
BUG();
- write_tree_block(root, path->nodes[level]);
+ dirty_tree_block(root, path->nodes[level]);
return 0;
}
@@ -698,10 +701,10 @@
c->header.nritems = mid;
ret = 0;
- wret = write_tree_block(root, t);
+ wret = dirty_tree_block(root, t);
if (wret)
ret = wret;
- wret = write_tree_block(root, split_buffer);
+ wret = dirty_tree_block(root, split_buffer);
if (wret)
ret = wret;
wret = insert_ptr(root, path, split->keys, split_buffer->blocknr,
@@ -815,11 +818,11 @@
}
left->header.nritems -= push_items;
- write_tree_block(root, left_buf);
- write_tree_block(root, right_buf);
+ dirty_tree_block(root, left_buf);
+ dirty_tree_block(root, right_buf);
memcpy(upper->node.keys + slot + 1,
&right->items[0].key, sizeof(struct key));
- write_tree_block(root, upper);
+ dirty_tree_block(root, upper);
/* then fixup the leaf pointer in the path */
if (path->slots[0] >= left->header.nritems) {
path->slots[0] -= left->header.nritems;
@@ -909,10 +912,10 @@
push_space = right->items[i].offset;
}
- wret = write_tree_block(root, t);
+ wret = dirty_tree_block(root, t);
if (wret)
ret = wret;
- wret = write_tree_block(root, right_buf);
+ wret = dirty_tree_block(root, right_buf);
if (wret)
ret = wret;
@@ -1019,10 +1022,10 @@
right_buffer->blocknr, path->slots[1] + 1, 1);
if (wret)
ret = wret;
- wret = write_tree_block(root, right_buffer);
+ wret = dirty_tree_block(root, right_buffer);
if (wret)
ret = wret;
- wret = write_tree_block(root, l_buf);
+ wret = dirty_tree_block(root, l_buf);
if (wret)
ret = wret;
@@ -1062,12 +1065,14 @@
ret = search_slot(root, key, &path, data_size);
if (ret == 0) {
release_path(root, &path);
- return -EEXIST;
- }
- if (ret < 0) {
- release_path(root, &path);
+ ret = -EEXIST;
+ wret = commit_transaction(root);
+ if (wret)
+ ret = wret;
return ret;
}
+ if (ret < 0)
+ goto out;
slot_orig = path.slots[0];
leaf_buf = path.nodes[0];
@@ -1113,14 +1118,18 @@
if (slot == 0)
ret = fixup_low_keys(root, &path, key, 1);
- wret = write_tree_block(root, leaf_buf);
+ wret = dirty_tree_block(root, leaf_buf);
if (wret)
ret = wret;
if (leaf_free_space(leaf) < 0)
BUG();
check_leaf(&path, 0);
+out:
release_path(root, &path);
+ wret = commit_transaction(root);
+ if (wret)
+ ret = wret;
return ret;
}
@@ -1160,7 +1169,7 @@
if (wret)
ret = wret;
}
- wret = write_tree_block(root, parent);
+ wret = dirty_tree_block(root, parent);
if (wret)
ret = wret;
return ret;
@@ -1203,8 +1212,9 @@
if (leaf->header.nritems == 0) {
if (leaf_buf == root->node) {
leaf->header.flags = node_level(0);
- write_tree_block(root, leaf_buf);
+ dirty_tree_block(root, leaf_buf);
} else {
+ clean_tree_block(root, leaf_buf);
wret = del_ptr(root, path, 1, path->slots[1]);
if (wret)
ret = wret;
@@ -1220,7 +1230,7 @@
if (wret)
ret = wret;
}
- wret = write_tree_block(root, leaf_buf);
+ wret = dirty_tree_block(root, leaf_buf);
if (wret)
ret = wret;
@@ -1242,6 +1252,7 @@
}
if (leaf->header.nritems == 0) {
u64 blocknr = leaf_buf->blocknr;
+ clean_tree_block(root, leaf_buf);
wret = del_ptr(root, path, 1, slot);
if (wret)
ret = wret;
@@ -1254,6 +1265,9 @@
}
}
}
+ wret = commit_transaction(root);
+ if (wret)
+ ret = wret;
return ret;
}