From nobody Sun Feb 8 16:12:24 2026 Received: from mail-oi1-f193.google.com (mail-oi1-f193.google.com [209.85.167.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 457DC238C08 for ; Sun, 11 Jan 2026 20:25:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768163104; cv=none; b=vExp91c90O6bx/LYpzXXpluCkR+hNO7s7uQshxmYifkRVVSO7oo2UHDP3oUw/FaViXRxxqCy8iY0h9TKebSCZL6Ky1bZkvlvDbKG7DTD2lTXaX/J5OJYZmXxNt7+EfJC7XtWYgGSTFu6Q2VzDhoN2tqhZeELSuFJLRptF6Ues0A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768163104; c=relaxed/simple; bh=qJvyB/3WkL8MaHiMJ2MSrGEoZoHbUS3JsMZ8irOWw40=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=DKneJzatIwqCnyYXIoitsr9qhAfokGZurOcFBSqvEbzAMn4qtlhFTPEl3+D+g5AIbUfOSvEZ8hcU/sbV36hkPjSVz/X6F0E326Tn5MhArL9UxOBE5rnEXnd9SY18BO3BygLt28JUN08SswmocTG2o6472fXsPFV8/M4Pepw2D4A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iLvFMpgZ; arc=none smtp.client-ip=209.85.167.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iLvFMpgZ" Received: by mail-oi1-f193.google.com with SMTP id 5614622812f47-4510974a8cdso3180131b6e.0 for ; Sun, 11 Jan 2026 12:25:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768163102; x=1768767902; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vxyTeImYBmZA39crZjolcxk7Z4LKlXIeMH8wnvv68VE=; b=iLvFMpgZoHz+78xFJ8CF6687CJodLLuTx3mz22Maspw/iYfE8qL116ikV1DhNwkaxT AaCdZRulNa3j4zxgsV9/n01O+8CkTXAGLrj3cWYPsY76G3JMxpSZKxysQssXRFj8ExsS P3yraGZwLr9phJDXSSn8ku81QzT+gywyJKqj+tDl/3+DRiyrvPOfM7Dy45QlRp0HjH3W CiZ4HzRgx6ROFMCW1NNVBgnzUzitnwuud2HH6b0IiwcqdVO5wWMMukjWUdeBfEamUyT1 Ntq9Aa12zi9Wd5TafqdiKpdqjndnnEVbCYkfcDWQp337h70copyAXwMqPk4cMK4zEGgV WIGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768163102; x=1768767902; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=vxyTeImYBmZA39crZjolcxk7Z4LKlXIeMH8wnvv68VE=; b=BFpjJKRo5KX4dWcRnvPagukzlZ6i+HDCNngnvcadvOFkBm/GVabA6M2C6XxGRJv0+x jsMJasDjD2WTdYdR9R0D5qoGP5Wls/segG0c8MohWdxBz/GdUbhARtrbbe1Ll+ynC5QI ZNMne4CrOzPAvuJFwm49VDTSpjrZhwc/GAB3ESviW1O7KBU2OEGzwnpny0Q5jm40Z6NQ wp0xwhZ8cPFo00Mj66w5eHmvDbkFrPOflaq2D+Mxh+4ZWFvBjdKhFpamkFC5y9ZGif51 FNt56OeUkGXsZAsVq5ieCFoCAnOLzhDaAO7Cr6RdcBC/6Q37stablbwBkltJYIkcxY5Y 6aEQ== X-Forwarded-Encrypted: i=1; AJvYcCUB+wRSLrb19RcacXWFz+Z6YUWN/ynnW0UF5Pp9IBIKALMnq866TMVUCWE9TZnCaDsOx8Day7BBpwcn8O0=@vger.kernel.org X-Gm-Message-State: AOJu0YxvmO3Ue7is7Jb1lKhUqLA5CZMGIDhZmeounRROuogzZtwOm37L FyD8le482jsEGsIVJrLUhxOItc8ufS7qJuM7mj17EdxfL+Q5u66YBfl+ X-Gm-Gg: AY/fxX4bLu80qQvoodWLOdznYWUOQ9/gvRgOjfq68Zb6x2TrD3FZ4QtYqsSwCkHLlaT GRDUJ/4AAfDKtChWq/k696+VjGD5DqIRmFkw5yfN5eEYWBKzCESyAVCgvytnUB4+J7PtFPy5Txy RxrP8I1vjEXxDVXiOZ7vn6F7TzT/TAZKImSg4LZlOxJ8g+2BZmPj1aIoCwjJc6WPnT6cZU6u7z3 xESwxglUZZdeRoH2mUVvr7KlX/IV26CLqtdsREONVzqd6Li+wh4HGi/IvWBchTONh00zAdIbQvr CC7KTFDUfH70p/FaABBadlASZIkJzT7bfGGzo53VfAShrgWdoajXKCsTm37G/uDMm540ZMdx5BT p+i3xf7ZqjqZE79uuoPM1dfO7DCVwS2glPPg7YChKh2IajI/HVj2DzXaITUUu/GFWWP0oKhJ3kP w+jCwYKle1PVgo2RXcBaeLjtOc28j6OnVm X-Google-Smtp-Source: AGHT+IF7ZRBV/c8QXWUV0Ji5pAEu8T6ygemgtPIQCSQZucWvZ2FKBbysdddR1sv2edaPcFU3kDctHA== X-Received: by 2002:a05:6808:ecd:b0:450:4628:e3ce with SMTP id 5614622812f47-45a6bd4b226mr8007317b6e.15.1768163102077; Sun, 11 Jan 2026 12:25:02 -0800 (PST) Received: from newman.cs.purdue.edu ([128.10.127.250]) by smtp.gmail.com with ESMTPSA id 5614622812f47-45a8c6b3fdfsm3407834b6e.17.2026.01.11.12.25.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Jan 2026 12:25:01 -0800 (PST) From: Jiasheng Jiang To: fdmanana@kernel.org Cc: clm@fb.com, dsterba@suse.com, jiashengjiangcool@gmail.com, linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] btrfs: reset block group size class when reservations are freed Date: Sun, 11 Jan 2026 20:24:57 +0000 Message-Id: <20260111202457.23698-1-jiashengjiangcool@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Differential analysis of block-group.c shows an inconsistency between btrfs_add_reserved_bytes() and btrfs_free_reserved_bytes(). When space is reserved, btrfs_use_block_group_size_class() is called to set a block group's size class, specializing it for a specific allocation size to reduce fragmentation. However, when these reservations are subsequently freed (e.g., due to an error or transaction abort), btrfs_free_reserved_bytes() fails to perform the corresponding cleanup. This leads to a state leak where a block group remains stuck with a specific size class even if it contains no used or reserved bytes. This stale state causes find_free_extent to unnecessarily skip these block groups for mismatched size requests, leading to suboptimal allocation behavior. Fix this by resetting the size class to BTRFS_BG_SZ_NONE in btrfs_free_reserved_bytes() when the block group becomes completely empty. Fixes: 606d1bf10d7e ("btrfs: migrate the block group space accounting helpe= rs") Signed-off-by: Jiasheng Jiang --- Changelog: v1 -> v2: 1. Inlined btrfs_maybe_reset_size_class() function. 2. Moved check below the reserved bytes decrement in btrfs_free_reserved_by= tes(). --- fs/btrfs/block-group.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 08b14449fabe..8339ad001d3f 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -3867,6 +3867,12 @@ void btrfs_free_reserved_bytes(struct btrfs_block_gr= oup *cache, u64 num_bytes, spin_lock(&cache->lock); bg_ro =3D cache->ro; cache->reserved -=3D num_bytes; + + if (btrfs_block_group_should_use_size_class(cache)) { + if (cache->used =3D=3D 0 && cache->reserved =3D=3D 0) + cache->size_class =3D BTRFS_BG_SZ_NONE; + } + if (is_delalloc) cache->delalloc_bytes -=3D num_bytes; spin_unlock(&cache->lock); --=20 2.25.1