summaryrefslogtreecommitdiff
path: root/mkfs.c
diff options
context:
space:
mode:
authorQu Wenruo <quwenruo@cn.fujitsu.com>2015-07-14 10:13:01 +0800
committerDavid Sterba <dsterba@suse.com>2015-07-14 13:42:13 +0200
commit922352bcfbd41912559919fc6bef1f89406881c7 (patch)
treee94836d386c4d49b812d5c24fd874da98115efa1 /mkfs.c
parent20be329fdb569fefdf88ba0e4ca1a41488fcbc19 (diff)
Revert "btrfs-progs: mkfs: create only desired block groups for single device"
This reverts commit 5f8232e5c8f0b0de0ef426274911385b0e877392. This commit causes a regression: $ mkfs.btrfs -f /dev/sda6 $ btrfsck /dev/sda6 Checking filesystem on /dev/sda6 UUID: 2ebb483c-1986-4610-802a-c6f3e6ab4b76 checking extents Chunk[256, 228, 0]: length(4194304), offset(0), type(2) mismatch with block group[0, 192, 4194304]: offset(4194304), objectid(0), flags(34) Chunk[256, 228, 4194304]: length(8388608), offset(4194304), type(4) mismatch with block group[4194304, 192, 8388608]: offset(8388608), objectid(4194304), flags(36) Block group[0, 4194304] (flags = 34) didn't find the relative chunk. Block group[4194304, 8388608] (flags = 36) didn't find the relative chunk. ...... The commit has the following bug causing the problem. 1) Typo forgets to add meta/data_profile for alloc_chunk. Only meta/data_profile is added to allocate a block group, but not chunk. 2) Type for the first system chunk is impossible to modify yet. The type for the first chunk and its stripe is hard coded into make_btrfs() function. So even we try to modify the type of the block group, we are unable to change the type of the first chunk. Causing the chunk type mismatch problem. The 1st bug can be fixed quite easily but the second is not. The good news is, the last patch "btrfs-progs: mkfs: Cleanup temporary chunk to avoid strange balance behavior." from my patchset can handle it quite well alone. So just revert the patch. New bug fix for btrfsck(err is 0 even chunk/extent tree is corrupted) and new test cases for mkfs will follow soon. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'mkfs.c')
-rw-r--r--mkfs.c34
1 files changed, 7 insertions, 27 deletions
diff --git a/mkfs.c b/mkfs.c
index b60fc5a1..dafd500f 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -59,9 +59,8 @@ struct mkfs_allocation {
u64 system;
};
-static int create_metadata_block_groups(struct btrfs_root *root,
- u64 metadata_profile, int mixed,
- struct mkfs_allocation *allocation)
+static int create_metadata_block_groups(struct btrfs_root *root, int mixed,
+ struct mkfs_allocation *allocation)
{
struct btrfs_trans_handle *trans;
u64 bytes_used;
@@ -74,7 +73,6 @@ static int create_metadata_block_groups(struct btrfs_root *root,
root->fs_info->system_allocs = 1;
ret = btrfs_make_block_group(trans, root, bytes_used,
- metadata_profile |
BTRFS_BLOCK_GROUP_SYSTEM,
BTRFS_FIRST_CHUNK_TREE_OBJECTID,
0, BTRFS_MKFS_SYSTEM_GROUP_SIZE);
@@ -93,7 +91,6 @@ static int create_metadata_block_groups(struct btrfs_root *root,
}
BUG_ON(ret);
ret = btrfs_make_block_group(trans, root, 0,
- metadata_profile |
BTRFS_BLOCK_GROUP_METADATA |
BTRFS_BLOCK_GROUP_DATA,
BTRFS_FIRST_CHUNK_TREE_OBJECTID,
@@ -110,7 +107,6 @@ static int create_metadata_block_groups(struct btrfs_root *root,
}
BUG_ON(ret);
ret = btrfs_make_block_group(trans, root, 0,
- metadata_profile |
BTRFS_BLOCK_GROUP_METADATA,
BTRFS_FIRST_CHUNK_TREE_OBJECTID,
chunk_start, chunk_size);
@@ -126,7 +122,7 @@ err:
}
static int create_data_block_groups(struct btrfs_trans_handle *trans,
- struct btrfs_root *root, u64 data_profile, int mixed,
+ struct btrfs_root *root, int mixed,
struct mkfs_allocation *allocation)
{
u64 chunk_start = 0;
@@ -143,7 +139,6 @@ static int create_data_block_groups(struct btrfs_trans_handle *trans,
}
BUG_ON(ret);
ret = btrfs_make_block_group(trans, root, 0,
- data_profile |
BTRFS_BLOCK_GROUP_DATA,
BTRFS_FIRST_CHUNK_TREE_OBJECTID,
chunk_start, chunk_size);
@@ -1194,8 +1189,6 @@ int main(int ac, char **av)
u64 alloc_start = 0;
u64 metadata_profile = 0;
u64 data_profile = 0;
- u64 default_metadata_profile = 0;
- u64 default_data_profile = 0;
u32 nodesize = max_t(u32, sysconf(_SC_PAGESIZE),
BTRFS_MKFS_DEFAULT_NODE_SIZE);
u32 sectorsize = 4096;
@@ -1554,19 +1547,7 @@ int main(int ac, char **av)
}
root->fs_info->alloc_start = alloc_start;
- if (dev_cnt == 0) {
- default_metadata_profile = metadata_profile;
- default_data_profile = data_profile;
- } else {
- /*
- * Temporary groups to store new device entries
- */
- default_metadata_profile = 0;
- default_data_profile = 0;
- }
-
- ret = create_metadata_block_groups(root, default_metadata_profile,
- mixed, &allocation);
+ ret = create_metadata_block_groups(root, mixed, &allocation);
if (ret) {
fprintf(stderr, "failed to create default block groups\n");
exit(1);
@@ -1575,8 +1556,7 @@ int main(int ac, char **av)
trans = btrfs_start_transaction(root, 1);
BUG_ON(!trans);
- ret = create_data_block_groups(trans, root, default_data_profile,
- mixed, &allocation);
+ ret = create_data_block_groups(trans, root, mixed, &allocation);
if (ret) {
fprintf(stderr, "failed to create default data block groups\n");
exit(1);
@@ -1596,7 +1576,7 @@ int main(int ac, char **av)
btrfs_register_one_device(file);
if (dev_cnt == 0)
- goto skip_multidev;
+ goto raid_groups;
while (dev_cnt-- > 0) {
int old_mixed = mixed;
@@ -1646,12 +1626,12 @@ int main(int ac, char **av)
btrfs_register_one_device(file);
}
+raid_groups:
if (!source_dir_set) {
ret = create_raid_groups(trans, root, data_profile,
metadata_profile, mixed, &allocation);
BUG_ON(ret);
}
-skip_multidev:
ret = create_data_reloc_tree(trans, root);
BUG_ON(ret);