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;
 }