diff options
author | Chris Mason <chris.mason@oracle.com> | 2008-04-04 15:42:17 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@hera.kernel.org> | 2008-04-04 15:42:17 -0400 |
commit | a37e1e720451664477b030242616b3e48d31013e (patch) | |
tree | e47d2a0956b071d1483427bae0f4e90e8a32cf55 /mkfs.c | |
parent | a57a255e442c8d8d3c1c28780af84483c3b5ec21 (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.c | 45 |
1 files changed, 44 insertions, 1 deletions
@@ -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); } |