diff mbox

Revert "btrfs-progs: mkfs: create only desired block groups for single device"

Message ID 1436839981-20432-1-git-send-email-quwenruo@cn.fujitsu.com (mailing list archive)
State Accepted
Headers show

Commit Message

Qu Wenruo July 14, 2015, 2:13 a.m. UTC
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>
---
 mkfs.c | 34 +++++++---------------------------
 1 file changed, 7 insertions(+), 27 deletions(-)

Comments

David Sterba July 14, 2015, 11:45 a.m. UTC | #1
On Tue, Jul 14, 2015 at 10:13:01AM +0800, Qu Wenruo wrote:
> This reverts commit 5f8232e5c8f0b0de0ef426274911385b0e877392.

Thanks.  The revert is justified for the severity of the problem, I'll
release 4.1.2 asap.

> This commit causes a regression:
> ---

BTW, do not use --- in the changelog as 'git am' will ignore the text
between that and the diff.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Qu Wenruo July 15, 2015, 12:40 a.m. UTC | #2
David Sterba wrote on 2015/07/14 13:45 +0200:
> On Tue, Jul 14, 2015 at 10:13:01AM +0800, Qu Wenruo wrote:
>> This reverts commit 5f8232e5c8f0b0de0ef426274911385b0e877392.
>
> Thanks.  The revert is justified for the severity of the problem, I'll
> release 4.1.2 asap.
>
>> This commit causes a regression:
>> ---
>
> BTW, do not use --- in the changelog as 'git am' will ignore the text
> between that and the diff.
>
Oh, sorry I forgot that "---" will be ignored by git.
Next time I'll use "===" to avoid such careless problem.

BTW, for the mkfs test case, it will be delayed for a while as the 
following bugs are making things quite tricky.

1) fsck ignore chunk errors and return 0.
Cause is known and easy to fix, but if fixed, most of fsck test won't pass.
As the following bug is causing problem.

2) btrfs-image restore bug, causing missing dev_extent for DUP chunk.
Investigating. that's the reason causing a lot of dev extent missing in 
mkfs test.
And thanks to the previous bug, we can pass fsck test like a miracle.

So I'm afraid the corresponding regression test case won't be in time 
with 4.1.2 hotfix release.

Thanks,
Qu
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Sterba July 15, 2015, 11:33 a.m. UTC | #3
On Wed, Jul 15, 2015 at 08:40:44AM +0800, Qu Wenruo wrote:
> BTW, for the mkfs test case, it will be delayed for a while as the 
> following bugs are making things quite tricky.

Good, thanks, no rush at the moment. The next release will be probably
in line with kernel 4.2 with the usual exception of important bugfixes.

> 1) fsck ignore chunk errors and return 0.
> Cause is known and easy to fix, but if fixed, most of fsck test won't pass.
> As the following bug is causing problem.
> 
> 2) btrfs-image restore bug, causing missing dev_extent for DUP chunk.
> Investigating. that's the reason causing a lot of dev extent missing in 
> mkfs test.

The image dumps may be intentionally incomplete so not all reported
errors are necessarily a problem. The restored filesystem should set the
METADUMP bit in the superblock so this can help.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/mkfs.c b/mkfs.c
index ee8a3cb..afecf00 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);
@@ -1337,8 +1332,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;
@@ -1697,19 +1690,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);
@@ -1718,8 +1699,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);
@@ -1739,7 +1719,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;
@@ -1789,12 +1769,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);