Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

btrfs_create, btrfs_write_super, btrfs_sync_fs

parent 79154b1b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
* Fix ENOSPC handling
* make a real mkfs and superblock
* Do checksumming
* Use a real check instead of mark_buffer_dirty
* Define FS objects in terms of different item types
* Add block mapping tree (simple dm layer)
* Add simple tree locking (semaphore per tree)
+29 −20
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ static int btrfs_cow_block(struct btrfs_trans_handle *trans, struct btrfs_root
	struct buffer_head *cow;
	struct btrfs_node *cow_node;

	if (!buffer_dirty(buf)) {
	if (buffer_dirty(buf)) {
		*cow_ret = buf;
		return 0;
	}
@@ -48,6 +48,7 @@ static int btrfs_cow_block(struct btrfs_trans_handle *trans, struct btrfs_root
	memcpy(cow_node, btrfs_buffer_node(buf), root->blocksize);
	btrfs_set_header_blocknr(&cow_node->header, cow->b_blocknr);
	*cow_ret = cow;
	mark_buffer_dirty(cow);
	btrfs_inc_ref(trans, root, buf);
	if (buf == root->node) {
		root->node = cow;
@@ -58,7 +59,7 @@ static int btrfs_cow_block(struct btrfs_trans_handle *trans, struct btrfs_root
	} else {
		btrfs_set_node_blockptr(btrfs_buffer_node(parent), parent_slot,
					cow->b_blocknr);
		BUG_ON(!buffer_dirty(parent));
		mark_buffer_dirty(parent);
		btrfs_free_extent(trans, root, buf->b_blocknr, 1, 1);
	}
	btrfs_block_release(root, buf);
@@ -362,7 +363,7 @@ static int balance_level(struct btrfs_trans_handle *trans, struct btrfs_root
			memcpy(&parent->ptrs[pslot + 1].key,
				&right->ptrs[0].key,
				sizeof(struct btrfs_disk_key));
			BUG_ON(!buffer_dirty(parent_buf));
			mark_buffer_dirty(parent_buf);
		}
	}
	if (btrfs_header_nritems(&mid->header) == 1) {
@@ -398,7 +399,7 @@ static int balance_level(struct btrfs_trans_handle *trans, struct btrfs_root
		/* update the parent key to reflect our changes */
		memcpy(&parent->ptrs[pslot].key, &mid->ptrs[0].key,
		       sizeof(struct btrfs_disk_key));
		BUG_ON(!buffer_dirty(parent_buf));
		mark_buffer_dirty(parent_buf);
	}

	/* update the path */
@@ -539,7 +540,7 @@ static int fixup_low_keys(struct btrfs_trans_handle *trans, struct btrfs_root
			break;
		t = btrfs_buffer_node(path->nodes[i]);
		memcpy(&t->ptrs[tslot].key, key, sizeof(*key));
		BUG_ON(!buffer_dirty(path->nodes[i]));
		mark_buffer_dirty(path->nodes[i]);
		if (tslot != 0)
			break;
	}
@@ -583,8 +584,8 @@ static int push_node_left(struct btrfs_trans_handle *trans, struct btrfs_root
	}
	btrfs_set_header_nritems(&src->header, src_nritems - push_items);
	btrfs_set_header_nritems(&dst->header, dst_nritems + push_items);
	BUG_ON(!buffer_dirty(src_buf));
	BUG_ON(!buffer_dirty(dst_buf));
	mark_buffer_dirty(src_buf);
	mark_buffer_dirty(dst_buf);
	return ret;
}

@@ -631,8 +632,8 @@ static int balance_node_right(struct btrfs_trans_handle *trans, struct
	btrfs_set_header_nritems(&src->header, src_nritems - push_items);
	btrfs_set_header_nritems(&dst->header, dst_nritems + push_items);

	BUG_ON(!buffer_dirty(src_buf));
	BUG_ON(!buffer_dirty(dst_buf));
	mark_buffer_dirty(src_buf);
	mark_buffer_dirty(dst_buf);
	return ret;
}

@@ -669,6 +670,9 @@ static int insert_new_root(struct btrfs_trans_handle *trans, struct btrfs_root
		lower_key = &lower->ptrs[0].key;
	memcpy(&c->ptrs[0].key, lower_key, sizeof(struct btrfs_disk_key));
	btrfs_set_node_blockptr(c, 0, path->nodes[level - 1]->b_blocknr);

	mark_buffer_dirty(t);

	/* the super has an extra ref to root->node */
	btrfs_block_release(root, root->node);
	root->node = t;
@@ -708,7 +712,7 @@ static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root
	memcpy(&lower->ptrs[slot].key, key, sizeof(struct btrfs_disk_key));
	btrfs_set_node_blockptr(lower, slot, blocknr);
	btrfs_set_header_nritems(&lower->header, nritems + 1);
	BUG_ON(!buffer_dirty(path->nodes[level]));
	mark_buffer_dirty(path->nodes[level]);
	return 0;
}

@@ -755,7 +759,8 @@ static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
	btrfs_set_header_nritems(&c->header, mid);
	ret = 0;

	BUG_ON(!buffer_dirty(t));
	mark_buffer_dirty(t);
	mark_buffer_dirty(split_buffer);
	wret = insert_ptr(trans, root, path, &split->ptrs[0].key,
			  split_buffer->b_blocknr, path->slots[level + 1] + 1,
			  level + 1);
@@ -886,11 +891,11 @@ static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
	left_nritems -= push_items;
	btrfs_set_header_nritems(&left->header, left_nritems);

	BUG_ON(!buffer_dirty(left_buf));
	BUG_ON(!buffer_dirty(right_buf));
	mark_buffer_dirty(left_buf);
	mark_buffer_dirty(right_buf);
	memcpy(&upper_node->ptrs[slot + 1].key,
		&right->items[0].key, sizeof(struct btrfs_disk_key));
	BUG_ON(!buffer_dirty(upper));
	mark_buffer_dirty(upper);

	/* then fixup the leaf pointer in the path */
	if (path->slots[0] >= left_nritems) {
@@ -1004,8 +1009,8 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
		push_space = btrfs_item_offset(right->items + i);
	}

	BUG_ON(!buffer_dirty(t));
	BUG_ON(!buffer_dirty(right_buf));
	mark_buffer_dirty(t);
	mark_buffer_dirty(right_buf);

	wret = fixup_low_keys(trans, root, path, &right->items[0].key, 1);
	if (wret)
@@ -1115,8 +1120,8 @@ static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
			  right_buffer->b_blocknr, path->slots[1] + 1, 1);
	if (wret)
		ret = wret;
	BUG_ON(!buffer_dirty(right_buffer));
	BUG_ON(!buffer_dirty(l_buf));
	mark_buffer_dirty(right_buffer);
	mark_buffer_dirty(l_buf);
	BUG_ON(path->slots[0] != slot);
	if (mid <= slot) {
		btrfs_block_release(root, path->nodes[0]);
@@ -1202,12 +1207,12 @@ int btrfs_insert_empty_item(struct btrfs_trans_handle *trans, struct btrfs_root
	btrfs_set_item_offset(leaf->items + slot, data_end - data_size);
	btrfs_set_item_size(leaf->items + slot, data_size);
	btrfs_set_header_nritems(&leaf->header, nritems + 1);
	mark_buffer_dirty(leaf_buf);

	ret = 0;
	if (slot == 0)
		ret = fixup_low_keys(trans, root, path, &disk_key, 1);

	BUG_ON(!buffer_dirty(leaf_buf));
	if (btrfs_leaf_free_space(root, leaf) < 0)
		BUG();
	check_leaf(root, path, 0);
@@ -1233,6 +1238,7 @@ int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root
		ptr = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]),
				     path.slots[0], u8);
		memcpy(ptr, data, data_size);
		mark_buffer_dirty(path.nodes[0]);
	}
	btrfs_release_path(root, &path);
	return ret;
@@ -1273,7 +1279,7 @@ static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
		if (wret)
			ret = wret;
	}
	BUG_ON(!buffer_dirty(parent));
	mark_buffer_dirty(parent);
	return ret;
}

@@ -1368,8 +1374,11 @@ int btrfs_del_item(struct btrfs_trans_handle *trans, struct btrfs_root *root,
				if (wret)
					ret = wret;
			} else {
				mark_buffer_dirty(leaf_buf);
				btrfs_block_release(root, leaf_buf);
			}
		} else {
			mark_buffer_dirty(leaf_buf);
		}
	}
	return ret;
+1 −1
Original line number Diff line number Diff line
@@ -833,7 +833,7 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root
int btrfs_find_last_root(struct btrfs_root *root, u64 objectid, struct
			 btrfs_root_item *item, struct btrfs_key *key);
int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
			  *root, char *name, int name_len, u64 dir, u64
			  *root, const char *name, int name_len, u64 dir, u64
			  objectid, u8 type);
int btrfs_lookup_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
			  *root, struct btrfs_path *path, u64 dir,
+2 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
#include "transaction.h"

int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
			  *root, char *name, int name_len, u64 dir, u64
			  *root, const char *name, int name_len, u64 dir, u64
			  objectid, u8 type)
{
	int ret = 0;
@@ -35,6 +35,7 @@ int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
	btrfs_set_dir_name_len(dir_item, name_len);
	name_ptr = (char *)(dir_item + 1);
	memcpy(name_ptr, name, name_len);
	mark_buffer_dirty(path.nodes[0]);
out:
	btrfs_release_path(root, &path);
	return ret;
+12 −11
Original line number Diff line number Diff line
@@ -145,19 +145,20 @@ struct btrfs_root *open_ctree(struct super_block *sb,
int write_ctree_super(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root)
{
	return 0;
#if 0
	int ret;
	btrfs_set_super_root(s, root->fs_info->tree_root->node->b_blocknr);

	ret = pwrite(root->fs_info->fp, s, sizeof(*s),
		     BTRFS_SUPER_INFO_OFFSET);
	if (ret != sizeof(*s)) {
		fprintf(stderr, "failed to write new super block err %d\n", ret);
		return ret;
	struct buffer_head *bh = root->fs_info->sb_buffer;
	btrfs_set_super_root(root->fs_info->disk_super,
			     root->fs_info->tree_root->node->b_blocknr);
	lock_buffer(bh);
	clear_buffer_dirty(bh);
	bh->b_end_io = end_buffer_write_sync;
	get_bh(bh);
	submit_bh(WRITE, bh);
	wait_on_buffer(bh);
	if (!buffer_uptodate(bh)) {
		WARN_ON(1);
		return -EIO;
	}
	return 0;
#endif
}

int close_ctree(struct btrfs_root *root)
Loading