Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 128297
b: refs/heads/master
c: d571976
h: refs/heads/master
i:
  128295: 30b43bc
v: v3
  • Loading branch information
Chris Mason authored and David Woodhouse committed Mar 23, 2007
1 parent 5008d12 commit 7a29c04
Show file tree
Hide file tree
Showing 11 changed files with 202 additions and 48 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 79154b1b5bcf87903db7ff16a30b360b78d6fe4f
refs/heads/master: d571976292839cec05a2820b08f7629b145ed157
1 change: 1 addition & 0 deletions trunk/fs/btrfs/TODO
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
49 changes: 29 additions & 20 deletions trunk/fs/btrfs/ctree.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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]);
Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/btrfs/ctree.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
3 changes: 2 additions & 1 deletion trunk/fs/btrfs/dir-item.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
23 changes: 12 additions & 11 deletions trunk/fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
26 changes: 17 additions & 9 deletions trunk/fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ static int inc_block_ref(struct btrfs_trans_handle *trans, struct btrfs_root
item = btrfs_item_ptr(l, path.slots[0], struct btrfs_extent_item);
refs = btrfs_extent_refs(item);
btrfs_set_extent_refs(item, refs + 1);
mark_buffer_dirty(path.nodes[0]);

btrfs_release_path(root->fs_info->extent_root, &path);
finish_current_insert(trans, root->fs_info->extent_root);
Expand Down Expand Up @@ -103,7 +104,7 @@ int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, struct
btrfs_root *root)
{
unsigned long gang[8];
struct buffer_head *gang[8];
u64 first = 0;
int ret;
int i;
Expand All @@ -116,13 +117,15 @@ int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, struct
if (!ret)
break;
if (!first)
first = gang[0];
first = gang[0]->b_blocknr;
for (i = 0; i < ret; i++) {
radix_tree_delete(&root->fs_info->pinned_radix,
gang[i]);
gang[i]->b_blocknr);
brelse(gang[i]);
}
}
root->fs_info->last_insert.objectid = first;
if (root->fs_info->last_insert.objectid > first)
root->fs_info->last_insert.objectid = first;
root->fs_info->last_insert.offset = 0;
return 0;
}
Expand Down Expand Up @@ -161,8 +164,10 @@ static int finish_current_insert(struct btrfs_trans_handle *trans, struct
static int pin_down_block(struct btrfs_root *root, u64 blocknr, int tag)
{
int err;
struct buffer_head *bh = sb_getblk(root->fs_info->sb, blocknr);
BUG_ON(!bh);
err = radix_tree_insert(&root->fs_info->pinned_radix,
blocknr, (void *)blocknr);
blocknr, bh);
BUG_ON(err);
if (err)
return err;
Expand Down Expand Up @@ -217,6 +222,7 @@ static int __free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
if (ret)
BUG();
}
mark_buffer_dirty(path.nodes[0]);
btrfs_release_path(extent_root, &path);
finish_current_insert(trans, extent_root);
return ret;
Expand All @@ -232,7 +238,7 @@ static int del_pending_extents(struct btrfs_trans_handle *trans, struct
int ret;
int wret;
int err = 0;
unsigned long gang[4];
struct buffer_head *gang[4];
int i;
struct radix_tree_root *radix = &extent_root->fs_info->pinned_radix;

Expand All @@ -245,10 +251,12 @@ static int del_pending_extents(struct btrfs_trans_handle *trans, struct
if (!ret)
break;
for (i = 0; i < ret; i++) {
radix_tree_tag_set(radix, gang[i], CTREE_EXTENT_PINNED);
radix_tree_tag_clear(radix, gang[i],
radix_tree_tag_set(radix, gang[i]->b_blocknr,
CTREE_EXTENT_PINNED);
radix_tree_tag_clear(radix, gang[i]->b_blocknr,
CTREE_EXTENT_PENDING_DEL);
wret = __free_extent(trans, extent_root, gang[i], 1);
wret = __free_extent(trans, extent_root,
gang[i]->b_blocknr, 1);
if (wret)
err = wret;
}
Expand Down
1 change: 1 addition & 0 deletions trunk/fs/btrfs/inode-map.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ int btrfs_insert_inode_map(struct btrfs_trans_handle *trans,
inode_item = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]),
path.slots[0], struct btrfs_inode_map_item);
btrfs_cpu_key_to_disk(&inode_item->key, location);
mark_buffer_dirty(path.nodes[0]);
out:
btrfs_release_path(inode_root, &path);
return ret;
Expand Down
1 change: 1 addition & 0 deletions trunk/fs/btrfs/root-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root
slot = path.slots[0];
memcpy(btrfs_item_ptr(l, slot, struct btrfs_root_item), item,
sizeof(*item));
mark_buffer_dirty(path.nodes[0]);
out:
btrfs_release_path(root, &path);
return ret;
Expand Down
Loading

0 comments on commit 7a29c04

Please sign in to comment.