* [PATCH 0/2] btrfs-progs: mkfs: fix garbage in QGROUP_LIMIT @ 2026-11-10 22:33 Qu Wenruo 2026-11-10 22:33 ` [PATCH 1/2] btrfs-progs: mkfs: fix garbage in the QGROUP_LIMIT item Qu Wenruo 2026-11-10 22:33 ` [PATCH 2/2] btrfs-progs: tests: add test for zeroed QGROUP_LIMIT item from mkfs Qu Wenruo 0 siblings, 2 replies; 3+ messages in thread From: Qu Wenruo @ 2026-11-10 22:33 UTC (permalink / raw) To: linux-btrfs Running "mkfs.btrfs -O quota" will result garbage values in QGROUP_LIMIT items. This is inspired by recent tree-checker changes to check QGROUP_LIMIT and QGROUP_INFO. And a new test case for it. Qu Wenruo (2): btrfs-progs: mkfs: fix garbage in the QGROUP_LIMIT item btrfs-progs: tests: add test for zeroed QGROUP_LIMIT item from mkfs mkfs/main.c | 6 ++++ .../046-qgroup-limit-zeroed/test.sh | 30 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100755 tests/mkfs-tests/046-qgroup-limit-zeroed/test.sh -- 2.56.0 ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] btrfs-progs: mkfs: fix garbage in the QGROUP_LIMIT item 2026-11-10 22:33 [PATCH 0/2] btrfs-progs: mkfs: fix garbage in QGROUP_LIMIT Qu Wenruo @ 2026-11-10 22:33 ` Qu Wenruo 2026-11-10 22:33 ` [PATCH 2/2] btrfs-progs: tests: add test for zeroed QGROUP_LIMIT item from mkfs Qu Wenruo 1 sibling, 0 replies; 3+ messages in thread From: Qu Wenruo @ 2026-11-10 22:33 UTC (permalink / raw) To: linux-btrfs [BUG] If using "-O quota" option of mkfs.btrfs, the resulted image will have garbage in the QGROUP_LIMIT item: quota tree key (QUOTA_TREE ROOT_ITEM 0) leaf 30474240 items 3 free space 16088 generation 11 owner QUOTA_TREE leaf 30474240 flags 0x1(WRITTEN) backref revision 1 item 0 key (0 QGROUP_STATUS 0) itemoff 16243 itemsize 40 version 1 generation 11 flags ON scan 0 item 1 key (0 QGROUP_INFO 0/5) itemoff 16203 itemsize 40 generation 10 referenced 16384 referenced_compressed 16384 exclusive 16384 exclusive_compressed 16384 item 2 key (0 QGROUP_LIMIT 0/5) itemoff 16163 itemsize 40 flags 500000 max_referenced 8388608 max_exclusive 8954665512184738474 rsv_referenced 5153854573009882032 rsv_exclusive 3 ^^^^^^^^^^^^^^^^^^^ [CAUSE] The QGROUP_INFO and QGROUP_LIMIT items are inserted using btrfs_insert_empty_item(), which will not do any cleanup for the new item, so it will reuse whatever is left in the tree block. For QGROUP_INFO it's not a big deal as later repair_qgroups() will update the item, but QGROUP_LIMIT garbage is left there. [FIX] Zero the newly inserted empty items for both QGROUP_INFO and QGROUP_LIMIT. Signed-off-by: Qu Wenruo <wqu@suse.com> --- mkfs/main.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mkfs/main.c b/mkfs/main.c index d61af04e055e..74b98fccf3f6 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -897,6 +897,9 @@ static int insert_qgroup_items(struct btrfs_trans_handle *trans, ret = btrfs_insert_empty_item(trans, quota_root, &path, &key, sizeof(struct btrfs_qgroup_info_item)); + memset_extent_buffer(path.nodes[0], 0, + btrfs_item_ptr_offset(path.nodes[0], path.slots[0]), + btrfs_item_size(path.nodes[0], path.slots[0])); btrfs_release_path(&path); if (ret < 0) return ret; @@ -906,6 +909,9 @@ static int insert_qgroup_items(struct btrfs_trans_handle *trans, key.offset = qgroupid; ret = btrfs_insert_empty_item(trans, quota_root, &path, &key, sizeof(struct btrfs_qgroup_limit_item)); + memset_extent_buffer(path.nodes[0], 0, + btrfs_item_ptr_offset(path.nodes[0], path.slots[0]), + btrfs_item_size(path.nodes[0], path.slots[0])); return ret; } -- 2.56.0 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] btrfs-progs: tests: add test for zeroed QGROUP_LIMIT item from mkfs 2026-11-10 22:33 [PATCH 0/2] btrfs-progs: mkfs: fix garbage in QGROUP_LIMIT Qu Wenruo 2026-11-10 22:33 ` [PATCH 1/2] btrfs-progs: mkfs: fix garbage in the QGROUP_LIMIT item Qu Wenruo @ 2026-11-10 22:33 ` Qu Wenruo 1 sibling, 0 replies; 3+ messages in thread From: Qu Wenruo @ 2026-11-10 22:33 UTC (permalink / raw) To: linux-btrfs Add a mkfs test that creates a filesystem with '-O quota' and verifies all members of the QGROUP_LIMIT items are zero. This covers the garbage fix in the previous commit. Assisted-by: LLM (generate the test case) Signed-off-by: Qu Wenruo <wqu@suse.com> --- .../046-qgroup-limit-zeroed/test.sh | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100755 tests/mkfs-tests/046-qgroup-limit-zeroed/test.sh diff --git a/tests/mkfs-tests/046-qgroup-limit-zeroed/test.sh b/tests/mkfs-tests/046-qgroup-limit-zeroed/test.sh new file mode 100755 index 000000000000..54b66927a842 --- /dev/null +++ b/tests/mkfs-tests/046-qgroup-limit-zeroed/test.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# Verify that mkfs -O quota zeroes all members of the QGROUP_LIMIT items. + +source "$TEST_TOP/common" || exit + +check_prereq mkfs.btrfs +check_prereq btrfs + +setup_root_helper +prepare_test_dev + +run_check $SUDO_HELPER "$TOP/mkfs.btrfs" -f -O quota "$TEST_DEV" + +# A good limit item should looks like: +# +# item 2 key (0 QGROUP_LIMIT 0/5) itemoff 16027 itemsize 40 +# flags 0 +# max_referenced 0 max_exclusive 0 +# rsv_referenced 0 rsv_exclusive 0 +output=$(run_check_stdout $SUDO_HELPER "$TOP/btrfs" inspect-internal dump-tree -t quota "$TEST_DEV" | \ + grep -A 3 "QGROUP_LIMIT") + +if [ -z "$output" ]; then + _fail "no QGROUP_LIMIT item found" +fi + +for member in flags max_referenced max_exclusive rsv_referenced rsv_exclusive; do + echo "$output" | grep -q -w "$member 0" || + _fail "QGROUP_LIMIT member $member is not zero" +done -- 2.56.0 ^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-11-10 22:33 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-11-10 22:33 [PATCH 0/2] btrfs-progs: mkfs: fix garbage in QGROUP_LIMIT Qu Wenruo 2026-11-10 22:33 ` [PATCH 1/2] btrfs-progs: mkfs: fix garbage in the QGROUP_LIMIT item Qu Wenruo 2026-11-10 22:33 ` [PATCH 2/2] btrfs-progs: tests: add test for zeroed QGROUP_LIMIT item from mkfs Qu Wenruo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox