|
@@ -1200,16 +1200,14 @@ btrfs_free_subvolume_writers(struct btrfs_subvolume_writers *writers)
|
|
|
kfree(writers);
|
|
|
}
|
|
|
|
|
|
-static void __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize,
|
|
|
- u32 stripesize, struct btrfs_root *root,
|
|
|
- struct btrfs_fs_info *fs_info,
|
|
|
+static void __setup_root(u32 nodesize, u32 sectorsize, u32 stripesize,
|
|
|
+ struct btrfs_root *root, struct btrfs_fs_info *fs_info,
|
|
|
u64 objectid)
|
|
|
{
|
|
|
root->node = NULL;
|
|
|
root->commit_root = NULL;
|
|
|
root->sectorsize = sectorsize;
|
|
|
root->nodesize = nodesize;
|
|
|
- root->leafsize = leafsize;
|
|
|
root->stripesize = stripesize;
|
|
|
root->state = 0;
|
|
|
root->orphan_cleanup_state = 0;
|
|
@@ -1295,7 +1293,7 @@ struct btrfs_root *btrfs_alloc_dummy_root(void)
|
|
|
root = btrfs_alloc_root(NULL);
|
|
|
if (!root)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
- __setup_root(4096, 4096, 4096, 4096, root, NULL, 1);
|
|
|
+ __setup_root(4096, 4096, 4096, root, NULL, 1);
|
|
|
set_bit(BTRFS_ROOT_DUMMY_ROOT, &root->state);
|
|
|
root->alloc_bytenr = 0;
|
|
|
|
|
@@ -1318,14 +1316,13 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans,
|
|
|
if (!root)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- __setup_root(tree_root->nodesize, tree_root->leafsize,
|
|
|
- tree_root->sectorsize, tree_root->stripesize,
|
|
|
- root, fs_info, objectid);
|
|
|
+ __setup_root(tree_root->nodesize, tree_root->sectorsize,
|
|
|
+ tree_root->stripesize, root, fs_info, objectid);
|
|
|
root->root_key.objectid = objectid;
|
|
|
root->root_key.type = BTRFS_ROOT_ITEM_KEY;
|
|
|
root->root_key.offset = 0;
|
|
|
|
|
|
- leaf = btrfs_alloc_free_block(trans, root, root->leafsize,
|
|
|
+ leaf = btrfs_alloc_free_block(trans, root, root->nodesize,
|
|
|
0, objectid, NULL, 0, 0, 0);
|
|
|
if (IS_ERR(leaf)) {
|
|
|
ret = PTR_ERR(leaf);
|
|
@@ -1396,9 +1393,9 @@ static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans,
|
|
|
if (!root)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- __setup_root(tree_root->nodesize, tree_root->leafsize,
|
|
|
- tree_root->sectorsize, tree_root->stripesize,
|
|
|
- root, fs_info, BTRFS_TREE_LOG_OBJECTID);
|
|
|
+ __setup_root(tree_root->nodesize, tree_root->sectorsize,
|
|
|
+ tree_root->stripesize, root, fs_info,
|
|
|
+ BTRFS_TREE_LOG_OBJECTID);
|
|
|
|
|
|
root->root_key.objectid = BTRFS_TREE_LOG_OBJECTID;
|
|
|
root->root_key.type = BTRFS_ROOT_ITEM_KEY;
|
|
@@ -1413,7 +1410,7 @@ static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans,
|
|
|
* updated (along with back refs to the log tree).
|
|
|
*/
|
|
|
|
|
|
- leaf = btrfs_alloc_free_block(trans, root, root->leafsize, 0,
|
|
|
+ leaf = btrfs_alloc_free_block(trans, root, root->nodesize, 0,
|
|
|
BTRFS_TREE_LOG_OBJECTID, NULL,
|
|
|
0, 0, 0);
|
|
|
if (IS_ERR(leaf)) {
|
|
@@ -1465,7 +1462,7 @@ int btrfs_add_log_tree(struct btrfs_trans_handle *trans,
|
|
|
btrfs_set_stack_inode_generation(inode_item, 1);
|
|
|
btrfs_set_stack_inode_size(inode_item, 3);
|
|
|
btrfs_set_stack_inode_nlink(inode_item, 1);
|
|
|
- btrfs_set_stack_inode_nbytes(inode_item, root->leafsize);
|
|
|
+ btrfs_set_stack_inode_nbytes(inode_item, root->nodesize);
|
|
|
btrfs_set_stack_inode_mode(inode_item, S_IFDIR | 0755);
|
|
|
|
|
|
btrfs_set_root_node(&log_root->root_item, log_root->node);
|
|
@@ -1498,9 +1495,8 @@ static struct btrfs_root *btrfs_read_tree_root(struct btrfs_root *tree_root,
|
|
|
goto alloc_fail;
|
|
|
}
|
|
|
|
|
|
- __setup_root(tree_root->nodesize, tree_root->leafsize,
|
|
|
- tree_root->sectorsize, tree_root->stripesize,
|
|
|
- root, fs_info, key->objectid);
|
|
|
+ __setup_root(tree_root->nodesize, tree_root->sectorsize,
|
|
|
+ tree_root->stripesize, root, fs_info, key->objectid);
|
|
|
|
|
|
ret = btrfs_find_root(tree_root, key, path,
|
|
|
&root->root_item, &root->root_key);
|
|
@@ -1511,7 +1507,7 @@ static struct btrfs_root *btrfs_read_tree_root(struct btrfs_root *tree_root,
|
|
|
}
|
|
|
|
|
|
generation = btrfs_root_generation(&root->root_item);
|
|
|
- blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item));
|
|
|
+ blocksize = root->nodesize;
|
|
|
root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item),
|
|
|
blocksize, generation);
|
|
|
if (!root->node) {
|
|
@@ -2143,7 +2139,6 @@ int open_ctree(struct super_block *sb,
|
|
|
{
|
|
|
u32 sectorsize;
|
|
|
u32 nodesize;
|
|
|
- u32 leafsize;
|
|
|
u32 blocksize;
|
|
|
u32 stripesize;
|
|
|
u64 generation;
|
|
@@ -2389,7 +2384,7 @@ int open_ctree(struct super_block *sb,
|
|
|
goto fail_alloc;
|
|
|
}
|
|
|
|
|
|
- __setup_root(4096, 4096, 4096, 4096, tree_root,
|
|
|
+ __setup_root(4096, 4096, 4096, tree_root,
|
|
|
fs_info, BTRFS_ROOT_TREE_OBJECTID);
|
|
|
|
|
|
invalidate_bdev(fs_devices->latest_bdev);
|
|
@@ -2469,19 +2464,22 @@ int open_ctree(struct super_block *sb,
|
|
|
goto fail_alloc;
|
|
|
}
|
|
|
|
|
|
- if (btrfs_super_leafsize(disk_super) !=
|
|
|
+ /*
|
|
|
+ * Leafsize and nodesize were always equal, this is only a sanity check.
|
|
|
+ */
|
|
|
+ if (le32_to_cpu(disk_super->__unused_leafsize) !=
|
|
|
btrfs_super_nodesize(disk_super)) {
|
|
|
printk(KERN_ERR "BTRFS: couldn't mount because metadata "
|
|
|
"blocksizes don't match. node %d leaf %d\n",
|
|
|
btrfs_super_nodesize(disk_super),
|
|
|
- btrfs_super_leafsize(disk_super));
|
|
|
+ le32_to_cpu(disk_super->__unused_leafsize));
|
|
|
err = -EINVAL;
|
|
|
goto fail_alloc;
|
|
|
}
|
|
|
- if (btrfs_super_leafsize(disk_super) > BTRFS_MAX_METADATA_BLOCKSIZE) {
|
|
|
+ if (btrfs_super_nodesize(disk_super) > BTRFS_MAX_METADATA_BLOCKSIZE) {
|
|
|
printk(KERN_ERR "BTRFS: couldn't mount because metadata "
|
|
|
"blocksize (%d) was too large\n",
|
|
|
- btrfs_super_leafsize(disk_super));
|
|
|
+ btrfs_super_nodesize(disk_super));
|
|
|
err = -EINVAL;
|
|
|
goto fail_alloc;
|
|
|
}
|
|
@@ -2498,17 +2496,16 @@ int open_ctree(struct super_block *sb,
|
|
|
* flag our filesystem as having big metadata blocks if
|
|
|
* they are bigger than the page size
|
|
|
*/
|
|
|
- if (btrfs_super_leafsize(disk_super) > PAGE_CACHE_SIZE) {
|
|
|
+ if (btrfs_super_nodesize(disk_super) > PAGE_CACHE_SIZE) {
|
|
|
if (!(features & BTRFS_FEATURE_INCOMPAT_BIG_METADATA))
|
|
|
printk(KERN_INFO "BTRFS: flagging fs with big metadata feature\n");
|
|
|
features |= BTRFS_FEATURE_INCOMPAT_BIG_METADATA;
|
|
|
}
|
|
|
|
|
|
nodesize = btrfs_super_nodesize(disk_super);
|
|
|
- leafsize = btrfs_super_leafsize(disk_super);
|
|
|
sectorsize = btrfs_super_sectorsize(disk_super);
|
|
|
stripesize = btrfs_super_stripesize(disk_super);
|
|
|
- fs_info->dirty_metadata_batch = leafsize * (1 + ilog2(nr_cpu_ids));
|
|
|
+ fs_info->dirty_metadata_batch = nodesize * (1 + ilog2(nr_cpu_ids));
|
|
|
fs_info->delalloc_batch = sectorsize * 512 * (1 + ilog2(nr_cpu_ids));
|
|
|
|
|
|
/*
|
|
@@ -2516,7 +2513,7 @@ int open_ctree(struct super_block *sb,
|
|
|
* extent buffers for the same range. It leads to corruptions
|
|
|
*/
|
|
|
if ((features & BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS) &&
|
|
|
- (sectorsize != leafsize)) {
|
|
|
+ (sectorsize != nodesize)) {
|
|
|
printk(KERN_WARNING "BTRFS: unequal leaf/node/sector sizes "
|
|
|
"are not allowed for mixed block groups on %s\n",
|
|
|
sb->s_id);
|
|
@@ -2615,7 +2612,6 @@ int open_ctree(struct super_block *sb,
|
|
|
4 * 1024 * 1024 / PAGE_CACHE_SIZE);
|
|
|
|
|
|
tree_root->nodesize = nodesize;
|
|
|
- tree_root->leafsize = leafsize;
|
|
|
tree_root->sectorsize = sectorsize;
|
|
|
tree_root->stripesize = stripesize;
|
|
|
|
|
@@ -2642,12 +2638,11 @@ int open_ctree(struct super_block *sb,
|
|
|
goto fail_sb_buffer;
|
|
|
}
|
|
|
|
|
|
- blocksize = btrfs_level_size(tree_root,
|
|
|
- btrfs_super_chunk_root_level(disk_super));
|
|
|
+ blocksize = tree_root->nodesize;
|
|
|
generation = btrfs_super_chunk_root_generation(disk_super);
|
|
|
|
|
|
- __setup_root(nodesize, leafsize, sectorsize, stripesize,
|
|
|
- chunk_root, fs_info, BTRFS_CHUNK_TREE_OBJECTID);
|
|
|
+ __setup_root(nodesize, sectorsize, stripesize, chunk_root,
|
|
|
+ fs_info, BTRFS_CHUNK_TREE_OBJECTID);
|
|
|
|
|
|
chunk_root->node = read_tree_block(chunk_root,
|
|
|
btrfs_super_chunk_root(disk_super),
|
|
@@ -2684,8 +2679,7 @@ int open_ctree(struct super_block *sb,
|
|
|
}
|
|
|
|
|
|
retry_root_backup:
|
|
|
- blocksize = btrfs_level_size(tree_root,
|
|
|
- btrfs_super_root_level(disk_super));
|
|
|
+ blocksize = tree_root->nodesize;
|
|
|
generation = btrfs_super_generation(disk_super);
|
|
|
|
|
|
tree_root->node = read_tree_block(tree_root,
|
|
@@ -2859,9 +2853,7 @@ retry_root_backup:
|
|
|
err = -EIO;
|
|
|
goto fail_qgroup;
|
|
|
}
|
|
|
- blocksize =
|
|
|
- btrfs_level_size(tree_root,
|
|
|
- btrfs_super_log_root_level(disk_super));
|
|
|
+ blocksize = tree_root->nodesize;
|
|
|
|
|
|
log_tree_root = btrfs_alloc_root(fs_info);
|
|
|
if (!log_tree_root) {
|
|
@@ -2869,7 +2861,7 @@ retry_root_backup:
|
|
|
goto fail_qgroup;
|
|
|
}
|
|
|
|
|
|
- __setup_root(nodesize, leafsize, sectorsize, stripesize,
|
|
|
+ __setup_root(nodesize, sectorsize, stripesize,
|
|
|
log_tree_root, fs_info, BTRFS_TREE_LOG_OBJECTID);
|
|
|
|
|
|
log_tree_root->node = read_tree_block(tree_root, bytenr,
|
|
@@ -4008,8 +4000,8 @@ static int btrfs_destroy_marked_extents(struct btrfs_root *root,
|
|
|
clear_extent_bits(dirty_pages, start, end, mark, GFP_NOFS);
|
|
|
while (start <= end) {
|
|
|
eb = btrfs_find_tree_block(root, start,
|
|
|
- root->leafsize);
|
|
|
- start += root->leafsize;
|
|
|
+ root->nodesize);
|
|
|
+ start += root->nodesize;
|
|
|
if (!eb)
|
|
|
continue;
|
|
|
wait_on_extent_buffer_writeback(eb);
|