summaryrefslogtreecommitdiff
path: root/mkfs.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-04-04 15:42:17 -0400
committerDavid Woodhouse <dwmw2@hera.kernel.org>2008-04-04 15:42:17 -0400
commita37e1e720451664477b030242616b3e48d31013e (patch)
treee47d2a0956b071d1483427bae0f4e90e8a32cf55 /mkfs.c
parenta57a255e442c8d8d3c1c28780af84483c3b5ec21 (diff)
Recow all roots at the end of mkfs
The mkfs code bootstraps the filesystem on a single device. Once the raid block groups are setup, it needs to recow all of the blocks so that each tree is properly allocated.
Diffstat (limited to 'mkfs.c')
-rw-r--r--mkfs.c45
1 files changed, 44 insertions, 1 deletions
diff --git a/mkfs.c b/mkfs.c
index 4d28bdf0..506b6e04 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -139,6 +139,42 @@ err:
return ret;
}
+static int recow_roots(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root)
+{
+ int ret;
+ struct extent_buffer *tmp;
+ struct btrfs_fs_info *info = root->fs_info;
+
+ ret = __btrfs_cow_block(trans, info->fs_root, info->fs_root->node,
+ NULL, 0, &tmp, 0, 0);
+ BUG_ON(ret);
+ free_extent_buffer(tmp);
+
+ ret = __btrfs_cow_block(trans, info->tree_root, info->tree_root->node,
+ NULL, 0, &tmp, 0, 0);
+ BUG_ON(ret);
+ free_extent_buffer(tmp);
+
+ ret = __btrfs_cow_block(trans, info->extent_root,
+ info->extent_root->node, NULL, 0, &tmp, 0, 0);
+ BUG_ON(ret);
+ free_extent_buffer(tmp);
+
+ ret = __btrfs_cow_block(trans, info->chunk_root, info->chunk_root->node,
+ NULL, 0, &tmp, 0, 0);
+ BUG_ON(ret);
+ free_extent_buffer(tmp);
+
+
+ ret = __btrfs_cow_block(trans, info->dev_root, info->dev_root->node,
+ NULL, 0, &tmp, 0, 0);
+ BUG_ON(ret);
+ free_extent_buffer(tmp);
+
+ return 0;
+}
+
static int create_one_raid_group(struct btrfs_trans_handle *trans,
struct btrfs_root *root, u64 type)
{
@@ -171,9 +207,17 @@ static int create_raid_groups(struct btrfs_trans_handle *trans,
if (allowed & metadata_profile) {
ret = create_one_raid_group(trans, root,
+ BTRFS_BLOCK_GROUP_SYSTEM |
+ (allowed & metadata_profile));
+ BUG_ON(ret);
+
+ ret = create_one_raid_group(trans, root,
BTRFS_BLOCK_GROUP_METADATA |
(allowed & metadata_profile));
BUG_ON(ret);
+
+ ret = recow_roots(trans, root);
+ BUG_ON(ret);
}
if (num_devices > 1 && (allowed & data_profile)) {
ret = create_one_raid_group(trans, root,
@@ -362,7 +406,6 @@ int main(int ac, char **av)
ret = btrfs_add_to_fsid(trans, root, fd, dev_block_count,
sectorsize, sectorsize, sectorsize);
BUG_ON(ret);
- close(fd);
btrfs_register_one_device(file);
}