* [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 a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox