* [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 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.