From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4EE36296FC5; Mon, 5 May 2025 22:18:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746483528; cv=none; b=uUQsDT3Me6drqFDm2FOeQFa9k9N8Q/arTBb2N8Q2oApreefOYAp7RFCU3Z019hTjJCyWu54t+K19CRXqxFzOL2P97TKJ3pwL4isZlGzgoDO9j+sUdCaQHPva+2FmUONtiL4dkyMLQXOVD6ZLYh/ZScU96lZ6OYKMvUWI7zylvWc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746483528; c=relaxed/simple; bh=XUplt6Gr0wsYXcq52mOwkQdku2aClzKYDtudntBbfsU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=V7Mdt2q6occsOhrIWVn7+10yM74Ol17ZhXlHBVAyyRbevbQU9xx/Y/LLWqRDic/b0GMz5zijlXMHsRVZ2xQD4sF1JHxNb/IEU5I2v2kSetPIVmDIXgNAqngrSiDxHU9dfG4o9dv9e6RgNls/Fht73evIFTy2zgBUfmmrMQoHlA8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=sI3IyQPM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="sI3IyQPM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 26D17C4CEEE; Mon, 5 May 2025 22:18:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746483528; bh=XUplt6Gr0wsYXcq52mOwkQdku2aClzKYDtudntBbfsU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sI3IyQPMIocVCDjA9FtvSOsaVwR0zrRFkmOgFZjypoNUa6c15tA83M/2KPBt/hhGh wBOEo9bt2yQkFtwP8fQjkgkv+aIM4Hd0pKgZs+eNbmUsE9HXfwwyPbA0T9OXJ+edsZ GNal03WWZrCxNPiZsRrtCagNhZ0PYS4JxU88ZSypTNMXEAmyGNWCIHSMg1jnayZe31 w7xJPV5DIZk5X2xwZs6O1J0TqVFakrs4fLi6gAGVJz2iFyLBaa1l3B0iRBqgGnUCGS EPDjNt25aI7iIaygJjrVCypOH+IPPhtalzLHR7HEnqAkPV7Us47RardzJWu+9G+JAp jZAJSByF3Jw7w== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Filipe Manana , Johannes Thumshirn , David Sterba , Sasha Levin , clm@fb.com, josef@toxicpanda.com, linux-btrfs@vger.kernel.org Subject: [PATCH AUTOSEL 6.14 100/642] btrfs: get zone unusable bytes while holding lock at btrfs_reclaim_bgs_work() Date: Mon, 5 May 2025 18:05:16 -0400 Message-Id: <20250505221419.2672473-100-sashal@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250505221419.2672473-1-sashal@kernel.org> References: <20250505221419.2672473-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-btrfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.14.5 Content-Transfer-Encoding: 8bit From: Filipe Manana [ Upstream commit 1283b8c125a83bf7a7dbe90c33d3472b6d7bf612 ] At btrfs_reclaim_bgs_work(), we are grabbing a block group's zone unusable bytes while not under the protection of the block group's spinlock, so this can trigger race reports from KCSAN (or similar tools) since that field is typically updated while holding the lock, such as at __btrfs_add_free_space_zoned() for example. Fix this by grabbing the zone unusable bytes while we are still in the critical section holding the block group's spinlock, which is right above where we are currently grabbing it. Reviewed-by: Johannes Thumshirn Signed-off-by: Filipe Manana Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/block-group.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index b96b235943344..b14faa1d57b8c 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1888,6 +1888,17 @@ void btrfs_reclaim_bgs_work(struct work_struct *work) up_write(&space_info->groups_sem); goto next; } + + /* + * Cache the zone_unusable value before turning the block group + * to read only. As soon as the block group is read only it's + * zone_unusable value gets moved to the block group's read-only + * bytes and isn't available for calculations anymore. We also + * cache it before unlocking the block group, to prevent races + * (reports from KCSAN and such tools) with tasks updating it. + */ + zone_unusable = bg->zone_unusable; + spin_unlock(&bg->lock); spin_unlock(&space_info->lock); @@ -1904,13 +1915,6 @@ void btrfs_reclaim_bgs_work(struct work_struct *work) goto next; } - /* - * Cache the zone_unusable value before turning the block group - * to read only. As soon as the blog group is read only it's - * zone_unusable value gets moved to the block group's read-only - * bytes and isn't available for calculations anymore. - */ - zone_unusable = bg->zone_unusable; ret = inc_block_group_ro(bg, 0); up_write(&space_info->groups_sem); if (ret < 0) -- 2.39.5