* [PATCH 0/2] btrfs-progs: fix csum metadata reservation and add a basic test case for itb
@ 2024-06-18 6:50 Qu Wenruo
2024-06-18 6:50 ` [PATCH 1/2] btrfs-progs: change-csum: fix the wrong metadata space reservation Qu Wenruo
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Qu Wenruo @ 2024-06-18 6:50 UTC (permalink / raw)
To: linux-btrfs
The current csum conversion is using an incorrect parameter for
btrfs_start_transaction(), which is 16K times larger than the expected
metadata space, thus it always fail with -ENOSPC.
Fix that first, then add a basic test case using the same populate_fs()
from convert test cases, and iterate through all the support csum
algorithms.
Qu Wenruo (2):
btrfs-progs: change-csum: fix the wrong metadata space reservation
btrfs-progs: misc-tests: add a test case for basic csum conversion
.../064-csum-conversion-basic/test.sh | 32 +++++++++++++++++++
tune/change-csum.c | 22 +++++++++----
2 files changed, 47 insertions(+), 7 deletions(-)
create mode 100755 tests/misc-tests/064-csum-conversion-basic/test.sh
--
2.45.2
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] btrfs-progs: change-csum: fix the wrong metadata space reservation
2024-06-18 6:50 [PATCH 0/2] btrfs-progs: fix csum metadata reservation and add a basic test case for itb Qu Wenruo
@ 2024-06-18 6:50 ` Qu Wenruo
2024-06-18 6:50 ` [PATCH 2/2] btrfs-progs: misc-tests: add a test case for basic csum conversion Qu Wenruo
2024-06-19 1:53 ` [PATCH 0/2] btrfs-progs: fix csum metadata reservation and add a basic test case for itb David Sterba
2 siblings, 0 replies; 4+ messages in thread
From: Qu Wenruo @ 2024-06-18 6:50 UTC (permalink / raw)
To: linux-btrfs
[BUG]
`btrfstune --csum` would always fail for a newly created btrfs:
# truncates -s 1G test.img
# ./mkfs.btrfs -f test.img
# ./btrsftune --csum xxhash test.img
WARNING: Experimental build with unstable or unfinished features
WARNING: Switching checksums is experimental, do not use for valuable data!
Proceed to switch checksums
ERROR: failed to start transaction: Unknown error -28
ERROR: failed to start transaction: No space left on device
ERROR: failed to generate new data csums: No space left on device
ERROR: btrfstune failed
[CAUSE]
After commit e79f18a4a75f ("btrfs-progs: introduce a basic metadata free
space reservation check"), btrfs_start_transaction() would check the
metadata space.
But at the time of introduction of csum conversion, the parameter for
btrfs_start_transaction() is incorrect.
The 2nd parameter is the *number* of items to be added (if we're
deleting items, just pass 1).
However commit 08a3bd7694b6 ("btrfs-progs: tune: add the ability to
generate new data checksums") is using the item size, not the number of
items to be added.
This means we're passing a number 8 * nodesize times larger than the
original size, no wonder we would error out with -ENOSPC.
[FIX]
Use proper calcuation to convert the new csum item size to number of
leaves needed, and double it just in case.
Signed-off-by: Qu Wenruo <wqu@suse.com>
---
tune/change-csum.c | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/tune/change-csum.c b/tune/change-csum.c
index f5fc3c7f32cb..371e0aa76fc1 100644
--- a/tune/change-csum.c
+++ b/tune/change-csum.c
@@ -224,14 +224,26 @@ out:
* item.
*/
#define CSUM_CHANGE_BYTES_THRESHOLD (SZ_2M)
+
+static unsigned int calc_csum_change_nr_items(struct btrfs_fs_info *fs_info,
+ u16 new_csum_type)
+{
+ const u32 new_csum_size = btrfs_csum_type_size(new_csum_type);
+ const u32 csum_item_size = CSUM_CHANGE_BYTES_THRESHOLD /
+ fs_info->sectorsize * new_csum_size;
+
+ return round_up(csum_item_size, fs_info->nodesize) / fs_info->nodesize * 2;
+}
+
static int generate_new_data_csums_range(struct btrfs_fs_info *fs_info, u64 start,
u16 new_csum_type)
{
+ const unsigned int nr_items = calc_csum_change_nr_items(fs_info,
+ new_csum_type);
struct btrfs_root *csum_root = btrfs_csum_root(fs_info, 0);
struct btrfs_trans_handle *trans;
struct btrfs_path path = { 0 };
struct btrfs_key key;
- const u32 new_csum_size = btrfs_csum_type_size(new_csum_type);
void *csum_buffer;
u64 converted_bytes = 0;
u64 last_csum;
@@ -248,9 +260,7 @@ static int generate_new_data_csums_range(struct btrfs_fs_info *fs_info, u64 star
if (!csum_buffer)
return -ENOMEM;
- trans = btrfs_start_transaction(csum_root,
- CSUM_CHANGE_BYTES_THRESHOLD / fs_info->sectorsize *
- new_csum_size);
+ trans = btrfs_start_transaction(csum_root, nr_items);
if (IS_ERR(trans)) {
ret = PTR_ERR(trans);
errno = -ret;
@@ -306,9 +316,7 @@ static int generate_new_data_csums_range(struct btrfs_fs_info *fs_info, u64 star
return -EUCLEAN;
if (ret < 0)
goto out;
- trans = btrfs_start_transaction(csum_root,
- CSUM_CHANGE_BYTES_THRESHOLD /
- fs_info->sectorsize * new_csum_size);
+ trans = btrfs_start_transaction(csum_root, nr_items);
if (IS_ERR(trans)) {
ret = PTR_ERR(trans);
goto out;
--
2.45.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] btrfs-progs: misc-tests: add a test case for basic csum conversion
2024-06-18 6:50 [PATCH 0/2] btrfs-progs: fix csum metadata reservation and add a basic test case for itb Qu Wenruo
2024-06-18 6:50 ` [PATCH 1/2] btrfs-progs: change-csum: fix the wrong metadata space reservation Qu Wenruo
@ 2024-06-18 6:50 ` Qu Wenruo
2024-06-19 1:53 ` [PATCH 0/2] btrfs-progs: fix csum metadata reservation and add a basic test case for itb David Sterba
2 siblings, 0 replies; 4+ messages in thread
From: Qu Wenruo @ 2024-06-18 6:50 UTC (permalink / raw)
To: linux-btrfs
The new test case would:
- Create a btrfs with crc32c csum
- Populate the fs
- Convert the fs to the following csums:
* xxhash
* blake2
* sha256
* crc32c
Signed-off-by: Qu Wenruo <wqu@suse.com>
---
.../064-csum-conversion-basic/test.sh | 32 +++++++++++++++++++
1 file changed, 32 insertions(+)
create mode 100755 tests/misc-tests/064-csum-conversion-basic/test.sh
diff --git a/tests/misc-tests/064-csum-conversion-basic/test.sh b/tests/misc-tests/064-csum-conversion-basic/test.sh
new file mode 100755
index 000000000000..2f8be0e9b324
--- /dev/null
+++ b/tests/misc-tests/064-csum-conversion-basic/test.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+#
+# Verify the csum conversion works as expected.
+#
+source "$TEST_TOP/common" || exit
+source "$TEST_TOP/common.convert" || exit
+
+check_experimental_build
+setup_root_helper
+prepare_test_dev
+
+convert_to_csum()
+{
+ local new_csum=$1
+
+ run_check "$TOP/btrfstune" --csum "$new_csum" "$TEST_DEV"
+ run_check "$TOP/btrfs" check --check-data-csum "$TEST_DEV"
+}
+
+run_check_mkfs_test_dev --csum crc32c
+
+# We only mount the fs once to populate its contents,
+# later one we would never mount the fs (to reduce the dependency on
+# kernel features).
+run_check_mount_test_dev
+populate_fs
+run_check_umount_test_dev
+
+convert_to_csum xxhash
+convert_to_csum blake2
+convert_to_csum sha256
+convert_to_csum crc32c
--
2.45.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 0/2] btrfs-progs: fix csum metadata reservation and add a basic test case for itb
2024-06-18 6:50 [PATCH 0/2] btrfs-progs: fix csum metadata reservation and add a basic test case for itb Qu Wenruo
2024-06-18 6:50 ` [PATCH 1/2] btrfs-progs: change-csum: fix the wrong metadata space reservation Qu Wenruo
2024-06-18 6:50 ` [PATCH 2/2] btrfs-progs: misc-tests: add a test case for basic csum conversion Qu Wenruo
@ 2024-06-19 1:53 ` David Sterba
2 siblings, 0 replies; 4+ messages in thread
From: David Sterba @ 2024-06-19 1:53 UTC (permalink / raw)
To: Qu Wenruo; +Cc: linux-btrfs
On Tue, Jun 18, 2024 at 04:20:47PM +0930, Qu Wenruo wrote:
> The current csum conversion is using an incorrect parameter for
> btrfs_start_transaction(), which is 16K times larger than the expected
> metadata space, thus it always fail with -ENOSPC.
>
> Fix that first, then add a basic test case using the same populate_fs()
> from convert test cases, and iterate through all the support csum
> algorithms.
>
> Qu Wenruo (2):
> btrfs-progs: change-csum: fix the wrong metadata space reservation
> btrfs-progs: misc-tests: add a test case for basic csum conversion
Added to devel, thanks.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-06-19 1:53 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-18 6:50 [PATCH 0/2] btrfs-progs: fix csum metadata reservation and add a basic test case for itb Qu Wenruo
2024-06-18 6:50 ` [PATCH 1/2] btrfs-progs: change-csum: fix the wrong metadata space reservation Qu Wenruo
2024-06-18 6:50 ` [PATCH 2/2] btrfs-progs: misc-tests: add a test case for basic csum conversion Qu Wenruo
2024-06-19 1:53 ` [PATCH 0/2] btrfs-progs: fix csum metadata reservation and add a basic test case for itb David Sterba
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.