Loading fs/btrfs/TODO +1 −0 Original line number Diff line number Diff line Loading @@ -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) Loading fs/btrfs/ctree.c +29 −20 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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 */ Loading Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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) Loading Loading @@ -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]); Loading Loading @@ -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); Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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; Loading fs/btrfs/ctree.h +1 −1 Original line number Diff line number Diff line Loading @@ -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, Loading fs/btrfs/dir-item.c +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading fs/btrfs/disk-io.c +12 −11 Original line number Diff line number Diff line Loading @@ -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 Loading
fs/btrfs/TODO +1 −0 Original line number Diff line number Diff line Loading @@ -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) Loading
fs/btrfs/ctree.c +29 −20 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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 */ Loading Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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) Loading Loading @@ -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]); Loading Loading @@ -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); Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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; Loading
fs/btrfs/ctree.h +1 −1 Original line number Diff line number Diff line Loading @@ -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, Loading
fs/btrfs/dir-item.c +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading
fs/btrfs/disk-io.c +12 −11 Original line number Diff line number Diff line Loading @@ -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