btrfs: qgroup: do not leak -ENOENT from btrfs_remove_qgroup()

If btrfs_remove_qgroup() is called on a qgroup that only exists in the
rb-tree, then del_qgroup_item() will return -ENOENT, and we tolerate
that -ENOENT.

However if the to-be-deleted qgroup has no parent qgroups, the @ret will
not be updated, and will leak to user space.

It will make the ioctl() caller incorrectly assume the operation failed.

Fix it by resetting @ret to 0 after a successful or tolerated
del_qgroup_item() call, so the -ENOENT from del_qgroup_item() won't be
leaked.

Assisted-by: LLM (exposing this pre-existing problem)
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Qu Wenruo 2026-10-01 14:46:17 +09:30 committed by David Sterba
parent 65583d4749
commit 727bb633fe

View File

@ -1850,6 +1850,7 @@ int btrfs_remove_qgroup(struct btrfs_trans_handle *trans, u64 qgroupid)
ret = del_qgroup_item(trans, qgroupid);
if (ret && ret != -ENOENT)
goto out;
ret = 0;
while (!list_empty(&qgroup->groups)) {
list = list_first_entry(&qgroup->groups,