From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 3ACC9363C6F for ; Sun, 13 Sep 2026 21:21:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334491; cv=none; b=CDxvCxBYa+oZ4ojmWELOG7RRmKehlqDVPlcDb0Xl20j1hMuXMSsvuEyJvxylBk9Q/5KjDUc30lkOuSWaJRFCOcKl9I2AqKH/PfBQyY9lQ79591SK/U0CTrREN7Qsli3IMufibX+tJ4p+FpqVTjv8RwRJz1t1UbiXgH19Gtvwl4k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334491; c=relaxed/simple; bh=lp6N7P6uRAwF4k80VrSyckftlj/cB8cKUNVuGaugFXs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q11tz4DDrEAey2sFmi1ddEECxUr6Wub6jTSocIZClyLs25va00zWAL3a049cYbRpvT+9fkuHdtbqZ67QknsJAsl5GVhS4YcUJhDU0+yejxbRc3KhWiSdwJ6eloJ62JsSzZ6kJjj6komLtlCbPr/ceZrAwRaJuDxRi2P+f8sGOXc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=sdeBoYgV; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=quFEc8eo; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="sdeBoYgV"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="quFEc8eo" Received: from pps.filterd (m0167073.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKXnms652327 for ; Sun, 13 Sep 2026 17:21:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=vZNh osrukSiX1wNaSmTI+ZUk61C0R//VPNgshZncD6Q=; b=sdeBoYgVRpwIulIJuJvY P60SK33ZvUxJ9ki2fZ6T8Q2iNHQHbcd6Y1updPL48/VhagTpJHqE0/dsQit08Che YJwMdufjYHpCnlWo8wmzPo1VREl30dfi5If3iHupWAi9HPOLPW4urbNLr4gIU/Ze PctX7Xx3XRpy9GF4yCSdid4RMSPgauHWMfSIqCI4MocSBvOERdq+ZDodqPbOCPnq l9Jde5zPNthuZzBJmx2D0bnDJcd2qZxlcjVin2M1byLmVeW4d4lz2WaUpp/f3N9W 4+FaZTcbTcsEK8i+6Hq2cvW1tBipcMixb8ng/mXUa1mixBuosqwIexuqvComuBsX 9Q== Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gp2mjg7w8-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:28 -0400 (EDT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-91054f537f9so69885656d6.0 for ; Sun, 13 Sep 2026 14:21:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334487; x=1789939287; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=vZNhosrukSiX1wNaSmTI+ZUk61C0R//VPNgshZncD6Q=; b=quFEc8eo+Tk/wE3d6xMf24uHWn1H6pdgZ1xyMt/lOqxuUXso/Rbd4w7tFaFn3Avegl gwqhR9RjVgFT3e3fbLwHPabk2/1Huyyq2YnnpgPIydKBMFMdS28cIG9c/hohOnsY5Riu CI58T6iGafjYjbZFTLOfQ/XTNj+YZ8udqd1mdP9WUSh4+VaHvXOzZo+Set2bpiIo6osK TJD9EoEWHYQDZrkY/ioUvW9WTUipInVFNgzm9c0/gq2ipOAx92mS5H7WTIEc51RXI46S jSfesU7R/WNvL4BHdjyJRJwoT0+dSzP4D7K/mAWKw8OmBmEELGe0IXTA/5EqXhjuxcrQ qM/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334487; x=1789939287; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=vZNhosrukSiX1wNaSmTI+ZUk61C0R//VPNgshZncD6Q=; b=O7KZh639KUd4DLq+nw6FOuzWuExpwpK934XHz2VTDWbpyBTjNXA+lRWWa0uujqaISr rmcxjNp1G2qMZ5bs3MFtft0fjWp3ZL3Marq3qzJ6p286sdKKGmDJMOhkXp3k/ati687I cErIdyjlEa+UA1kJT1bvgkNSbnCC2W+OFUnGcpnVkYu+6zyuQb6wNgGngvdbuBmmDLnp q/zdkN3B31KgF6YrKMMrZz+YYEIzMR/I1kNEmV+WifHX6zep2+hCMpyKPuvyocqIQdcj IJN7IFmr77npHSmmewraE+c7vaM33e1nIx6kB8oxZ0suTuMEzx5Ci8KmrETeEweYFLMR gJxg== X-Forwarded-Encrypted: i=1; AKwUvByBOj9RlAAjLufecD/CKtVsuGkHEA1gCgpC9WVQn0gN8JMIxKK/V8T9lN0uaGsTRxcYQBdYEXenjC8VvYM=@vger.kernel.org X-Gm-Message-State: AFuF++kN8vCXesZ7r/nO5Bozp1x0LgFd9tG2oHgvT63lkzU9+HCWMNtv jvP2ise6XqlniY2tloC2xMBaEksDiKHlyoRD/1N40Eb9dbSDu46x7XPTcEOFutsv4SmLAKmYia5 MBIl+1n/8UpJVadJqaMxS8dgL3gkJ2f6b9QnKIn98+K5XlH+iaIqIkoPeQLrcRQ== X-Gm-Gg: AYBFou3K9YEUeIHXC5EGzIuTbXZ/bSjnNiDmDhafwhUA5tp0eFDQVUFNf/lCjYszTw0 TRQhXWjdBcVGmjza7WSFgtCl7N/P1uKjVGO0yEq4O39xEz9/PUt7+70RTCKl6FPpk+Vb+5uo07t lkpJ8nYPkxtq2s+gSoUHduk6Eda4ubk3LborRSWNTaFAyPuPQG/sfAFy8wbCkyGIjbyOd5xZtFN 1ytpwdi7TIC15dYMI2YVeQjFDsAYvd+wyKGoAhjsBZ77uKx443zcvhj5vBJVq9y5b+l7no5UALX lnGDqbp1XRbYoTAR0UtgtTuRnbGP/QU6foBokWOcxO4tk2h2s50+7lSs5UbrToxjfMHPCVLnFWp ednb2nWOCgwZ88yuAddCvDaa3QKP9bHWUVDUYfR8Bxnqzu4Ygd+1BHg== X-Received: by 2002:ad4:5ae5:0:b0:910:3923:cc70 with SMTP id 6a1803df08f44-91226bd790cmr45849336d6.25.1789334487493; Sun, 13 Sep 2026 14:21:27 -0700 (PDT) X-Received: by 2002:ad4:5ae5:0:b0:910:3923:cc70 with SMTP id 6a1803df08f44-91226bd790cmr45849136d6.25.1789334487059; Sun, 13 Sep 2026 14:21:27 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:26 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:13 -0400 Subject: [PATCH v2 01/16] btrfs: stop enabling the v1 space cache from the on-disk state Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-1-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=3265; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=lp6N7P6uRAwF4k80VrSyckftlj/cB8cKUNVuGaugFXs=; b=+qUHL+CECiE9jWYFubqeORtH3yG0dxrY3rleAUZHzWKlOw1jEVvudSG5u74yH/lkqG4KwBhuo FYREOF2bf4iBYBis7fBzOq3PsQygc5798bglIOmdYN7ENu3uOLGJYUj X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=NfpzRGD4 c=1 sm=1 tr=0 ts=6aa713d8 cx=c_pps a=oc9J++0uMp73DTRD5QyR2A==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=jHxIr1HyPKZ_Q5_91PL3:22 a=6xji9QrKO1GPOBtlZsEA:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX7floLuBd8UIb Z65fDQ6oj9RpfdrN+uKZDZYYyUjDddnWFaXMpmTAxr3zlIM++3pbIbqS+iHK/ZpJNQF3iSirEsI RGuEPomv/VWKCsCdZHBOwuYinMoYDgP1BXAGj7SK7/AdpsHEg25RxQKVGAVpKVwRyyBVunuEc2O V3MwA382blUJA30ye8K0U6jskU7BZ3Zu+Lopo6i6qSxrk7VD8d28vhYc5+mdNFLjBVb9ajreAmP DIT89hvrvnddD3IT+En7p5kdb0rKFWTgZ4zRVAGEYqDBXKirWI/FGxj6iRSn33Q1Ch38g+7ghoZ ULHZ/d0iAXTQnyF4laf5/STtf3GRb5PehyEE3IFNGET/dQTlPU7CRYmd1Xg+88vu8+sp5xNKqC6 KygrJaitZBWUBb2y0u/nMNZFKjD0dbnPgO4qdMwLMD7E5a7JEBlDWZmvlx7fsXD/okA+htJESvN nkqPtNrwW3e/OGQ3oDQ== X-Proofpoint-GUID: d6x-ng_sZ7xpKLmlNvuYOiRmW4uqfOJT X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX7agBQM5dQROX wGaahJXHvTa70tm9QM3R1Cy8El0KprQ8J1fy/LxM/Vum0AXs2WTXSRckrd5wyHQNB+xlNb8ZB9V gO+Ur32TSCbLofAsaIIXruU/9QUeqToabrpjMNI3N9/7XhVdDMxX X-Proofpoint-ORIG-GUID: d6x-ng_sZ7xpKLmlNvuYOiRmW4uqfOJT X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=10 suspectscore=0 malwarescore=0 spamscore=0 bulkscore=10 clxscore=1015 adultscore=0 lowpriorityscore=10 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 Since commit 545e560a5b0f ("btrfs: disable v1 space cache") the mount options can no longer request the v1 space cache, but a filesystem with an active v1 cache and no free space tree still enables it from cache_generation, and remount does the same. Drop both, so SPACE_CACHE can never be set. btrfs_start_pre_rw_mount() then sees the on-disk cache as active but unwanted and cleans it up, as -o nospace_cache does today. That covers the read-only to read-write remount as well, so drop the toggle in btrfs_remount_cleanup(), which would otherwise start a transaction on remounts of a read-only filesystem with an old cache. The cleanup is now unconditional, and the first read-write mount fails if it fails, as it did with -o nospace_cache. This also lets an old filesystem mount without options when the page size is larger than the sector size, which btrfs_check_features() rejected once SPACE_CACHE was set from the superblock. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman Reviewed-by: Qu Wenruo --- fs/btrfs/super.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 464129b1b0d4..77443ded6db3 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -759,12 +759,12 @@ void btrfs_set_free_space_cache_settings(struct btrfs= _fs_info *fs_info) =20 /* * At this point we don't have explicit options set by the user, set - * them ourselves based on the state of the file system. + * them ourselves based on the state of the file system. An existing + * v1 space cache is no longer used and gets cleaned up once the + * filesystem is mounted read-write. */ if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) btrfs_set_opt(fs_info->mount_opt, FREE_SPACE_TREE); - else if (btrfs_free_space_cache_v1_active(fs_info)) - btrfs_set_opt(fs_info->mount_opt, SPACE_CACHE); } =20 static void set_device_specific_options(struct btrfs_fs_info *fs_info) @@ -1264,8 +1264,6 @@ static inline void btrfs_remount_begin(struct btrfs_f= s_info *fs_info, static inline void btrfs_remount_cleanup(struct btrfs_fs_info *fs_info, unsigned long long old_opts) { - const bool cache_opt =3D btrfs_test_opt(fs_info, SPACE_CACHE); - /* * We need to cleanup all defraggable inodes if the autodefragment is * close or the filesystem is read only. @@ -1282,10 +1280,6 @@ static inline void btrfs_remount_cleanup(struct btrf= s_fs_info *fs_info, else if (btrfs_raw_test_opt(old_opts, DISCARD_ASYNC) && !btrfs_test_opt(fs_info, DISCARD_ASYNC)) btrfs_discard_cleanup(fs_info); - - /* If we toggled space cache */ - if (cache_opt !=3D btrfs_free_space_cache_v1_active(fs_info)) - btrfs_set_free_space_cache_v1_active(fs_info, cache_opt); } =20 static int btrfs_remount_rw(struct btrfs_fs_info *fs_info) @@ -1535,10 +1529,6 @@ static int btrfs_reconfigure(struct fs_context *fc) btrfs_set_opt(fs_info->mount_opt, FREE_SPACE_TREE); btrfs_clear_opt(fs_info->mount_opt, SPACE_CACHE); } - if (btrfs_free_space_cache_v1_active(fs_info)) { - btrfs_clear_opt(fs_info->mount_opt, FREE_SPACE_TREE); - btrfs_set_opt(fs_info->mount_opt, SPACE_CACHE); - } } =20 ret =3D 0; --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 52A14389460 for ; Sun, 13 Sep 2026 21:21:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334494; cv=none; b=BNra6S12HuNiVAExItQU6Uv7JgzcoQI1HXh9AaXKLXAYF0ZqIoQ7UUomNOANAeo5/aUPorb2BMTpLuaY8Poqq8nBxFcoaPvhRU0voxyyxtCI12uTg/fWl+zi6cd+kqgYT9XH8EQGugCEpfQ4I//VQ4zPAINFHNPrB8Z4O4xYFsU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334494; c=relaxed/simple; bh=iYy4WxMcz/YHrl99boX04beNvLAWKmxd+zXgrgEEPaA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tNBJLFLDia8IQE4vyYtCJz+TQKP6uazJFQUbsxj5WrtkIAoaSdZ22ldgBtg4Df0OQvgdWgQOivzV4XQki/qaakaspNONXzKvhOs4gUNYtYEm5H9Nl7pJxxoEwckU30/Qkr/E5mI/IePQ2Xwwx9tjIGvjDsmcK7IWKOV9sBJL3ic= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=kJOjF94G; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=381MI48+; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="kJOjF94G"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="381MI48+" Received: from pps.filterd (m0167074.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKXnmK634633 for ; Sun, 13 Sep 2026 17:21:30 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=xEFZ MPyLnIooECi5s+6fgH1R/MlB033qsGA9CrfjzEw=; b=kJOjF94GgT3RXu0fR/HW snc6WDzwpBuixL2diWmPaM+HawGv00ptl+5OFBjLSygZUnJDy9sojBrqXDpxld09 rFoUPQtHjQZjWdedYy7G78mg15Kv1ntTHXreKuek4De3wX9C1ShqusLN7LOetf+3 W96Dkpjz0BlQPl3BtC2iMtlO4TU8YbGrMNQ4roIE1/f6AFeUiUKVLCzhcf778tiq m1uscWVHW8kBc4n8DylGEJ4GfIwn34OzScoKz+4wPvf8WtaltNamQbltwvtdJo0E H1BQE9z6YTkGCHe3Q2Rc5K9M0jqWadV28Orktezmpa62XSzJeZ7uCLnBWVxGvAPs FQ== Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gnwac9nvx-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:29 -0400 (EDT) Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-939062ecda9so413085285a.1 for ; Sun, 13 Sep 2026 14:21:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334489; x=1789939289; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=xEFZMPyLnIooECi5s+6fgH1R/MlB033qsGA9CrfjzEw=; b=381MI48+UrRvmKP8CuY0aC5MtIhNgDutLdhXuqDurmUG+0pmHqcIRp3RpeCPpY38Qe 2nDp5piT/rST3EtOrrO4vyf2C8OXYO3m5M2+j0DnqbKx5JiwClw3jprcB5u6ccrLac2H eNvIqs/pplvaz5jqM+rJzsrMCG16OFrDhgy7ZI2czQwIiOpYnBIgKRAoQWKelE2vjBX1 1w8IA7uu4PMrFp39xBu2P3Ewh4QfBkDQaux6M/YyB5lk+wi1vyBjkdlY7s/3Ri+gOVF6 dQPTbQTJF2mej/DoFO+9E1XnuH31c/K6N1xUEbfoh2oZ0QPa6TolFoo5pnFdRIgCJfkF d3Yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334489; x=1789939289; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=xEFZMPyLnIooECi5s+6fgH1R/MlB033qsGA9CrfjzEw=; b=sGuWP8HJY6+ZzlDG7CY399CJjk52BSSEcYnQMS/Ktqe+0BK7RPUiXyO/MuXc34TybI 29FEth/vsP/8i6huFHLEuXzxZYhn9WKY6nh6gXN0XcykfsCbfSgDS9QVaBfhaVRmAg8T XuEF3NW9wxCku75sweEAkv+zyYQ8Bom9e37eHrtqLQA11g1slo8MjxqNlLRalmKDKq7b Q3N7e4VJUFd+CF24ZLFl2qSJUgBADVxfsohvrAH3sAw3660C5Hllf5Fkhhz7bMs5C4vR 0o2uWrLN1PlxgRa9pFwOsklAkrDydgQfYMVxXhSBW9EX/iLQhVKyLbJSj9dW9E2biyAP 1hlw== X-Forwarded-Encrypted: i=1; AKwUvBygnPD9AVaUk9Vi0autc65y0Wxtx2eKgh9fuaBgLbZHhFzj9tlElRHBwlH+ZIEAxX7YbUy2gy8E+hCNO4U=@vger.kernel.org X-Gm-Message-State: AFuF++kM/i1TsX8kG2kTTI6typAFuQJzgd7vBF2xGQCKx7rRVhSiUe6R 38XohYlG4nLHp7upjmGRNg8RBPMiPgbmHDx5eSGiqyzu3ztBDFeJi5ToLhmW8whFXsAOXA/92wP vsfcXwGvFvwH13EtEeMi+J8nRKtAYlFl1Jc47ntc5S9OH0lHIIDZLEwBlQayf7w== X-Gm-Gg: AYBFou18UVjqQS7+IW41sxp36ctk99hgKeWXH0uKJDyWvC6IzqJuP3ewEgIZZRyd4Ie EJnkK7X/61GNxH/xycpKgFYXIszxAMga+mLYY1PAFRO787j8QFwxleejraBnmNnX2foZYOo2Qz3 RoWHqrqBAo3jSWuB7qhTl9AsK0JzjblqAhjiuY3GnSOCmhYk7D6S1KfLSiJWtLGZpccgaV8Zwpb 9WGYKlnQyEzJugrg1V4yfznchi5UYjWVVebtBfBz+0r0rpVVg9M2tC6Qg4lAiRYkB5gwjdqfiLO mb4nOugI4DoMlWAfLzofHavRvolPyyvDfkSoQMBSXvZrFdR7GBaj5wgKLQus38aisbvKsaIPCIr 2+EcvL2TjjfSAIi7+y0EHO+Oizc9e6xNKsWE0Xmvd0Jp2gcHfRFfUwg== X-Received: by 2002:a05:620a:4150:b0:936:af9f:4c30 with SMTP id af79cd13be357-939ea16abecmr1725636985a.25.1789334489043; Sun, 13 Sep 2026 14:21:29 -0700 (PDT) X-Received: by 2002:a05:620a:4150:b0:936:af9f:4c30 with SMTP id af79cd13be357-939ea16abecmr1725633085a.25.1789334488173; Sun, 13 Sep 2026 14:21:28 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:27 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:14 -0400 Subject: [PATCH v2 02/16] btrfs: remove the v1 space cache writeout from the transaction commit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-2-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=23733; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=iYy4WxMcz/YHrl99boX04beNvLAWKmxd+zXgrgEEPaA=; b=vvMTzc+mB0nVXxXRR3u0kpMMrOqco1asCMkV1KRj8SoBzl431S6hCko9eqIIE68sDS+Ocpeka bHxU7OwFuGrBQQQMMJM5rNlIntiwUcP7FiSOPB+ZZAfQXC06EkAdzik X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=BqQIUoX5 c=1 sm=1 tr=0 ts=6aa713da cx=c_pps a=qKBjSQ1v91RyAK45QCPf5w==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=azVShVRs0zEubeQ0wG0L:22 a=_t22J9a6CU8Tmy3Ye64A:9 a=QEXdDO2ut3YA:10 a=NFOGd7dJGGMPyQGDc5-O:22 X-Proofpoint-ORIG-GUID: _k587JKmpz09XnYPS_gPiEhqZ3NnQ1_N X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX3Q/WK/mn5aYn AqQWAjFWgrFnShxrUtr/5qkF3Ru7Lua7v83SXlWAUC4hEp04nPI0kax4EppJdP6J0RCeK3s1xY9 tM14pqrcOXD8DoE6HLpQSlX5u7LfE5ZBFYNrlHgcY5YSlf10jVvy X-Proofpoint-GUID: _k587JKmpz09XnYPS_gPiEhqZ3NnQ1_N X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfXzpnff9s5CIfd mW6obAdQs4uQie0Fg3KwebSAK0SdR4Q38XkAi1fnJSYYhr+cmLX1kRh8zq/YzPdgC+wSUaiv6uk +IkR/7GAc/ResOdP8YBYkkuhS6ooBfzNwe7i9u9yB00ymgRvlbk+2vyJz3sbrWgqK5cql5hcN5H 5eO/NIJ8sjKrbJeMgVXz1+z1gZAtq589AEVe6ljhOllHFXQSffhJk421SaPW2Lu8bk21XwENjBs 71aQ9OMZrt9SeQP44rwMtGv9xW9UB7hBlkTppJRF3J6hgBXDMji1cfcYD6NFtztYX9Qw0LaCaHT PGFxKFfqEa8ihAtgIMZSm0myE7etT2ZyupuX8KV98K5qY6wBQC5b88JMoZvWUefIUPE52J5n0j/ +neBwM3id7MW4c8DzNd70T/YgQAPTQSRE+fOmiDDrnblzJh9LVZ2AL6Jch8eaMYcZw1U5SQW6nB p7HJLhLsLTzMHaD5QXw== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 bulkscore=10 impostorscore=10 clxscore=1015 priorityscore=1501 adultscore=0 suspectscore=0 phishscore=0 spamscore=0 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 Nothing sets SPACE_CACHE anymore, so the dirty block group writers never have a cache to write out or wait for. Remove cache_save_setup(), btrfs_setup_space_cache(), the io_list handling, the io_bgs list and BTRFS_TRANS_CACHE_ENOSPC, and the abort-time cleanup of in-flight cache IO. The -ENOENT retry in btrfs_write_dirty_block_groups() handled a free space endio worker creating a block group during the commit critical section, so drop it too. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/block-group.c | 407 +++------------------------------------------= ---- fs/btrfs/block-group.h | 1 - fs/btrfs/disk-io.c | 44 ------ fs/btrfs/transaction.c | 9 +- fs/btrfs/transaction.h | 18 --- 5 files changed, 25 insertions(+), 454 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index ee182369254c..a04dd8244c81 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1194,36 +1194,15 @@ int btrfs_remove_block_group(struct btrfs_trans_han= dle *trans, goto out; } =20 - /* - * get the inode first so any iput calls done for the io_list - * aren't the final iput (no unlinks allowed now) - */ inode =3D lookup_free_space_inode(block_group, path); =20 - mutex_lock(&trans->transaction->cache_write_mutex); - /* - * Make sure our free space cache IO is done before removing the - * free space inode - */ spin_lock(&trans->transaction->dirty_bgs_lock); - if (!list_empty(&block_group->io_list)) { - list_del_init(&block_group->io_list); - - WARN_ON(!IS_ERR(inode) && inode !=3D block_group->io_ctl.inode); - - spin_unlock(&trans->transaction->dirty_bgs_lock); - btrfs_wait_cache_io(trans, block_group, path); - btrfs_put_block_group(block_group); - spin_lock(&trans->transaction->dirty_bgs_lock); - } - if (!list_empty(&block_group->dirty_list)) { list_del_init(&block_group->dirty_list); remove_rsv =3D true; btrfs_put_block_group(block_group); } spin_unlock(&trans->transaction->dirty_bgs_lock); - mutex_unlock(&trans->transaction->cache_write_mutex); =20 ret =3D btrfs_remove_free_space_inode(trans, inode, block_group); if (unlikely(ret)) { @@ -3373,197 +3352,6 @@ static int update_block_group_item(struct btrfs_tra= ns_handle *trans, =20 } =20 -static void cache_save_setup(struct btrfs_block_group *block_group, - struct btrfs_trans_handle *trans, - struct btrfs_path *path) -{ - struct btrfs_fs_info *fs_info =3D block_group->fs_info; - struct inode *inode =3D NULL; - struct extent_changeset *data_reserved =3D NULL; - u64 alloc_hint =3D 0; - int dcs =3D BTRFS_DC_ERROR; - u64 cache_size =3D 0; - int retries =3D 0; - int ret =3D 0; - - if (!btrfs_test_opt(fs_info, SPACE_CACHE)) - return; - - /* - * If this block group is smaller than 100 megs don't bother caching the - * block group. - */ - if (block_group->length < (100 * SZ_1M)) { - spin_lock(&block_group->lock); - block_group->disk_cache_state =3D BTRFS_DC_WRITTEN; - spin_unlock(&block_group->lock); - return; - } - - if (TRANS_ABORTED(trans)) - return; -again: - inode =3D lookup_free_space_inode(block_group, path); - if (IS_ERR(inode) && PTR_ERR(inode) !=3D -ENOENT) { - ret =3D PTR_ERR(inode); - btrfs_release_path(path); - goto out; - } - - if (IS_ERR(inode)) { - if (retries) { - ret =3D PTR_ERR(inode); - btrfs_err(fs_info, - "failed to lookup free space inode after creation for block group %l= lu: %d", - block_group->start, ret); - goto out_free; - } - retries++; - - if (block_group->ro) - goto out_free; - - ret =3D create_free_space_inode(trans, block_group, path); - if (ret) - goto out_free; - goto again; - } - - /* - * We want to set the generation to 0, that way if anything goes wrong - * from here on out we know not to trust this cache when we load up next - * time. - */ - BTRFS_I(inode)->generation =3D 0; - ret =3D btrfs_update_inode(trans, BTRFS_I(inode)); - if (unlikely(ret)) { - /* - * So theoretically we could recover from this, simply set the - * super cache generation to 0 so we know to invalidate the - * cache, but then we'd have to keep track of the block groups - * that fail this way so we know we _have_ to reset this cache - * before the next commit or risk reading stale cache. So to - * limit our exposure to horrible edge cases lets just abort the - * transaction, this only happens in really bad situations - * anyway. - */ - btrfs_abort_transaction(trans, ret); - goto out_put; - } - - /* We've already setup this transaction, go ahead and exit */ - if (block_group->cache_generation =3D=3D trans->transid && - i_size_read(inode)) { - dcs =3D BTRFS_DC_SETUP; - goto out_put; - } - - if (i_size_read(inode) > 0) { - ret =3D btrfs_check_trunc_cache_free_space(fs_info, - &fs_info->global_block_rsv); - if (ret) - goto out_put; - - ret =3D btrfs_truncate_free_space_cache(trans, NULL, inode); - if (ret) - goto out_put; - } - - spin_lock(&block_group->lock); - if (block_group->cached !=3D BTRFS_CACHE_FINISHED || - !btrfs_test_opt(fs_info, SPACE_CACHE)) { - /* - * don't bother trying to write stuff out _if_ - * a) we're not cached, - * b) we're with nospace_cache mount option, - * c) we're with v2 space_cache (FREE_SPACE_TREE). - */ - dcs =3D BTRFS_DC_WRITTEN; - spin_unlock(&block_group->lock); - goto out_put; - } - spin_unlock(&block_group->lock); - - /* - * We hit an ENOSPC when setting up the cache in this transaction, just - * skip doing the setup, we've already cleared the cache so we're safe. - */ - if (test_bit(BTRFS_TRANS_CACHE_ENOSPC, &trans->transaction->flags)) - goto out_put; - - /* - * Try to preallocate enough space based on how big the block group is. - * Keep in mind this has to include any pinned space which could end up - * taking up quite a bit since it's not folded into the other space - * cache. - */ - cache_size =3D div_u64(block_group->length, SZ_256M); - if (!cache_size) - cache_size =3D 1; - - cache_size *=3D 16; - cache_size *=3D fs_info->sectorsize; - - ret =3D btrfs_check_data_free_space(BTRFS_I(inode), &data_reserved, 0, - cache_size, false); - if (ret) - goto out_put; - - ret =3D btrfs_prealloc_file_range_trans(inode, trans, 0, 0, cache_size, - cache_size, cache_size, - &alloc_hint); - /* - * Our cache requires contiguous chunks so that we don't modify a bunch - * of metadata or split extents when writing the cache out, which means - * we can enospc if we are heavily fragmented in addition to just normal - * out of space conditions. So if we hit this just skip setting up any - * other block groups for this transaction, maybe we'll unpin enough - * space the next time around. - */ - if (!ret) - dcs =3D BTRFS_DC_SETUP; - else if (ret =3D=3D -ENOSPC) - set_bit(BTRFS_TRANS_CACHE_ENOSPC, &trans->transaction->flags); - -out_put: - iput(inode); -out_free: - btrfs_release_path(path); -out: - spin_lock(&block_group->lock); - if (!ret && dcs =3D=3D BTRFS_DC_SETUP) - block_group->cache_generation =3D trans->transid; - block_group->disk_cache_state =3D dcs; - spin_unlock(&block_group->lock); - - extent_changeset_free(data_reserved); -} - -int btrfs_setup_space_cache(struct btrfs_trans_handle *trans) -{ - struct btrfs_fs_info *fs_info =3D trans->fs_info; - struct btrfs_block_group *cache, *tmp; - struct btrfs_transaction *cur_trans =3D trans->transaction; - BTRFS_PATH_AUTO_FREE(path); - - if (list_empty(&cur_trans->dirty_bgs) || - !btrfs_test_opt(fs_info, SPACE_CACHE)) - return 0; - - path =3D btrfs_alloc_path(); - if (!path) - return -ENOMEM; - - /* Could add new block groups, use _safe just in case */ - list_for_each_entry_safe(cache, tmp, &cur_trans->dirty_bgs, - dirty_list) { - if (cache->disk_cache_state =3D=3D BTRFS_DC_CLEAR) - cache_save_setup(cache, trans, path); - } - - return 0; -} - /* * Transaction commit does final block group cache writeback during a crit= ical * section where nothing is allowed to change the FS. This is required in @@ -3582,10 +3370,8 @@ int btrfs_start_dirty_block_groups(struct btrfs_tran= s_handle *trans) struct btrfs_block_group *cache; struct btrfs_transaction *cur_trans =3D trans->transaction; int ret =3D 0; - int should_put; BTRFS_PATH_AUTO_FREE(path); LIST_HEAD(dirty); - struct list_head *io =3D &cur_trans->io_bgs; int loops =3D 0; =20 spin_lock(&cur_trans->dirty_bgs_lock); @@ -3608,34 +3394,13 @@ int btrfs_start_dirty_block_groups(struct btrfs_tra= ns_handle *trans) } } =20 - /* - * cache_write_mutex is here only to save us from balance or automatic - * removal of empty block groups deleting this block group while we are - * writing out the cache - */ - mutex_lock(&trans->transaction->cache_write_mutex); while (!list_empty(&dirty)) { bool drop_reserve =3D true; =20 cache =3D list_first_entry(&dirty, struct btrfs_block_group, dirty_list); - /* - * This can happen if something re-dirties a block group that - * is already under IO. Just wait for it to finish and then do - * it all again - */ - if (!list_empty(&cache->io_list)) { - list_del_init(&cache->io_list); - btrfs_wait_cache_io(trans, cache, path); - btrfs_put_block_group(cache); - } - =20 /* - * btrfs_wait_cache_io uses the cache->dirty_list to decide if - * it should update the cache_state. Don't delete until after - * we wait. - * * Since we're not running in the commit critical section * we need the dirty_bgs_lock to protect from update_block_group */ @@ -3643,72 +3408,35 @@ int btrfs_start_dirty_block_groups(struct btrfs_tra= ns_handle *trans) list_del_init(&cache->dirty_list); spin_unlock(&cur_trans->dirty_bgs_lock); =20 - should_put =3D 1; - - cache_save_setup(cache, trans, path); - - if (cache->disk_cache_state =3D=3D BTRFS_DC_SETUP) { - cache->io_ctl.inode =3D NULL; - ret =3D btrfs_write_out_cache(trans, cache, path); - if (ret =3D=3D 0 && cache->io_ctl.inode) { - should_put =3D 0; - - /* - * The cache_write_mutex is protecting the - * io_list, also refer to the definition of - * btrfs_transaction::io_bgs for more details - */ - list_add_tail(&cache->io_list, io); - } else { - /* - * If we failed to write the cache, the - * generation will be bad and life goes on - */ - ret =3D 0; - } - } - if (!ret) { - ret =3D update_block_group_item(trans, path, cache); - /* - * Our block group might still be attached to the list - * of new block groups in the transaction handle of some - * other task (struct btrfs_trans_handle->new_bgs). This - * means its block group item isn't yet in the extent - * tree. If this happens ignore the error, as we will - * try again later in the critical section of the - * transaction commit. - */ - if (ret =3D=3D -ENOENT) { - ret =3D 0; - spin_lock(&cur_trans->dirty_bgs_lock); - if (list_empty(&cache->dirty_list)) { - list_add_tail(&cache->dirty_list, - &cur_trans->dirty_bgs); - btrfs_get_block_group(cache); - drop_reserve =3D false; - } - spin_unlock(&cur_trans->dirty_bgs_lock); - } else if (ret) { - btrfs_abort_transaction(trans, ret); + ret =3D update_block_group_item(trans, path, cache); + /* + * Our block group might still be attached to the list of new + * block groups in the transaction handle of some other task + * (struct btrfs_trans_handle->new_bgs). This means its block + * group item isn't yet in the extent tree. If this happens + * ignore the error, as we will try again later in the critical + * section of the transaction commit. + */ + if (ret =3D=3D -ENOENT) { + ret =3D 0; + spin_lock(&cur_trans->dirty_bgs_lock); + if (list_empty(&cache->dirty_list)) { + list_add_tail(&cache->dirty_list, + &cur_trans->dirty_bgs); + btrfs_get_block_group(cache); + drop_reserve =3D false; } + spin_unlock(&cur_trans->dirty_bgs_lock); + } else if (ret) { + btrfs_abort_transaction(trans, ret); } =20 - /* If it's not on the io list, we need to put the block group */ - if (should_put) - btrfs_put_block_group(cache); + btrfs_put_block_group(cache); if (drop_reserve) btrfs_dec_delayed_refs_rsv_bg_updates(fs_info); - /* - * Avoid blocking other tasks for too long. It might even save - * us from writing caches for block groups that are going to be - * removed. - */ - mutex_unlock(&trans->transaction->cache_write_mutex); if (ret) goto out; - mutex_lock(&trans->transaction->cache_write_mutex); } - mutex_unlock(&trans->transaction->cache_write_mutex); =20 /* * Go through delayed refs for all the stuff we've just kicked off @@ -3722,7 +3450,7 @@ int btrfs_start_dirty_block_groups(struct btrfs_trans= _handle *trans) list_splice_init(&cur_trans->dirty_bgs, &dirty); /* * dirty_bgs_lock protects us from concurrent block group - * deletes too (not just cache_write_mutex). + * deletes. */ if (!list_empty(&dirty)) { spin_unlock(&cur_trans->dirty_bgs_lock); @@ -3747,121 +3475,34 @@ int btrfs_write_dirty_block_groups(struct btrfs_tr= ans_handle *trans) struct btrfs_block_group *cache; struct btrfs_transaction *cur_trans =3D trans->transaction; int ret =3D 0; - int should_put; BTRFS_PATH_AUTO_FREE(path); - struct list_head *io =3D &cur_trans->io_bgs; =20 path =3D btrfs_alloc_path(); if (!path) return -ENOMEM; =20 - /* - * Even though we are in the critical section of the transaction commit, - * we can still have concurrent tasks adding elements to this - * transaction's list of dirty block groups. These tasks correspond to - * endio free space workers started when writeback finishes for a - * space cache, which run inode.c:btrfs_finish_ordered_io(), and can - * allocate new block groups as a result of COWing nodes of the root - * tree when updating the free space inode. The writeback for the space - * caches is triggered by an earlier call to - * btrfs_start_dirty_block_groups() and iterations of the following - * loop. - * Also we want to do the cache_save_setup first and then run the - * delayed refs to make sure we have the best chance at doing this all - * in one shot. - */ spin_lock(&cur_trans->dirty_bgs_lock); while (!list_empty(&cur_trans->dirty_bgs)) { cache =3D list_first_entry(&cur_trans->dirty_bgs, struct btrfs_block_group, dirty_list); - - /* - * This can happen if cache_save_setup re-dirties a block group - * that is already under IO. Just wait for it to finish and - * then do it all again - */ - if (!list_empty(&cache->io_list)) { - spin_unlock(&cur_trans->dirty_bgs_lock); - list_del_init(&cache->io_list); - btrfs_wait_cache_io(trans, cache, path); - btrfs_put_block_group(cache); - spin_lock(&cur_trans->dirty_bgs_lock); - } - - /* - * Don't remove from the dirty list until after we've waited on - * any pending IO - */ list_del_init(&cache->dirty_list); spin_unlock(&cur_trans->dirty_bgs_lock); - should_put =3D 1; - - cache_save_setup(cache, trans, path); =20 if (!ret) ret =3D btrfs_run_delayed_refs(trans, U64_MAX); - - if (!ret && cache->disk_cache_state =3D=3D BTRFS_DC_SETUP) { - cache->io_ctl.inode =3D NULL; - ret =3D btrfs_write_out_cache(trans, cache, path); - if (ret =3D=3D 0 && cache->io_ctl.inode) { - should_put =3D 0; - list_add_tail(&cache->io_list, io); - } else { - /* - * If we failed to write the cache, the - * generation will be bad and life goes on - */ - ret =3D 0; - } - } if (!ret) { ret =3D update_block_group_item(trans, path, cache); - /* - * One of the free space endio workers might have - * created a new block group while updating a free space - * cache's inode (at inode.c:btrfs_finish_ordered_io()) - * and hasn't released its transaction handle yet, in - * which case the new block group is still attached to - * its transaction handle and its creation has not - * finished yet (no block group item in the extent tree - * yet, etc). If this is the case, wait for all free - * space endio workers to finish and retry. This is a - * very rare case so no need for a more efficient and - * complex approach. - */ - if (ret =3D=3D -ENOENT) { - wait_event(cur_trans->writer_wait, - atomic_read(&cur_trans->num_writers) =3D=3D 1); - ret =3D update_block_group_item(trans, path, cache); - if (ret) - btrfs_abort_transaction(trans, ret); - } else if (ret) { + if (ret) btrfs_abort_transaction(trans, ret); - } } =20 - /* If its not on the io list, we need to put the block group */ - if (should_put) - btrfs_put_block_group(cache); + btrfs_put_block_group(cache); btrfs_dec_delayed_refs_rsv_bg_updates(fs_info); spin_lock(&cur_trans->dirty_bgs_lock); } spin_unlock(&cur_trans->dirty_bgs_lock); =20 - /* - * Refer to the definition of io_bgs member for details why it's safe - * to use it without any locking - */ - while (!list_empty(io)) { - cache =3D list_first_entry(io, struct btrfs_block_group, - io_list); - list_del_init(&cache->io_list); - btrfs_wait_cache_io(trans, cache, path); - btrfs_put_block_group(cache); - } - return ret; } =20 diff --git a/fs/btrfs/block-group.h b/fs/btrfs/block-group.h index 69d56864d4ba..97c8565ae4fc 100644 --- a/fs/btrfs/block-group.h +++ b/fs/btrfs/block-group.h @@ -368,7 +368,6 @@ int btrfs_inc_block_group_ro(struct btrfs_block_group *= cache, void btrfs_dec_block_group_ro(struct btrfs_block_group *cache); int btrfs_start_dirty_block_groups(struct btrfs_trans_handle *trans); int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans); -int btrfs_setup_space_cache(struct btrfs_trans_handle *trans); int btrfs_update_block_group(struct btrfs_trans_handle *trans, u64 bytenr, u64 num_bytes, bool alloc); int btrfs_add_reserved_bytes(struct btrfs_block_group *cache, diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 819727460bcf..f544c457d4ab 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4860,26 +4860,6 @@ static void btrfs_destroy_pinned_extent(struct btrfs= _fs_info *fs_info, } } =20 -static void btrfs_cleanup_bg_io(struct btrfs_block_group *cache) -{ - struct inode *inode; - - inode =3D cache->io_ctl.inode; - if (inode) { - unsigned int nofs_flag; - - nofs_flag =3D memalloc_nofs_save(); - invalidate_inode_pages2(inode->i_mapping); - memalloc_nofs_restore(nofs_flag); - - BTRFS_I(inode)->generation =3D 0; - cache->io_ctl.inode =3D NULL; - iput(inode); - } - ASSERT(cache->io_ctl.pages =3D=3D NULL); - btrfs_put_block_group(cache); -} - void btrfs_cleanup_dirty_bgs(struct btrfs_transaction *cur_trans, struct btrfs_fs_info *fs_info) { @@ -4891,13 +4871,6 @@ void btrfs_cleanup_dirty_bgs(struct btrfs_transactio= n *cur_trans, struct btrfs_block_group, dirty_list); =20 - if (!list_empty(&cache->io_list)) { - spin_unlock(&cur_trans->dirty_bgs_lock); - list_del_init(&cache->io_list); - btrfs_cleanup_bg_io(cache); - spin_lock(&cur_trans->dirty_bgs_lock); - } - list_del_init(&cache->dirty_list); spin_lock(&cache->lock); cache->disk_cache_state =3D BTRFS_DC_ERROR; @@ -4909,22 +4882,6 @@ void btrfs_cleanup_dirty_bgs(struct btrfs_transactio= n *cur_trans, spin_lock(&cur_trans->dirty_bgs_lock); } spin_unlock(&cur_trans->dirty_bgs_lock); - - /* - * Refer to the definition of io_bgs member for details why it's safe - * to use it without any locking - */ - while (!list_empty(&cur_trans->io_bgs)) { - cache =3D list_first_entry(&cur_trans->io_bgs, - struct btrfs_block_group, - io_list); - - list_del_init(&cache->io_list); - spin_lock(&cache->lock); - cache->disk_cache_state =3D BTRFS_DC_ERROR; - spin_unlock(&cache->lock); - btrfs_cleanup_bg_io(cache); - } } =20 static void btrfs_free_all_qgroup_pertrans(struct btrfs_fs_info *fs_info) @@ -4960,7 +4917,6 @@ void btrfs_cleanup_one_transaction(struct btrfs_trans= action *cur_trans) =20 btrfs_cleanup_dirty_bgs(cur_trans, fs_info); ASSERT(list_empty(&cur_trans->dirty_bgs)); - ASSERT(list_empty(&cur_trans->io_bgs)); =20 list_for_each_entry_safe(dev, tmp, &cur_trans->dev_update_list, post_commit_list) { diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 6802b94ed76f..6a36d29406c3 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -379,7 +379,6 @@ static noinline int join_transaction(struct btrfs_fs_in= fo *fs_info, INIT_LIST_HEAD(&cur_trans->dev_update_list); INIT_LIST_HEAD(&cur_trans->switch_commits); INIT_LIST_HEAD(&cur_trans->dirty_bgs); - INIT_LIST_HEAD(&cur_trans->io_bgs); INIT_LIST_HEAD(&cur_trans->dropped_roots); mutex_init(&cur_trans->cache_write_mutex); spin_lock_init(&cur_trans->dirty_bgs_lock); @@ -1363,7 +1362,6 @@ static noinline int commit_cowonly_roots(struct btrfs= _trans_handle *trans) { struct btrfs_fs_info *fs_info =3D trans->fs_info; struct list_head *dirty_bgs =3D &trans->transaction->dirty_bgs; - struct list_head *io_bgs =3D &trans->transaction->io_bgs; struct extent_buffer *eb; int ret; =20 @@ -1393,10 +1391,6 @@ static noinline int commit_cowonly_roots(struct btrf= s_trans_handle *trans) if (ret) return ret; =20 - ret =3D btrfs_setup_space_cache(trans); - if (ret) - return ret; - again: while (!list_empty(&fs_info->dirty_cowonly_roots)) { struct btrfs_root *root; @@ -1417,7 +1411,7 @@ static noinline int commit_cowonly_roots(struct btrfs= _trans_handle *trans) if (ret) return ret; =20 - while (!list_empty(dirty_bgs) || !list_empty(io_bgs)) { + while (!list_empty(dirty_bgs)) { ret =3D btrfs_write_dirty_block_groups(trans); if (ret) return ret; @@ -2543,7 +2537,6 @@ int btrfs_commit_transaction(struct btrfs_trans_handl= e *trans) switch_commit_roots(trans); =20 ASSERT(list_empty(&cur_trans->dirty_bgs)); - ASSERT(list_empty(&cur_trans->io_bgs)); update_super_roots(fs_info); =20 btrfs_set_super_log_root(fs_info->super_copy, 0); diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 3a57f227b5ed..8245a58587c0 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -47,7 +47,6 @@ enum btrfs_trans_state { =20 #define BTRFS_TRANS_HAVE_FREE_BGS 0 #define BTRFS_TRANS_DIRTY_BG_RUN 1 -#define BTRFS_TRANS_CACHE_ENOSPC 2 =20 struct btrfs_transaction { u64 transid; @@ -78,23 +77,6 @@ struct btrfs_transaction { struct list_head dev_update_list; struct list_head switch_commits; struct list_head dirty_bgs; - - /* - * There is no explicit lock which protects io_bgs, rather its - * consistency is implied by the fact that all the sites which modify - * it do so under some form of transaction critical section, namely: - * - * - btrfs_start_dirty_block_groups - This function can only ever be - * run by one of the transaction committers. Refer to - * BTRFS_TRANS_DIRTY_BG_RUN usage in btrfs_commit_transaction - * - * - btrfs_write_dirty_blockgroups - this is called by - * commit_cowonly_roots from transaction critical section - * (TRANS_STATE_COMMIT_DOING) - * - * - btrfs_cleanup_dirty_bgs - called on transaction abort - */ - struct list_head io_bgs; struct list_head dropped_roots; struct extent_io_tree pinned_extents; =20 --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 52906386C18 for ; Sun, 13 Sep 2026 21:21:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334494; cv=none; b=M8INyVSXf7mP0WrGIcrw0Q4RTEOgU+jlVB1uKsEfJK7sEEJZSyuElpdksZy4mi+155g4Y3rKCRok9KhXQe4Qhl3Qe0ukewxRSR1ESrbPHd7v7uqF+0KVxCH+EtS3HOe1MEB0BwD+KT7VYxcGFJBi7pA/7aoLU0Pn70TOiUjvzvA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334494; c=relaxed/simple; bh=Qw6xRMsVJw4t9/S/x7rsDKrF7fU3/zyJMoJYbzy1IwE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gu1nWA/Aa+iIpl+S9uwFwi4FKx01FQCtCnOEHFbIkXxtllrCasttV0RlSam5SpjGhkARAOGeVo2Cg+k8j2rtHP16AIy7pWOLiX/pe+O0ugBffcjt5dWCVeStUsX8vlEam1yCzLl7DoxzNQXJOvuDPHr2eNbDh156R5e+qufKqIA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=Hv3lmAbS; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=wCin/d/4; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="Hv3lmAbS"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="wCin/d/4" Received: from pps.filterd (m0167073.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKXjPa652269 for ; Sun, 13 Sep 2026 17:21:30 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=8Wyh q5ssihSK9up1ann73uoMasXeNXwKo64Ka9RS2oA=; b=Hv3lmAbSlYoNgDU1tJP2 RPzwjcgSE8v8B2pyvCdwxqFGx+WiVHGDqNneEqqnczeHZB1C8TQZe6+XbHa1EWss bFcOwC6YTO3QgraY/NMh1R6PeggYaVb5k864u9kGwfyV/CsYcfFO55EBA1pTfCOR Y5Zb7Lyc5a26yNZp94/7FD5AnIvt1PxjWCpJLUemnHC/Ps5tNNsw0EqPw7jtp3Y/ qcWd+sLKqz8jERzc1yK2Rw4fmb3MiB6qCPQu09Iv56PhCJOvmgeu886UVEW0jk1G d068qUovcAcIWNhzOu50WHb1zN72QJmpJ5v2uRpmCfc+M2sOrJL6WdKZK8z67VSB bw== Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gp2mjg7wg-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:30 -0400 (EDT) Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-530ef845909so26650041cf.1 for ; Sun, 13 Sep 2026 14:21:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334489; x=1789939289; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=8Wyhq5ssihSK9up1ann73uoMasXeNXwKo64Ka9RS2oA=; b=wCin/d/42++bHfby+wlc9z/U4646qUU5os22adlZKnFDXrlPLIHyzB96ssIQXSEbFS XhaYOEbmHc2iLB+8N/vuhrOyUm3KCDRduGGNEu6Se0zrDKV262yhQaVP4f8a6lrsb0n3 MV+oAaVzEcJT6EBST68Jc4Uhcn+VBhalB40WgNfEL/eWrvt89b3Jzh5uxX9hCojH5pR/ KS51X9mqzMaTQSrn7sHY2d2ubVJ7P2RAGHgOa5BDY5Xf43zR/6kouH1QNkFge+bEd+lV GpXX9ilAfiE410nq5R64WDrPBP36zZYkMnRkH0N/pA1yr9dR+aaYkU41VD0iwB8kgK1R II3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334489; x=1789939289; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=8Wyhq5ssihSK9up1ann73uoMasXeNXwKo64Ka9RS2oA=; b=PnA6HJInJF0t921LqzD/qILmfGT6tx0lbUHcGSw8ctRI2GkDRwuVnIihwi0/B/sA4b MxAClnoh+IRfiOskac6kuaSfuxaMPCHGPoxyfJU7g5XYAVu3mGOPpLsW30llxrkSYe2n RuSMpylh0wLccSz2JDxrZzA1DFfe3kPquZN8CX82BKdKHuTfYaxh0JT2VOPBds80R5S/ cTICmlfVmStQiKa46E/4MA0JI52B5W2FNPLvJD05XXIP57e+VWkoQaR3slJf0sQS/XEv LH7utVUU0kID50snJ54DgKCDKRMAwgyk8cMtPyDNdftNyVMAExe+bm04J0Z18o401kiE 7ylw== X-Forwarded-Encrypted: i=1; AKwUvBzZlt98g+5ABX7V6mnj94fgavqDqlPMGVDtEA1pFYLLvIkcUqywU0/QNm1LAuRdhUgM5u68QHWHAk2mN1E=@vger.kernel.org X-Gm-Message-State: AFuF++nhLnyxkrVGRlhOXr1rhGlfwKKxPsMGgiHwbSgJk229QLahlgWm 7EACfyhJNGZkXHmW4U+6+Ki9Nsu2N3tLNGaMVERKR/KvrQzzvERLPgK4t3sxkj0TEX7ubc2ysyo Ymn3shyjdH/CJqQ4L20WL75H09OWfqyNtOTOlSarTXGlGsITvAe2oZJtD4UIMPwEeRvnTw9Qm X-Gm-Gg: AYBFou0NZWrzgQYca+H9QUFFkU3RwhGn8e0/+0UtjSoQf+GWTCuwFNokvmJS9Hqg877 iMlM7ofqTGigXcYpL2mhJqoYR0eNU4+T4mhksVBav7RinV97RXrEUpSGmNJeiUQI+z0IKKHupW9 CEGq4EgcBg0m82JfyBYwhwH0meTJf8FUPGRAIDoMV2NTOVUFnJXZUJPAQ6x/S3v5Z+XHggsvAvn cT8YfhLkGR6+Do6s7a4l2pvp2ANNTZz/qt2iCjtrt/aWFNSMRYIuF+Nqm6UU+YIqLQcooT7mWsD ESbLWcHIlP7bjIf1iaJZC1Qdca0tPiUtpabO4utHfefr45L6Ufcv2QrCtZQ4r9L8TDFU5Vh3Pkt eBlmDz2oyU8cOf1uMIYJJ76IRpQ0wOoxO5OqAJaaFUwNCXTmR4N7aMQ== X-Received: by 2002:a05:622a:2617:b0:530:42e4:f282 with SMTP id d75a77b69052e-530c876f236mr268834061cf.43.1789334489447; Sun, 13 Sep 2026 14:21:29 -0700 (PDT) X-Received: by 2002:a05:622a:2617:b0:530:42e4:f282 with SMTP id d75a77b69052e-530c876f236mr268833671cf.43.1789334488994; Sun, 13 Sep 2026 14:21:28 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:28 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:15 -0400 Subject: [PATCH v2 03/16] btrfs: remove the free space cache endio workqueue Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-3-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=5247; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=Qw6xRMsVJw4t9/S/x7rsDKrF7fU3/zyJMoJYbzy1IwE=; b=qmNOH8C/39Y7ZBnAqLnxFxa0VekU2u+K+Cv8RGX7D0U/nxWC2+AUDko/sizVzUdMDG8WflsvL /pp0RPcmnNOBdWed6hk/izV4Bcyo76bUTV6n8vWu5qUhnT3+YAECr7s X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=NfpzRGD4 c=1 sm=1 tr=0 ts=6aa713da cx=c_pps a=EVbN6Ke/fEF3bsl7X48z0g==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=jHxIr1HyPKZ_Q5_91PL3:22 a=MjXS7SgsmouH5g4WD6EA:9 a=QEXdDO2ut3YA:10 a=a_PwQJl-kcHnX1M80qC6:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX0H5HB3jvpFf8 gIdG6bi++jBZwj7AeE7YxK23AzZoybKERX3wjC3PYFyswN38G5LSW93djhMPtyPWuRiQxqTdrjN jYrRND06oAJMM09IXHIDxmVupNkDWpFLOLR2m3gnJWeZc1cych7soup+Ymyz1AsuVxDec+IAoEr ccW1+BR5lTkOuCVkJ5+YUlYOCHIJ1khQfe7f/2rR3kIfLo1/3JSXFRG3BYoUrR61Jr8GZfDwiYr gNxd2YlQTlYrGQKNIT5tCSRBrMp9SxaKX9WYsF/7ixVcTdChXuDnqB2qWfDDg4I7r+p6n8KNFkV kQljOAwsR78nuSKqTXRE9B2rv0BFt5Jm84O9fZCm/rg9T3zLhNY8vRNY26pPrNDzsOcTgNWFnNK k1q/GRKGPCvlGjZHTRB+K58jj+yXDbVuxPkWAEm6Ay1eLhBvQgCPcv8eDBVXNNhpt0/gsc4pzYy /5a5a2gD3NbWiTZPIzA== X-Proofpoint-GUID: KS0_Y3rlSULU6Y6r2ns4Xhc7iBJd9dtX X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX9eSb5CY8FKKd kdnUGphK+jN08u1sOdGkQadT73PmuTbXolppVnE1OKteO0ITf3Aj5P5nCIM4pfsqX5P7q0+sISm iBgtJpi+aT7BriADAZxr+HfiVYtKirSWMk4JiMGD0mIDj3FP5xMQ X-Proofpoint-ORIG-GUID: KS0_Y3rlSULU6Y6r2ns4Xhc7iBJd9dtX X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=10 suspectscore=0 malwarescore=0 spamscore=0 bulkscore=10 clxscore=1015 adultscore=0 lowpriorityscore=10 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 Free space inodes are no longer written to, so nothing queues ordered extent completion on endio_freespace_worker. Remove it and always use endio_write_workers in btrfs_queue_ordered_fn(). Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/disk-io.c | 14 +++----------- fs/btrfs/fs.h | 1 - fs/btrfs/ordered-data.c | 7 ++----- fs/btrfs/super.c | 1 - 4 files changed, 5 insertions(+), 18 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index f544c457d4ab..f256a91f58b4 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1769,7 +1769,6 @@ static void btrfs_stop_all_workers(struct btrfs_fs_in= fo *fs_info) if (fs_info->rmw_workers) destroy_workqueue(fs_info->rmw_workers); btrfs_destroy_workqueue(fs_info->endio_write_workers); - btrfs_destroy_workqueue(fs_info->endio_freespace_worker); btrfs_destroy_workqueue(fs_info->delayed_workers); btrfs_destroy_workqueue(fs_info->caching_workers); btrfs_destroy_workqueue(fs_info->flush_workers); @@ -1980,9 +1979,6 @@ static int btrfs_init_workqueues(struct btrfs_fs_info= *fs_info) fs_info->endio_write_workers =3D btrfs_alloc_workqueue(fs_info, "endio-write", flags, max_active, 2); - fs_info->endio_freespace_worker =3D - btrfs_alloc_workqueue(fs_info, "freespace-write", flags, - max_active, 0); fs_info->delayed_workers =3D btrfs_alloc_workqueue(fs_info, "delayed-meta", flags, max_active, 0); @@ -1995,8 +1991,7 @@ static int btrfs_init_workqueues(struct btrfs_fs_info= *fs_info) if (!(fs_info->workers && fs_info->delalloc_workers && fs_info->flush_workers && fs_info->endio_workers && fs_info->endio_meta_workers && - fs_info->endio_write_workers && - fs_info->endio_freespace_worker && fs_info->rmw_workers && + fs_info->endio_write_workers && fs_info->rmw_workers && fs_info->caching_workers && fs_info->fixup_workers && fs_info->delayed_workers && fs_info->qgroup_rescan_workers && fs_info->discard_ctl.discard_workers)) { @@ -4442,9 +4437,8 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info) * to finish an ordered extent - end_bbio_compressed_write() * calls btrfs_finish_ordered_extent() which in turns does a call to * btrfs_queue_ordered_fn(), and that queues the ordered extent - * completion either in the endio_write_workers work queue or in the - * fs_info->endio_freespace_worker work queue. We flush those queues - * below, so before we flush them we must flush this queue for the + * completion in the endio_write_workers work queue. We flush that + * queue below, so before we flush it we must flush this queue for the * workers of compressed writes. */ flush_workqueue(fs_info->endio_workers); @@ -4470,8 +4464,6 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info) * btrfs_finish_ordered_io() when we are unmounting). */ btrfs_flush_workqueue(fs_info->endio_write_workers); - /* Ordered extents for free space inodes. */ - btrfs_flush_workqueue(fs_info->endio_freespace_worker); /* * Run delayed iputs in case an async reclaim worker is waiting for them * to be run as mentioned above. diff --git a/fs/btrfs/fs.h b/fs/btrfs/fs.h index 10e15a319b93..96cc8c50af82 100644 --- a/fs/btrfs/fs.h +++ b/fs/btrfs/fs.h @@ -712,7 +712,6 @@ struct btrfs_fs_info { struct workqueue_struct *endio_meta_workers; struct workqueue_struct *rmw_workers; struct btrfs_workqueue *endio_write_workers; - struct btrfs_workqueue *endio_freespace_worker; struct btrfs_workqueue *caching_workers; =20 struct workqueue_struct *fixup_workers; diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index b32d4eabe0ab..e9f1cbeb555a 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -417,13 +417,10 @@ static bool can_finish_ordered_extent(struct btrfs_or= dered_extent *ordered, =20 static void btrfs_queue_ordered_fn(struct btrfs_ordered_extent *ordered) { - struct btrfs_inode *inode =3D ordered->inode; - struct btrfs_fs_info *fs_info =3D inode->root->fs_info; - struct btrfs_workqueue *wq =3D btrfs_is_free_space_inode(inode) ? - fs_info->endio_freespace_worker : fs_info->endio_write_workers; + struct btrfs_fs_info *fs_info =3D ordered->inode->root->fs_info; =20 btrfs_init_work(&ordered->work, finish_ordered_fn, NULL); - btrfs_queue_work(wq, &ordered->work); + btrfs_queue_work(fs_info->endio_write_workers, &ordered->work); } =20 void btrfs_finish_ordered_extent(struct btrfs_ordered_extent *ordered, diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 77443ded6db3..b44b16970a62 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -1243,7 +1243,6 @@ static void btrfs_resize_thread_pool(struct btrfs_fs_= info *fs_info, workqueue_set_max_active(fs_info->endio_workers, new_pool_size); workqueue_set_max_active(fs_info->endio_meta_workers, new_pool_size); btrfs_workqueue_set_max(fs_info->endio_write_workers, new_pool_size); - btrfs_workqueue_set_max(fs_info->endio_freespace_worker, new_pool_size); btrfs_workqueue_set_max(fs_info->delayed_workers, new_pool_size); } =20 --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 CE35D37B019 for ; Sun, 13 Sep 2026 21:21:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334498; cv=none; b=grDIwniPKKgw0gkZoDVXv4UwEvyhWZSwVr23z5uOoarOURq+QozE45d2RCRFR1rgrFF9Frv9eeMPH76MzMAsj8TGPMvMCpP/DFGwDUpOD//VCE6qzdGJeDrhVo+WABu5816VQ/mPYEBNOIQZYVX/xz/bd/KfMJG19HZ/ya7oB68= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334498; c=relaxed/simple; bh=yH26YVh59esQKHMCy++Ej1YY9ruVn1VDQiCm0t+ET1Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oHiAWmjOSb24RZlGmb3/LrlLJ0jY+KKEnYeFNeavG8W0i3Y7pLN0no4VKE/JIyHEXNVCY8SfIZxCPl+4/r2orTMZhS6/+Gnf3ye7F1DJZayF9M61oEvRNQuLWFM7vM6oAW+kC+ZjzqA9z2OOFxK+295pB44MaRRwMPM1Xtt3c1k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=pIBZ9HHD; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=pt1GFZAb; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="pIBZ9HHD"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="pt1GFZAb" Received: from pps.filterd (m0499198.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKY7Rc1192300 for ; Sun, 13 Sep 2026 17:21:31 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=rGvH pKSs577egwDORb5uIb/Utx6qjrc5/BZ0yrU00XU=; b=pIBZ9HHDkYsq1pJFutiq NR3wubt1N7qfG5L7tVTSxAvc2IVXQ5YGDdXgGXfysfNhEGzpawv1m5QpijiPfKX2 zDMmBg9FIN0bWfqbg0hZ7DtctLyB14A+3KR8M8/I9tfS/qxxx2IMvbERwoA8bgyZ +8feS9SxllWLvwPvELzT08379cO/9YONrRvit5xLX0FR1o0A5CtzcNQ9TGIWoFJ2 fR5VS3QOleFO7xfu4sSTdneZZeC1B5e4RQCqp4Xne2Kn9JqKfnMzAh2ns6QN5W3a 8bvQMRtnJlim1NzCs6v02fIQlppfTP/dSV08tGx9RnICAYWrXFo7STi5ujSyvqcS Gw== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gnqqt2s19-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:31 -0400 (EDT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-9104417215aso63295066d6.2 for ; Sun, 13 Sep 2026 14:21:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334491; x=1789939291; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=rGvHpKSs577egwDORb5uIb/Utx6qjrc5/BZ0yrU00XU=; b=pt1GFZAbnxPjErYhcrKfvoZ2vWCrmRWypYth3mLR2XaweRR9CrTfGRjzOWuPHlbqsD eG1bQeFzc0wJ4X8/+V0/e8gLqC+9wF5smv0wSlIlujAqYoh00e5euJlsnm7IX+iwXE2w 8sssBL2+syXhooS2wyYqBPfBzEz8lxqnZCXdILth1HBHOTNvvLS12tUc7EsiiSTQXG2W Z80u3vIdqzX78bx6CoNIJeveXxKFDWEXYdFHVrukYYiMB0kgiOzUHavCqyZrWD3YppF3 ++LiA5Ee+Ctf2ErCP2llQQwRDnoTaT3ZdW1ldhfiDzgzvhYXMR+yiETefGhnkSEX55Pn YzBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334491; x=1789939291; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=rGvHpKSs577egwDORb5uIb/Utx6qjrc5/BZ0yrU00XU=; b=VayvtZcoS+9SzK+xb56sDLHOea33coINxYtMXYXGrCN7MvzAf29/1HfhBv+3Na6Owq HuD11X78p6oDGfCPYjI6QH8rC8G1AhOdI3D4RMtq5qOLWkUDGs4pA2RgS7NdixH77sUp lU9rG5uGHG8+FkeXiq02DDGAUXlrPnV3L7dGc9tYSRTGKKtTj8udy/C+Wtnq4FE8rx0d H+Dg3XS3CJnltgubIWYwgryZ1uh9AKExk8OfvB33vRMHaZLMUsb1ePTbKlxGKPy1V6NM GmnvfgvcZxahiDmJF5hPd9TrMz2xeGK7iH7sHtQuDrf/tBYZnVcHwu8/bm3rXDcPXaEH NYFQ== X-Forwarded-Encrypted: i=1; AKwUvBxV9NFGs3vV+2vP4iipA3UbsDGrUNEF0AmXUKpTDCKZO6VZc+UpeiIjIcvFZG5RBfAkpuPyqbmougShvXM=@vger.kernel.org X-Gm-Message-State: AFuF++nQbL/HFPvvSPEbSe1rPYTI1l731rWHWfJFf4Aa1AIjwHP3+AqI xtE67gpxLTeKcDFmDgu+R4e4krayaeXY9MNspomKWCzx9jX8wAph3TmtTIcmvFJGU17kV0g9PsU 5QRnCYz0a070FGBZOMQM126qJr6M8sqz8xxR4zhhfywj28bK/YdD0FP5iu95EoQ== X-Gm-Gg: AYBFou3rgtRX8d5+g1nUZbZiuthnd9IKVn3NZrnaXdwOI2unQ0padgKT6J9Zvf0SXPP OWdokZzMms+wlaDADtRaMHYn7KjDFVpjHfBxXAlrYgSGQvyxekIuXpnGGJB+lJYJZs97tShNRTm 2rVsevAxAVpVDi+k8egeK9r9nMi6/JK65y1apdVWR7LLMiKnN0qEcsYTdht+1mBbzdUsorml1VH X3ar3aSf0SJceMzXNEqasozReG0NAwTcA0jHCOst2hno/Eh+e6Bpr1aJJ9fsbCQVf67wyP397wz /hVc3uxSSWyxToridzFU4DeMbzXPLPZf7ws12gd9RoEA3u6LxO8UeO7etYD05VnsQVvgyROlGlP Dg3QF8DEWVNnXrt4iKjuh50JMZjqD/N1gZfx1f4Zc56nRRSMONjGxzA== X-Received: by 2002:a05:6214:5199:b0:90e:867d:c893 with SMTP id 6a1803df08f44-91212064fb6mr209240876d6.8.1789334490554; Sun, 13 Sep 2026 14:21:30 -0700 (PDT) X-Received: by 2002:a05:6214:5199:b0:90e:867d:c893 with SMTP id 6a1803df08f44-91212064fb6mr209240496d6.8.1789334489929; Sun, 13 Sep 2026 14:21:29 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:29 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:16 -0400 Subject: [PATCH v2 04/16] btrfs: remove the v1 space cache write path Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-4-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=29653; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=yH26YVh59esQKHMCy++Ej1YY9ruVn1VDQiCm0t+ET1Y=; b=rYhnn8u9dR+nRpV45ViM90PHdbmJc7QtGvsr3ca8FadAV2R3OkSC5HgKWk5+HObVeB5yrWhxz PAMM519MnkoAAyPyFgX3zmPqCmYYWWLVYF0qeNT3ZKU36G820/UuU63 X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=N8y8hG9B c=1 sm=1 tr=0 ts=6aa713db cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=BpGzv1V74M3SfeTrGa8v:22 a=8VahGqg1PXxmH9HWCi0A:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX9bvwxHyMST5X cVYMI5+DZ+7/7MXJA7UWqlmvTNKrnmh4ooPO556CWYdmgvuhxyUShJpKhvdRqf4djtP1ff3l0MF 4cyWyQ8vi5RFMt77aoQmdPJD9OUJh+EjLsvsJNRPYXWq6gS+OwlQ X-Proofpoint-ORIG-GUID: EqxWmxD2maneK6XuJnLyXDuPQBnMtCwf X-Proofpoint-GUID: EqxWmxD2maneK6XuJnLyXDuPQBnMtCwf X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX8GDyNXrqaQQ8 94QGHRSx+qRoArhi5kEFnj7/WeZ9LHWERjTMbly/7mMtytou7BHtlXVsUg2xedIFTIAdr4+7+rr LFmcPTNyCJUo/+ANFJIY+eJ+m6qvkKspXI8vseBQDYtF9GsOSXgAxd9Qh4+kpb+bG0PIs347TLd uTM1DpVLPg6GHgBfDvKMhLyOYTF/qfjn+GBtqIpRwfX4hydIQuOVMRQBR1GnmR9FIGf5k8CxAeu 6iOVLobB5EUQdyG8L0Yj0IXCNyjGo7DoOQ9WrwlYhLoK59q8x6pFdnNS7LlUot4C76M20XeDR6L Y6EoQT0UDXlBOFnOZNL9KGoL42/nR7jAHyXGiBzhPIvTzW8hTxXm3lqpvd2kJktvC5pA8ueV/yI jfWn++XzwD5lvYo9yYVXCb1CP4y3QgaojctJ6iZRVLuzTCpCtstUsDI/4lnt+rwY2DWMAQzU3Sf IcavHwX4OWvWuq5BZ2g== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=10 spamscore=0 clxscore=1015 suspectscore=0 lowpriorityscore=10 adultscore=0 priorityscore=1501 phishscore=0 impostorscore=10 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 Nothing writes out a v1 space cache any more. Remove the writers and their io_ctl helpers, along with create_free_space_inode() and btrfs_prealloc_file_range_trans(), whose only user was the cache inode creation. The io_list and io_ctl block group fields and the transaction cache_write_mutex were only used by the writers, so remove them too. btrfs_truncate_free_space_cache() only needed the block group to wait for and clear in-flight cache IO, so drop that parameter. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/block-group.c | 4 - fs/btrfs/block-group.h | 3 - fs/btrfs/btrfs_inode.h | 4 - fs/btrfs/free-space-cache.c | 688 ----------------------------------------= ---- fs/btrfs/free-space-cache.h | 10 - fs/btrfs/inode.c | 9 - fs/btrfs/relocation.c | 2 +- fs/btrfs/transaction.c | 1 - fs/btrfs/transaction.h | 6 - 9 files changed, 1 insertion(+), 726 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index a04dd8244c81..5790396482db 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1266,7 +1266,6 @@ int btrfs_remove_block_group(struct btrfs_trans_handl= e *trans, =20 spin_lock(&trans->transaction->dirty_bgs_lock); WARN_ON(!list_empty(&block_group->dirty_list)); - WARN_ON(!list_empty(&block_group->io_list)); spin_unlock(&trans->transaction->dirty_bgs_lock); =20 btrfs_remove_free_space_cache(block_group); @@ -2410,7 +2409,6 @@ static struct btrfs_block_group *btrfs_create_block_g= roup( INIT_LIST_HEAD(&cache->ro_list); INIT_LIST_HEAD(&cache->discard_list); INIT_LIST_HEAD(&cache->dirty_list); - INIT_LIST_HEAD(&cache->io_list); INIT_LIST_HEAD(&cache->active_bg_list); btrfs_init_free_space_ctl(cache, cache->free_space_ctl); atomic_set(&cache->frozen, 0); @@ -4281,7 +4279,6 @@ void btrfs_put_block_group_cache(struct btrfs_fs_info= *info) block_group->inode =3D NULL; spin_unlock(&block_group->lock); =20 - ASSERT(block_group->io_ctl.inode =3D=3D NULL); iput(&inode->vfs_inode); } else { spin_unlock(&block_group->lock); @@ -4418,7 +4415,6 @@ int btrfs_free_block_groups(struct btrfs_fs_info *inf= o) btrfs_remove_free_space_cache(block_group); ASSERT(block_group->cached !=3D BTRFS_CACHE_STARTED); ASSERT(list_empty(&block_group->dirty_list)); - ASSERT(list_empty(&block_group->io_list)); ASSERT(list_empty(&block_group->bg_list)); ASSERT(refcount_read(&block_group->refs) =3D=3D 1); ASSERT(block_group->swap_extents =3D=3D 0); diff --git a/fs/btrfs/block-group.h b/fs/btrfs/block-group.h index 97c8565ae4fc..939d4bfbd4b4 100644 --- a/fs/btrfs/block-group.h +++ b/fs/btrfs/block-group.h @@ -228,9 +228,6 @@ struct btrfs_block_group { =20 /* For dirty block groups */ struct list_head dirty_list; - struct list_head io_list; - - struct btrfs_io_ctl io_ctl; =20 /* * Incremented when doing extent allocations and holding a read lock diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index 1082fa92c145..26cc5d1aca4c 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h @@ -594,10 +594,6 @@ int btrfs_wait_on_delayed_iputs(struct btrfs_fs_info *= fs_info); int btrfs_prealloc_file_range(struct inode *inode, int mode, u64 start, u64 num_bytes, u64 min_size, loff_t actual_len, u64 *alloc_hint); -int btrfs_prealloc_file_range_trans(struct inode *inode, - struct btrfs_trans_handle *trans, int mode, - u64 start, u64 num_bytes, u64 min_size, - loff_t actual_len, u64 *alloc_hint); int btrfs_run_delalloc_range(struct btrfs_inode *inode, struct folio *lock= ed_folio, u64 start, u64 end, struct writeback_control *wbc); void btrfs_queue_writepage_fixup(struct btrfs_inode *inode, struct folio *= folio); diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index e2af75a205ea..336b546b0a94 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -164,78 +164,6 @@ struct inode *lookup_free_space_inode(struct btrfs_blo= ck_group *block_group, return inode; } =20 -static int __create_free_space_inode(struct btrfs_root *root, - struct btrfs_trans_handle *trans, - struct btrfs_path *path, - u64 ino, u64 offset) -{ - struct btrfs_key key; - struct btrfs_disk_key disk_key; - struct btrfs_free_space_header *header; - struct btrfs_inode_item *inode_item; - struct extent_buffer *leaf; - /* We inline CRCs for the free disk space cache */ - const u64 flags =3D BTRFS_INODE_NOCOMPRESS | BTRFS_INODE_PREALLOC | - BTRFS_INODE_NODATASUM | BTRFS_INODE_NODATACOW; - int ret; - - ret =3D btrfs_insert_empty_inode(trans, root, path, ino); - if (ret) - return ret; - - leaf =3D path->nodes[0]; - inode_item =3D btrfs_item_ptr(leaf, path->slots[0], - struct btrfs_inode_item); - btrfs_item_key(leaf, &disk_key, path->slots[0]); - memzero_extent_buffer(leaf, (unsigned long)inode_item, - sizeof(*inode_item)); - btrfs_set_inode_generation(leaf, inode_item, trans->transid); - btrfs_set_inode_size(leaf, inode_item, 0); - btrfs_set_inode_nbytes(leaf, inode_item, 0); - btrfs_set_inode_uid(leaf, inode_item, 0); - btrfs_set_inode_gid(leaf, inode_item, 0); - btrfs_set_inode_mode(leaf, inode_item, S_IFREG | 0600); - btrfs_set_inode_flags(leaf, inode_item, flags); - btrfs_set_inode_nlink(leaf, inode_item, 1); - btrfs_set_inode_transid(leaf, inode_item, trans->transid); - btrfs_set_inode_block_group(leaf, inode_item, offset); - btrfs_release_path(path); - - key.objectid =3D BTRFS_FREE_SPACE_OBJECTID; - key.type =3D 0; - key.offset =3D offset; - ret =3D btrfs_insert_empty_item(trans, root, path, &key, - sizeof(struct btrfs_free_space_header)); - if (ret < 0) { - btrfs_release_path(path); - return ret; - } - - leaf =3D path->nodes[0]; - header =3D btrfs_item_ptr(leaf, path->slots[0], - struct btrfs_free_space_header); - memzero_extent_buffer(leaf, (unsigned long)header, sizeof(*header)); - btrfs_set_free_space_key(leaf, header, &disk_key); - btrfs_release_path(path); - - return 0; -} - -int create_free_space_inode(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path) -{ - int ret; - u64 ino; - - ret =3D btrfs_get_free_objectid(trans->fs_info->tree_root, &ino); - if (ret < 0) - return ret; - - return __create_free_space_inode(trans->fs_info->tree_root, trans, path, - ino, block_group->start); -} - /* * inode is an optional sink: if it is NULL, btrfs_remove_free_space_inode * handles lookup, otherwise it takes ownership and iputs the inode. @@ -292,7 +220,6 @@ int btrfs_remove_free_space_inode(struct btrfs_trans_ha= ndle *trans, } =20 int btrfs_truncate_free_space_cache(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, struct inode *vfs_inode) { struct btrfs_truncate_control control =3D { @@ -306,33 +233,6 @@ int btrfs_truncate_free_space_cache(struct btrfs_trans= _handle *trans, struct btrfs_root *root =3D inode->root; struct extent_state *cached_state =3D NULL; int ret =3D 0; - bool locked =3D false; - - if (block_group) { - BTRFS_PATH_AUTO_FREE(path); - - path =3D btrfs_alloc_path(); - if (!path) { - ret =3D -ENOMEM; - goto fail; - } - locked =3D true; - mutex_lock(&trans->transaction->cache_write_mutex); - if (!list_empty(&block_group->io_list)) { - list_del_init(&block_group->io_list); - - btrfs_wait_cache_io(trans, block_group, path); - btrfs_put_block_group(block_group); - } - - /* - * now that we've truncated the cache away, its no longer - * setup or written - */ - spin_lock(&block_group->lock); - block_group->disk_cache_state =3D BTRFS_DC_CLEAR; - spin_unlock(&block_group->lock); - } =20 btrfs_i_size_write(inode, 0); truncate_pagecache(vfs_inode, 0); @@ -356,8 +256,6 @@ int btrfs_truncate_free_space_cache(struct btrfs_trans_= handle *trans, ret =3D btrfs_update_inode(trans, inode); =20 fail: - if (locked) - mutex_unlock(&trans->transaction->cache_write_mutex); if (ret) btrfs_abort_transaction(trans, ret); =20 @@ -490,21 +388,6 @@ static int io_ctl_prepare_pages(struct btrfs_io_ctl *i= o_ctl, bool uptodate) return 0; } =20 -static void io_ctl_set_generation(struct btrfs_io_ctl *io_ctl, u64 generat= ion) -{ - io_ctl_map_page(io_ctl, 1); - - /* - * Skip the csum areas. If we don't check crcs then we just have a - * 64bit chunk at the front of the first page. - */ - io_ctl->cur +=3D (sizeof(u32) * io_ctl->num_pages); - io_ctl->size -=3D sizeof(u64) + (sizeof(u32) * io_ctl->num_pages); - - put_unaligned_le64(generation, io_ctl->cur); - io_ctl->cur +=3D sizeof(u64); -} - static int io_ctl_check_generation(struct btrfs_io_ctl *io_ctl, u64 genera= tion) { u64 cache_gen; @@ -528,23 +411,6 @@ static int io_ctl_check_generation(struct btrfs_io_ctl= *io_ctl, u64 generation) return 0; } =20 -static void io_ctl_set_crc(struct btrfs_io_ctl *io_ctl, int index) -{ - u32 *tmp; - u32 crc =3D ~(u32)0; - unsigned offset =3D 0; - - if (index =3D=3D 0) - offset =3D sizeof(u32) * io_ctl->num_pages; - - crc =3D crc32c(crc, io_ctl->orig + offset, PAGE_SIZE - offset); - btrfs_crc32c_final(crc, (u8 *)&crc); - io_ctl_unmap_page(io_ctl); - tmp =3D page_address(io_ctl->pages[0]); - tmp +=3D index; - *tmp =3D crc; -} - static int io_ctl_check_crc(struct btrfs_io_ctl *io_ctl, int index) { u32 *tmp, val; @@ -574,76 +440,6 @@ static int io_ctl_check_crc(struct btrfs_io_ctl *io_ct= l, int index) return 0; } =20 -static int io_ctl_add_entry(struct btrfs_io_ctl *io_ctl, u64 offset, u64 b= ytes, - void *bitmap) -{ - struct btrfs_free_space_entry *entry; - - if (!io_ctl->cur) - return -ENOSPC; - - entry =3D io_ctl->cur; - put_unaligned_le64(offset, &entry->offset); - put_unaligned_le64(bytes, &entry->bytes); - entry->type =3D (bitmap) ? BTRFS_FREE_SPACE_BITMAP : - BTRFS_FREE_SPACE_EXTENT; - io_ctl->cur +=3D sizeof(struct btrfs_free_space_entry); - io_ctl->size -=3D sizeof(struct btrfs_free_space_entry); - - if (io_ctl->size >=3D sizeof(struct btrfs_free_space_entry)) - return 0; - - io_ctl_set_crc(io_ctl, io_ctl->index - 1); - - /* No more pages to map */ - if (io_ctl->index >=3D io_ctl->num_pages) - return 0; - - /* map the next page */ - io_ctl_map_page(io_ctl, 1); - return 0; -} - -static int io_ctl_add_bitmap(struct btrfs_io_ctl *io_ctl, void *bitmap) -{ - if (!io_ctl->cur) - return -ENOSPC; - - /* - * If we aren't at the start of the current page, unmap this one and - * map the next one if there is any left. - */ - if (io_ctl->cur !=3D io_ctl->orig) { - io_ctl_set_crc(io_ctl, io_ctl->index - 1); - if (io_ctl->index >=3D io_ctl->num_pages) - return -ENOSPC; - io_ctl_map_page(io_ctl, 0); - } - - copy_page(io_ctl->cur, bitmap); - io_ctl_set_crc(io_ctl, io_ctl->index - 1); - if (io_ctl->index < io_ctl->num_pages) - io_ctl_map_page(io_ctl, 0); - return 0; -} - -static void io_ctl_zero_remaining_pages(struct btrfs_io_ctl *io_ctl) -{ - /* - * If we're not on the boundary we know we've modified the page and we - * need to crc the page. - */ - if (io_ctl->cur !=3D io_ctl->orig) - io_ctl_set_crc(io_ctl, io_ctl->index - 1); - else - io_ctl_unmap_page(io_ctl); - - while (io_ctl->index < io_ctl->num_pages) { - io_ctl_map_page(io_ctl, 1); - io_ctl_set_crc(io_ctl, io_ctl->index - 1); - } -} - static int io_ctl_read_entry(struct btrfs_io_ctl *io_ctl, struct btrfs_free_space *entry, u8 *type) { @@ -1065,490 +861,6 @@ int load_free_space_cache(struct btrfs_block_group *= block_group) return ret; } =20 -static noinline_for_stack -int write_cache_extent_entries(struct btrfs_io_ctl *io_ctl, - struct btrfs_block_group *block_group, - int *entries, int *bitmaps, - struct list_head *bitmap_list) -{ - int ret; - struct btrfs_free_space_ctl *ctl =3D block_group->free_space_ctl; - struct btrfs_free_cluster *cluster =3D NULL; - struct btrfs_free_cluster *cluster_locked =3D NULL; - struct rb_node *node =3D rb_first(&ctl->free_space_offset); - struct btrfs_trim_range *trim_entry; - - /* Get the cluster for this block_group if it exists */ - if (!list_empty(&block_group->cluster_list)) { - cluster =3D list_first_entry(&block_group->cluster_list, - struct btrfs_free_cluster, block_group_list); - } - - if (!node && cluster) { - cluster_locked =3D cluster; - spin_lock(&cluster_locked->lock); - node =3D rb_first(&cluster->root); - cluster =3D NULL; - } - - /* Write out the extent entries */ - while (node) { - struct btrfs_free_space *e; - - e =3D rb_entry(node, struct btrfs_free_space, offset_index); - *entries +=3D 1; - - ret =3D io_ctl_add_entry(io_ctl, e->offset, e->bytes, - e->bitmap); - if (ret) - goto fail; - - if (e->bitmap) { - list_add_tail(&e->list, bitmap_list); - *bitmaps +=3D 1; - } - node =3D rb_next(node); - if (!node && cluster) { - node =3D rb_first(&cluster->root); - cluster_locked =3D cluster; - spin_lock(&cluster_locked->lock); - cluster =3D NULL; - } - } - if (cluster_locked) { - spin_unlock(&cluster_locked->lock); - cluster_locked =3D NULL; - } - - /* - * Make sure we don't miss any range that was removed from our rbtree - * because trimming is running. Otherwise after a umount+mount (or crash - * after committing the transaction) we would leak free space and get - * an inconsistent free space cache report from fsck. - */ - list_for_each_entry(trim_entry, &ctl->trimming_ranges, list) { - ret =3D io_ctl_add_entry(io_ctl, trim_entry->start, - trim_entry->bytes, NULL); - if (ret) - goto fail; - *entries +=3D 1; - } - - return 0; -fail: - if (cluster_locked) - spin_unlock(&cluster_locked->lock); - return -ENOSPC; -} - -static noinline_for_stack int -update_cache_item(struct btrfs_trans_handle *trans, - struct btrfs_root *root, - struct inode *inode, - struct btrfs_path *path, u64 offset, - int entries, int bitmaps) -{ - struct btrfs_key key; - struct btrfs_free_space_header *header; - struct extent_buffer *leaf; - int ret; - - key.objectid =3D BTRFS_FREE_SPACE_OBJECTID; - key.type =3D 0; - key.offset =3D offset; - - ret =3D btrfs_search_slot(trans, root, &key, path, 0, 1); - if (ret < 0) { - btrfs_clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, inode->i_size - 1, - EXTENT_DELALLOC, NULL); - return ret; - } - leaf =3D path->nodes[0]; - if (ret > 0) { - struct btrfs_key found_key; - ASSERT(path->slots[0]); - path->slots[0]--; - btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); - if (found_key.objectid !=3D BTRFS_FREE_SPACE_OBJECTID || - found_key.offset !=3D offset) { - btrfs_clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, - inode->i_size - 1, EXTENT_DELALLOC, - NULL); - btrfs_release_path(path); - return -ENOENT; - } - } - - BTRFS_I(inode)->generation =3D trans->transid; - header =3D btrfs_item_ptr(leaf, path->slots[0], - struct btrfs_free_space_header); - btrfs_set_free_space_entries(leaf, header, entries); - btrfs_set_free_space_bitmaps(leaf, header, bitmaps); - btrfs_set_free_space_generation(leaf, header, trans->transid); - btrfs_release_path(path); - - return 0; -} - -static noinline_for_stack int write_pinned_extent_entries( - struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_io_ctl *io_ctl, - int *entries) -{ - u64 start, extent_start, extent_end, len; - const u64 block_group_end =3D btrfs_block_group_end(block_group); - struct extent_io_tree *unpin =3D NULL; - int ret; - - /* - * We want to add any pinned extents to our free space cache - * so we don't leak the space - * - * We shouldn't have switched the pinned extents yet so this is the - * right one - */ - unpin =3D &trans->transaction->pinned_extents; - - start =3D block_group->start; - - while (start < block_group_end) { - if (!btrfs_find_first_extent_bit(unpin, start, - &extent_start, &extent_end, - EXTENT_DIRTY, NULL)) - return 0; - - /* This pinned extent is out of our range */ - if (extent_start >=3D block_group_end) - return 0; - - extent_start =3D max(extent_start, start); - extent_end =3D min(block_group_end, extent_end + 1); - len =3D extent_end - extent_start; - - *entries +=3D 1; - ret =3D io_ctl_add_entry(io_ctl, extent_start, len, NULL); - if (ret) - return -ENOSPC; - - start =3D extent_end; - } - - return 0; -} - -static noinline_for_stack int -write_bitmap_entries(struct btrfs_io_ctl *io_ctl, struct list_head *bitmap= _list) -{ - struct btrfs_free_space *entry, *next; - int ret; - - /* Write out the bitmaps */ - list_for_each_entry_safe(entry, next, bitmap_list, list) { - ret =3D io_ctl_add_bitmap(io_ctl, entry->bitmap); - if (ret) - return -ENOSPC; - list_del_init(&entry->list); - } - - return 0; -} - -static int flush_dirty_cache(struct inode *inode) -{ - int ret; - - ret =3D btrfs_wait_ordered_range(BTRFS_I(inode), 0, (u64)-1); - if (ret) - btrfs_clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, inode->i_size - 1, - EXTENT_DELALLOC, NULL); - - return ret; -} - -static void noinline_for_stack -cleanup_bitmap_list(struct list_head *bitmap_list) -{ - struct btrfs_free_space *entry, *next; - - list_for_each_entry_safe(entry, next, bitmap_list, list) - list_del_init(&entry->list); -} - -static void noinline_for_stack -cleanup_write_cache_enospc(struct inode *inode, - struct btrfs_io_ctl *io_ctl, - struct extent_state **cached_state) -{ - io_ctl_drop_pages(io_ctl); - btrfs_unlock_extent(&BTRFS_I(inode)->io_tree, 0, i_size_read(inode) - 1, - cached_state); -} - -static int __btrfs_wait_cache_io(struct btrfs_root *root, - struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_io_ctl *io_ctl, - struct btrfs_path *path, u64 offset) -{ - int ret; - struct inode *inode =3D io_ctl->inode; - - if (!inode) - return 0; - - /* Flush the dirty pages in the cache file. */ - ret =3D flush_dirty_cache(inode); - if (ret) - goto out; - - /* Update the cache item to tell everyone this cache file is valid. */ - ret =3D update_cache_item(trans, root, inode, path, offset, - io_ctl->entries, io_ctl->bitmaps); -out: - if (ret) { - invalidate_inode_pages2(inode->i_mapping); - BTRFS_I(inode)->generation =3D 0; - if (block_group) - btrfs_debug(root->fs_info, - "failed to write free space cache for block group %llu error %d", - block_group->start, ret); - } - btrfs_update_inode(trans, BTRFS_I(inode)); - - if (block_group) { - /* the dirty list is protected by the dirty_bgs_lock */ - spin_lock(&trans->transaction->dirty_bgs_lock); - - /* the disk_cache_state is protected by the block group lock */ - spin_lock(&block_group->lock); - - /* - * only mark this as written if we didn't get put back on - * the dirty list while waiting for IO. Otherwise our - * cache state won't be right, and we won't get written again - */ - if (!ret && list_empty(&block_group->dirty_list)) - block_group->disk_cache_state =3D BTRFS_DC_WRITTEN; - else if (ret) - block_group->disk_cache_state =3D BTRFS_DC_ERROR; - - spin_unlock(&block_group->lock); - spin_unlock(&trans->transaction->dirty_bgs_lock); - io_ctl->inode =3D NULL; - iput(inode); - } - - return ret; - -} - -int btrfs_wait_cache_io(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path) -{ - return __btrfs_wait_cache_io(block_group->fs_info->tree_root, trans, - block_group, &block_group->io_ctl, - path, block_group->start); -} - -/* - * Write out cached info to an inode. - * - * @inode: freespace inode we are writing out - * @ctl: free space cache we are going to write out - * @block_group: block_group for this cache if it belongs to a block_group - * @io_ctl: holds context for the io - * @trans: the trans handle - * - * This function writes out a free space cache struct to disk for quick re= covery - * on mount. This will return 0 if it was successful in writing the cache= out, - * or an errno if it was not. - */ -static int __btrfs_write_out_cache(struct inode *inode, - struct btrfs_block_group *block_group, - struct btrfs_trans_handle *trans) -{ - struct btrfs_free_space_ctl *ctl =3D block_group->free_space_ctl; - struct btrfs_io_ctl *io_ctl =3D &block_group->io_ctl; - struct extent_state *cached_state =3D NULL; - LIST_HEAD(bitmap_list); - int entries =3D 0; - int bitmaps =3D 0; - int ret; - bool must_iput =3D false; - int i_size; - - if (!i_size_read(inode)) - return -EIO; - - WARN_ON(io_ctl->pages); - ret =3D io_ctl_init(io_ctl, inode, 1); - if (ret) - return ret; - - if (block_group->flags & BTRFS_BLOCK_GROUP_DATA) { - down_write(&block_group->data_rwsem); - spin_lock(&block_group->lock); - if (block_group->delalloc_bytes) { - block_group->disk_cache_state =3D BTRFS_DC_WRITTEN; - spin_unlock(&block_group->lock); - up_write(&block_group->data_rwsem); - BTRFS_I(inode)->generation =3D 0; - ret =3D 0; - must_iput =3D true; - goto out; - } - spin_unlock(&block_group->lock); - } - - /* Lock all pages first so we can lock the extent safely. */ - ret =3D io_ctl_prepare_pages(io_ctl, false); - if (ret) - goto out_unlock; - - btrfs_lock_extent(&BTRFS_I(inode)->io_tree, 0, i_size_read(inode) - 1, - &cached_state); - - io_ctl_set_generation(io_ctl, trans->transid); - - mutex_lock(&ctl->cache_writeout_mutex); - /* Write out the extent entries in the free space cache */ - spin_lock(&ctl->tree_lock); - ret =3D write_cache_extent_entries(io_ctl, block_group, &entries, &bitmap= s, - &bitmap_list); - if (ret) - goto out_nospc_locked; - - /* - * Some spaces that are freed in the current transaction are pinned, - * they will be added into free space cache after the transaction is - * committed, we shouldn't lose them. - * - * If this changes while we are working we'll get added back to - * the dirty list and redo it. No locking needed - */ - ret =3D write_pinned_extent_entries(trans, block_group, io_ctl, &entries); - if (ret) - goto out_nospc_locked; - - /* - * At last, we write out all the bitmaps and keep cache_writeout_mutex - * locked while doing it because a concurrent trim can be manipulating - * or freeing the bitmap. - */ - ret =3D write_bitmap_entries(io_ctl, &bitmap_list); - spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); - if (ret) - goto out_nospc; - - /* Zero out the rest of the pages just to make sure */ - io_ctl_zero_remaining_pages(io_ctl); - - /* Everything is written out, now we dirty the pages in the file. */ - i_size =3D i_size_read(inode); - for (int i =3D 0; i < round_up(i_size, PAGE_SIZE) / PAGE_SIZE; i++) { - u64 dirty_start =3D i * PAGE_SIZE; - u64 dirty_len =3D min_t(u64, dirty_start + PAGE_SIZE, i_size) - dirty_st= art; - - ret =3D btrfs_dirty_folio(BTRFS_I(inode), page_folio(io_ctl->pages[i]), - dirty_start, dirty_len, &cached_state, false); - if (ret < 0) - goto out_nospc; - } - - if (block_group->flags & BTRFS_BLOCK_GROUP_DATA) - up_write(&block_group->data_rwsem); - /* - * Release the pages and unlock the extent, we will flush - * them out later - */ - io_ctl_drop_pages(io_ctl); - io_ctl_free(io_ctl); - - btrfs_unlock_extent(&BTRFS_I(inode)->io_tree, 0, i_size_read(inode) - 1, - &cached_state); - - /* - * at this point the pages are under IO and we're happy, - * The caller is responsible for waiting on them and updating - * the cache and the inode - */ - io_ctl->entries =3D entries; - io_ctl->bitmaps =3D bitmaps; - - ret =3D btrfs_fdatawrite_range(BTRFS_I(inode), 0, (u64)-1); - if (ret) - goto out; - - return 0; - -out_nospc_locked: - cleanup_bitmap_list(&bitmap_list); - spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); - -out_nospc: - cleanup_write_cache_enospc(inode, io_ctl, &cached_state); - -out_unlock: - if (block_group->flags & BTRFS_BLOCK_GROUP_DATA) - up_write(&block_group->data_rwsem); - -out: - io_ctl->inode =3D NULL; - io_ctl_free(io_ctl); - if (ret) { - invalidate_inode_pages2(inode->i_mapping); - BTRFS_I(inode)->generation =3D 0; - } - btrfs_update_inode(trans, BTRFS_I(inode)); - if (must_iput) - iput(inode); - return ret; -} - -int btrfs_write_out_cache(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path) -{ - struct btrfs_fs_info *fs_info =3D trans->fs_info; - struct inode *inode; - int ret =3D 0; - - spin_lock(&block_group->lock); - if (block_group->disk_cache_state < BTRFS_DC_SETUP) { - spin_unlock(&block_group->lock); - return 0; - } - spin_unlock(&block_group->lock); - - inode =3D lookup_free_space_inode(block_group, path); - if (IS_ERR(inode)) - return 0; - - ret =3D __btrfs_write_out_cache(inode, block_group, trans); - if (ret) { - btrfs_debug(fs_info, - "failed to write free space cache for block group %llu error %d", - block_group->start, ret); - spin_lock(&block_group->lock); - block_group->disk_cache_state =3D BTRFS_DC_ERROR; - spin_unlock(&block_group->lock); - - block_group->io_ctl.inode =3D NULL; - iput(inode); - } - - /* - * if ret =3D=3D 0 the caller is expected to call btrfs_wait_cache_io - * to wait for IO and put the inode - */ - - return ret; -} - static inline unsigned long offset_to_bit(u64 bitmap_start, u32 unit, u64 offset) { diff --git a/fs/btrfs/free-space-cache.h b/fs/btrfs/free-space-cache.h index 53fe8e293af1..2432f1783f47 100644 --- a/fs/btrfs/free-space-cache.h +++ b/fs/btrfs/free-space-cache.h @@ -105,23 +105,13 @@ int __init btrfs_free_space_init(void); void __cold btrfs_free_space_exit(void); struct inode *lookup_free_space_inode(struct btrfs_block_group *block_grou= p, struct btrfs_path *path); -int create_free_space_inode(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path); int btrfs_remove_free_space_inode(struct btrfs_trans_handle *trans, struct inode *inode, struct btrfs_block_group *block_group); =20 int btrfs_truncate_free_space_cache(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, struct inode *inode); int load_free_space_cache(struct btrfs_block_group *block_group); -int btrfs_wait_cache_io(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path); -int btrfs_write_out_cache(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path); =20 void btrfs_init_free_space_ctl(struct btrfs_block_group *block_group, struct btrfs_free_space_ctl *ctl); diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 3668cbc7598e..9c395d075a65 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -9364,15 +9364,6 @@ int btrfs_prealloc_file_range(struct inode *inode, i= nt mode, NULL); } =20 -int btrfs_prealloc_file_range_trans(struct inode *inode, - struct btrfs_trans_handle *trans, int mode, - u64 start, u64 num_bytes, u64 min_size, - loff_t actual_len, u64 *alloc_hint) -{ - return __btrfs_prealloc_file_range(inode, mode, start, num_bytes, - min_size, actual_len, alloc_hint, trans); -} - /* * NOTE: in case you are adding MAY_EXEC check for directories: * we are marking them with IOP_FASTPERM_MAY_EXEC, allowing path lookup to diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index da54db75e7a9..630a7ad8f8e1 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -3357,7 +3357,7 @@ static int delete_block_group_cache(struct btrfs_bloc= k_group *block_group, goto out; } =20 - ret =3D btrfs_truncate_free_space_cache(trans, block_group, inode); + ret =3D btrfs_truncate_free_space_cache(trans, inode); =20 btrfs_end_transaction(trans); btrfs_btree_balance_dirty(fs_info); diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 6a36d29406c3..e3ab0f705cb1 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -380,7 +380,6 @@ static noinline int join_transaction(struct btrfs_fs_in= fo *fs_info, INIT_LIST_HEAD(&cur_trans->switch_commits); INIT_LIST_HEAD(&cur_trans->dirty_bgs); INIT_LIST_HEAD(&cur_trans->dropped_roots); - mutex_init(&cur_trans->cache_write_mutex); spin_lock_init(&cur_trans->dirty_bgs_lock); INIT_LIST_HEAD(&cur_trans->deleted_bgs); spin_lock_init(&cur_trans->dropped_roots_lock); diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 8245a58587c0..d6a2eafd162e 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -80,12 +80,6 @@ struct btrfs_transaction { struct list_head dropped_roots; struct extent_io_tree pinned_extents; =20 - /* - * we need to make sure block group deletion doesn't race with - * free space cache writeout. This mutex keeps them from stomping - * on each other - */ - struct mutex cache_write_mutex; spinlock_t dirty_bgs_lock; /* Protected by spin lock fs_info->unused_bgs_lock. */ struct list_head deleted_bgs; --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 2E3A3370AC1 for ; Sun, 13 Sep 2026 21:21:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334495; cv=none; b=KrUKBkiWdAclmnxQJTLo7KieQCa/NefWsHrLyBT0ja+e7NVt9NouABfDfiKu4t5BlRDMzuLz1IBJSip4+rnRSbnV8/VS2jTHkrlAgL9yGuXXBasAnaiXPX30txOKT/B1TV33m9h5u7G8YKS4Ssc8WeQp/49Epjp7OphwKnJVor4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334495; c=relaxed/simple; bh=7Tr5awOvN8ARMx50qRV4E1m+atUWaPqTPP3CIfJTWL0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eKwCqxnnZ/Bl0EBt9HvOw/At3QrAfKFraEMqzkceFmMQB6+DO/BkhfYhmo81X6uR0lVlrXzHY0flrcF2L5KtF/dZm7kQ21bV86oF+MdgJRxNqaDUjkxxgLvOrYhKLpfsagmTk3nE27CRqLYhPlOMSXVP3zezsZl/bbKAxnGbB+c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=CN72aqt8; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=aYbtVMj7; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="CN72aqt8"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="aYbtVMj7" Received: from pps.filterd (m0167073.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKXfQh652189 for ; Sun, 13 Sep 2026 17:21:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=IRD4 cvB/PgbqUg8e65DYvGtkTJfIxTG28U1epEHrg/Y=; b=CN72aqt8PuaYKVboi7na YIn5c07SEL/CzSXJlChDX3benrPGM/Z0tvRDEbeZd25IcEHszE67f0qOC11KE3iD EpEZTj2vW9gxDeLFIgBfmBcfgvzpCd57fgtMxfZP0LeXxYhG5rKtg9Ly+6RDrs/m ykp5Jel08AhTTrE+uBJ3wIzcQNXy1+JnNdZZ/YbQcg+f5QgnJqXixUvicdekH1U9 /WhxL0QmzFooVnJc8OCfcawHT7vw7F9Fe4ydT3ASZ9WmS0fWNBwpdDCZUrUIZRoy S1BErUJe27L5hEqsFj5x/+q+DxMGJV/k7IumMWZhiHPjLoipPFZAFx9OrSTGfq8n Pw== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gp2mjg7wk-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:31 -0400 (EDT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-93a07b5b5efso211105585a.1 for ; Sun, 13 Sep 2026 14:21:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334491; x=1789939291; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=IRD4cvB/PgbqUg8e65DYvGtkTJfIxTG28U1epEHrg/Y=; b=aYbtVMj7TNfYqbSfR9pk9ons+qxrn43s/aSVYY7bWPUPhehcIuCGHMAPvQX8GEmU5P Nez2JcFoFV0nPPuBUPFreXi8PkYdRNpIi1/qDev8rJ+wm2H2HDCd4U+JjrXSstWA5kaI tGs2jdCaBKrfUngcal2sZCwPEpGowyg9fekcBpic7AEDosS4KUc6EZQCCf50/lPNdzIO Fra6poWRWbBq8gjlYPbBkiE9hLvCXdedzRsHOSAh0UiYyg+ansP6sXF3CZJHvXlDWyNI lyHLnpqkckSXkyefgaoHhLAyZXZlndErnMB1AYvh/U+ZFfBhMT6UeBnruQowJwkzyDOz QFvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334491; x=1789939291; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=IRD4cvB/PgbqUg8e65DYvGtkTJfIxTG28U1epEHrg/Y=; b=G0zLQSfSeY/sUeeyw7DxNhH4dLnMkmezjGPQcyM3939Aq81fpblbtap4sWMd6mQTVE 3YGd7WRYrt6ptJDyW6hUzEl79+Jppq1aGdv89aCXPhFvJ9E5iuQbBZ/uLb5sP9d2/YB1 FwlgiVqaGgp4p/BTMIOlgZYglZ3oVTDy87CaVGBq+QfhAZNWx1Iz8R7ZC6knMH6DohH6 ZOu2G9j0lLtkR2f2/ztCGjeMK+WEQl/TSD2HtJI71mG4RgispvCpqdQPY2wtVufgdWGF du+w2G4QwrgiFaICHqReL7OGFwC9Jh7dXBRNtERj4FFUcCDu9ZrUo64PeSMNGB/+sJSe RugA== X-Forwarded-Encrypted: i=1; AKwUvBw+G1i5tDO4P+TuiFhW8bkHuhpAf2HY00IAUnO9VK+0/LKJmWTGMnIn09pQvYEjjbreVte2HJ6PFe/YUKs=@vger.kernel.org X-Gm-Message-State: AFuF++mK2trqApJsSIseg8CdY+1AuJkCN/jpEpDU7C4mstDi9yKISZ/r h52vRxWGnROG6M/PsTzohHm7QuYJsvBVcJX/j6hEtDLmS/9yj6akw1jiN1/M7JLiLAQEbyhGo8Q ZJOgy/mg2biAnApfdgEsJXKd4qThx+DmbOxHkxQQXFsdLFIYHlkczPo02fGmlGw== X-Gm-Gg: AYBFou2/skKGqpFTtjLXyNN5nmtwOj8165NdFseUEB0F9eGOdr9aAYCMq/nxXiZPec0 7VS46BTjXG5XdzNaesW/acO4mJjnqV9diIrdKgdTY61eYRiDg+U7wRzY/IS6OLedqe4KCh0JYAa Vz++esNF44bfshXC7Brxm45heUogRPIp9HscIIsoax8wZfgIFaZIvJpx99xirCiugC//1T5Lg6K VWZLMFbFxXBimOq20Gir7lA86fVetss2I2B3+ZhYakE3NFimSZU1lxK697hkWCE/ekGANn7pdCJ 9To+hzoTYS3H664dBW9htYf+OM8ftHDO+rpBKRPwPki0mLtW/ncW2Pi7etvG787QDvWQDAAG6z+ twjREzpJZYZRT6pYhVtwZwssngWdQ+Mtp8+EvRoZerkSfrJkZRUAQkA== X-Received: by 2002:ac8:5a94:0:b0:530:fa1b:1281 with SMTP id d75a77b69052e-530fb6aac99mr41722741cf.38.1789334491192; Sun, 13 Sep 2026 14:21:31 -0700 (PDT) X-Received: by 2002:ac8:5a94:0:b0:530:fa1b:1281 with SMTP id d75a77b69052e-530fb6aac99mr41722591cf.38.1789334490784; Sun, 13 Sep 2026 14:21:30 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:30 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:17 -0400 Subject: [PATCH v2 05/16] btrfs: drop the transaction handle from the prealloc helpers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-5-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=4704; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=7Tr5awOvN8ARMx50qRV4E1m+atUWaPqTPP3CIfJTWL0=; b=zO4kggQ/Z2SBWjDhsYedxSqB2KI4fLyZsw9A+ImtzB18HzhWhX6a4m2JwDWkzzGnRirchb8at /mX8xBkwsiSBMGZIX6lZ0NxEayNWJ4rJGw+lwnZg9t2OBVHHJVdOIR1 X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=NfpzRGD4 c=1 sm=1 tr=0 ts=6aa713db cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=jHxIr1HyPKZ_Q5_91PL3:22 a=u1qPvHribVpbYRjuRIMA:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX6Gnb6wQSRMQf 2L0YDkpTzTSnv36a+WzVCVUr4/QjhJeOLWWVENOLliqNPgzHV5SLracxtQSosI7Ktxg/4ZFJwn4 N20Wr55k4j/YXO3TqA6NmDCZsVYcDw/MhC1q+JxPmDUqoxARSLAYwCmeOID3/woC9CkKaayb/rO sT3eLbn+jj4PjqDz5dZ9HjF72pGYze4vQL8iSCoiuwJzJ+HtWhvXwss3Q31NuuTL7yOJ5FT8nAr Azhmi5Pf2tokR6y4eD+zqxMJ2AAKlt8X5/9zXaAGh+axIZWzajy3sKyqw+ad1QSYGhI7M3B03Iv x+ZRHjlmG//nRS+p/1ERipBzjGvLVut8TfqcmZSZykaeZp+fSfue43MVZa6MK3JukcFhM0K7HSz kAWl4gjs4uPtjr9bgGGGSK2mAAL7RgX9iwPldeNgpFIMTYiCta8XbcrGVB9fBv1o5yWjgHRD9yM RznoXGjUvCXzdbB6ERA== X-Proofpoint-GUID: L-e3K6-HI5KwsUMXYbGCKUBEAIRgFx8k X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfXw1qveImRkXEg /OVAhxFGqY/i+Al5p7YUfgOS06Lfqj7oJQmxTuAZ5uKxfmKhkAVH5eY8CN8aUNQPTAWW0n/3ofR frthJnUbdp4X8FDtBksSmleln0DG3ZDaDj/sGxupJCrfzxd3F1K8 X-Proofpoint-ORIG-GUID: L-e3K6-HI5KwsUMXYbGCKUBEAIRgFx8k X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=10 suspectscore=0 malwarescore=0 spamscore=0 bulkscore=10 clxscore=1015 adultscore=0 lowpriorityscore=10 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 The v1 space cache created its inode during the transaction commit, and btrfs_prealloc_file_range_trans() existed so that preallocation could reuse the open handle. It was the only caller passing a transaction, so __btrfs_prealloc_file_range() and insert_prealloc_file_extent() now always start their own. Fold the wrapper into btrfs_prealloc_file_range() and drop the parameter. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/inode.c | 47 ++++++++++------------------------------------- 1 file changed, 10 insertions(+), 37 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 9c395d075a65..0539f27776e1 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -9132,14 +9132,13 @@ static int btrfs_symlink(struct mnt_idmap *idmap, s= truct inode *dir, } =20 static struct btrfs_trans_handle *insert_prealloc_file_extent( - struct btrfs_trans_handle *trans_in, struct btrfs_inode *inode, struct btrfs_key *ins, u64 file_offset) { struct btrfs_file_extent_item stack_fi; struct btrfs_replace_extent_info extent_info; - struct btrfs_trans_handle *trans =3D trans_in; + struct btrfs_trans_handle *trans; struct btrfs_path *path; u64 start =3D ins->objectid; u64 len =3D ins->offset; @@ -9160,15 +9159,6 @@ static struct btrfs_trans_handle *insert_prealloc_fi= le_extent( if (ret < 0) return ERR_PTR(ret); =20 - if (trans) { - ret =3D insert_reserved_file_extent(trans, inode, - file_offset, &stack_fi, - true, qgroup_released); - if (ret) - goto free_qgroup; - return trans; - } - extent_info.disk_offset =3D start; extent_info.disk_len =3D len; extent_info.data_offset =3D 0; @@ -9208,12 +9198,12 @@ static struct btrfs_trans_handle *insert_prealloc_f= ile_extent( return ERR_PTR(ret); } =20 -static int __btrfs_prealloc_file_range(struct inode *inode, int mode, - u64 start, u64 num_bytes, u64 min_size, - loff_t actual_len, u64 *alloc_hint, - struct btrfs_trans_handle *trans) +int btrfs_prealloc_file_range(struct inode *inode, int mode, + u64 start, u64 num_bytes, u64 min_size, + loff_t actual_len, u64 *alloc_hint) { struct btrfs_fs_info *fs_info =3D inode_to_fs_info(inode); + struct btrfs_trans_handle *trans; struct extent_map *em; struct btrfs_root *root =3D BTRFS_I(inode)->root; struct btrfs_key ins; @@ -9223,11 +9213,8 @@ static int __btrfs_prealloc_file_range(struct inode = *inode, int mode, u64 cur_bytes; u64 last_alloc =3D (u64)-1; int ret =3D 0; - bool own_trans =3D true; u64 end =3D start + num_bytes - 1; =20 - if (trans) - own_trans =3D false; while (num_bytes > 0) { cur_bytes =3D min_t(u64, num_bytes, SZ_256M); cur_bytes =3D max(cur_bytes, min_size); @@ -9253,8 +9240,8 @@ static int __btrfs_prealloc_file_range(struct inode *= inode, int mode, clear_offset +=3D ins.offset; =20 last_alloc =3D ins.offset; - trans =3D insert_prealloc_file_extent(trans, BTRFS_I(inode), - &ins, cur_offset); + trans =3D insert_prealloc_file_extent(BTRFS_I(inode), &ins, + cur_offset); /* * Now that we inserted the prealloc extent we can finally * decrement the number of reservations in the block group. @@ -9326,8 +9313,7 @@ static int __btrfs_prealloc_file_range(struct inode *= inode, int mode, range_start, range_end - range_start); if (ret) { btrfs_abort_transaction(trans, ret); - if (own_trans) - btrfs_end_transaction(trans); + btrfs_end_transaction(trans); break; } =20 @@ -9339,15 +9325,11 @@ static int __btrfs_prealloc_file_range(struct inode= *inode, int mode, =20 if (unlikely(ret)) { btrfs_abort_transaction(trans, ret); - if (own_trans) - btrfs_end_transaction(trans); + btrfs_end_transaction(trans); break; } =20 - if (own_trans) { - btrfs_end_transaction(trans); - trans =3D NULL; - } + btrfs_end_transaction(trans); } if (clear_offset < end) btrfs_free_reserved_data_space(BTRFS_I(inode), NULL, clear_offset, @@ -9355,15 +9337,6 @@ static int __btrfs_prealloc_file_range(struct inode = *inode, int mode, return ret; } =20 -int btrfs_prealloc_file_range(struct inode *inode, int mode, - u64 start, u64 num_bytes, u64 min_size, - loff_t actual_len, u64 *alloc_hint) -{ - return __btrfs_prealloc_file_range(inode, mode, start, num_bytes, - min_size, actual_len, alloc_hint, - NULL); -} - /* * NOTE: in case you are adding MAY_EXEC check for directories: * we are marking them with IOP_FASTPERM_MAY_EXEC, allowing path lookup to --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 2AD59390981 for ; Sun, 13 Sep 2026 21:21:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334501; cv=none; b=gBYSdunqRV206tiJ1Yj5/wcZFNfArlsK21hlpm7eu1TzDnyJZ6LBndkFFXMA33o1aIzm3Sy0hgyK3xK0WvAHit2R3w5S5cMRn7nHiu+JZvqWWeRF3RkXqljUEyXFFsp08m+MIJb2z9kHM/Zupsp66K5HVhPQpJJiDSzYpMxP+zs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334501; c=relaxed/simple; bh=KFOg608BjpkD7O/zHWODlTzl6r5l91mwicQv0vSkL48=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=j8VwE3SRF24fO2Ap1ulyiT4mjmicwQhDC3nbBh3mex13M6cL5SBlm/AMt/10s51oJMEspof5aZChWXzeEIJNottVzjoE4Rvx+tw1SWNnDwPFO+XbGWX3WjGjxpvTCJF2uYn9slylplJTpKHTmoELc9TbH8nItGWuvCHWrCV7IrM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=q2OWJzXI; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=xilQjYXX; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="q2OWJzXI"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="xilQjYXX" Received: from pps.filterd (m0167073.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKZQcZ655972 for ; Sun, 13 Sep 2026 17:21:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=+tcO GZUZMy+QDFxpeC0pyUy0Od3br5EQafMTDc33pMc=; b=q2OWJzXIG1bMjjM5CmKR s5ujM4UngC4fGXgdkMAzzbcfM9MU6/xBHCT7/skthYwKo234bsQ3V4uZiytl4hCl Ss/xMBxgofq27X1MDsBbk2Wc6Ik0WPB0IoOmqnxhNIlMZoLRmXqyr/87fw12MWx5 e4gcAxt4z/Q75YBpk27+C5iFF0pB/RH4BM9LtPGOyQqqRdqagw4aQAYBEgAe6XaI ytuLIKOTFbFLwtETCegBHIA0fO+M0Gg3KcsOcMgICYHMSaZz5lWkHj879DlfsRn8 g8+dDP294KhXHjS7iFDGs3p+8pfJEIY+ehkXq5Fh+USo5fNdPeZPtFcvRolOJSHK Og== Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gp2mjg7wq-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:33 -0400 (EDT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-90c8da50f8dso73019346d6.2 for ; Sun, 13 Sep 2026 14:21:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334493; x=1789939293; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=+tcOGZUZMy+QDFxpeC0pyUy0Od3br5EQafMTDc33pMc=; b=xilQjYXXGHw3PNaJOrYrfdvtG9Kq5L0xDteRC164bA+wZ6zCQfPw79qjbqpNYX1nxl t9hzBzVl+DRoi06p4E71YZcUTlCg+p33EEaCHbQIwX1R4yzaagbflos5KOaEdiaDbkV4 oQrXUOpIOXC5IfPyk718pnbO81HkShOceSDEA00Xnxz7+3HqeCvttoMBPTJk6hmVdBlk wRhRA03bcVRxblns0ygnsJXvIvV5bWs7VXF+Ua/Z2DXTBE6TmRBVQl8wbnXZa8tEc4Qr jBzCP1Ngxrq5afUaB+75J4KiGl+yv/+1njos733Y+8Ex3KBYT842AQP3rOKeiUmHD4oF GZxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334493; x=1789939293; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=+tcOGZUZMy+QDFxpeC0pyUy0Od3br5EQafMTDc33pMc=; b=XfBIQyxU0hDv1b+EbvvrWHXfRVXbPaZAxgfYhcpJ8iHgaUpFRTzy02MNvXFBMl0sRh BOF8V8EutgD+k/m0qtsFzDO+vqbnA8Esc0y1uvbwUXioEjfHf+vvIWp2lqZYaQstdJM8 2nWY41BeoZCMQICaUAfdSC1PmAuu3QUi+KmXdKxGAO98FSzq7ZbG2ZdahF+Rw09EL49R DUMquYxfNARly61lu6EZyCGw5y6Q1OF+Fxg1J6H+MZ5BzuHcvJfRDjRLJvo/0jcYh9Cu pIBjs1l55SJrzMtUhyr5l9xMdXdESM2gxF+fxJsyQ9iVDyS9O9wk/byzGpdva+x9SpXS GQFQ== X-Forwarded-Encrypted: i=1; AKwUvBwCkfPqR89ymO5c5BAqle0kxoHTaEEDYuOeFC0J+XoQ8wRZbf6XF5AWl05xMqbvRf+u8iPjeGSgrtupOAE=@vger.kernel.org X-Gm-Message-State: AFuF++lUtB+DRQhhImEoAa4R5VueOKK1Atf9GudCrVpPlEBubIlF9h/Q LLKwi2K4fsQrJ/bFcSum6Y1JGXDDpDLUjNUzJoOsILw7uNUe31MQBn932gVDGAz/EhkifNk5zAg b6dly0yqBZSGRKRjYFvk6gMuPgS0YCBg7LWQBgYvP6c6y2L5vru7dpP0HmnsW6g== X-Gm-Gg: AYBFou0wEk0lgRANtGMVMhLCEssvw3dkH6Xms2qvmUeQVrTW3sc9DLCPtqsjLtTgdl6 hVk1Wj0ADC82ms4I59PhYfPG+v4MWkHT3TDSbZsZSQ971RwXMtKCqpKSKjCrC/v2h5SzJBCktI7 o1BGKkLeJzeVXCsxWFz7uBs2NnycfEQQApQXoT3YUDYxE43gc6x6jUCOsLplHHsbI/HQp6uycls gxOt5IVkPHO/vjLiG3fEMcZdLnHRIv7qV1RePimM/l0m7Sp3MxP7XeIdIO5+xQi8sESeEPd8gJi l4s5uBzuxHGqI0ouRmRDJAxfxaMrp0LTAhOUFYThKJaWOAkUC9Y7wP617rC4Okj83FRu+UWNTC6 8/vqCznzYUHL/b9X7ZYyYV9E+S64IKSpEOK8ugB6QoWJWtTrdxHIIZw== X-Received: by 2002:a05:6214:5a04:b0:90e:8a98:f218 with SMTP id 6a1803df08f44-9121d903764mr134502996d6.9.1789334492442; Sun, 13 Sep 2026 14:21:32 -0700 (PDT) X-Received: by 2002:a05:6214:5a04:b0:90e:8a98:f218 with SMTP id 6a1803df08f44-9121d903764mr134502666d6.9.1789334491785; Sun, 13 Sep 2026 14:21:31 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:31 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:18 -0400 Subject: [PATCH v2 06/16] btrfs: remove the v1 space cache load path Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-6-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=20021; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=KFOg608BjpkD7O/zHWODlTzl6r5l91mwicQv0vSkL48=; b=dSsvQ3Y5ZZf8Vfp6y8nSR2xG6iRyr9eqwTqLI/pZJJ7bokq5lvasYNeXoDxlqszj+muZSrNL6 dzc4N/0ms61CBv0IBEey8vIX0ARYU9QNTvBD8Hv/OU5GV7mqe7TjaTS X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=NfpzRGD4 c=1 sm=1 tr=0 ts=6aa713dd cx=c_pps a=wEM5vcRIz55oU/E2lInRtA==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=jHxIr1HyPKZ_Q5_91PL3:22 a=P5Dk6VCOSKDVTHAqsQAA:9 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX5rB+R7PBoHLM BXGRcf5Df7oN2cWoqo/Q3PTYDkOkjE8tEGPOYClPViwEK2H90F/bR4sS/6+b7gk7aMWYuXo+vXQ 3Yv+N7Rxl4XC4UqANO2ws2tj0v3iJOJaeA3rGKuy8s+C2zK4JaWz+3b3AXxz3EaN8ZKUB4xTkZj geLCkCXUDZ0AeBr5Z2TWFr/0Qn/+C17LYJ8/S40Lp7ER7sH/us23DaTi/r2Kh2tIlf3bD6WXoOy jfIYfvm3+Y2ZIc88yOuQ/MgAxMXdnC+GfbvsY1KP9h04mTPaoW4NFIInrhCukLrVdLAT4a0E0H+ kY2M3JTFCnEpdkf62XRx3TWqcytz2h9RzYFsT+ysjdv1u2ywUk9cDba1NiNZzESdo2NUuWCy86V lmTSznyCaM1mmCsRH/4dqvSKqSIuYc2Ijh4nbf+yOcHVM6pooiWjgDZcPdz3dRwjwWyHJ2KngBW 7FnkPyfru9FcUCytwVA== X-Proofpoint-GUID: pjekVOVu5lVW4HtZq2zfkKPks-gXD1St X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX0q/MZL05unqG 47zKIkX3naKZfDK5xLSOcWEt0VsjCKYHVutCMC45ewouafbo99Q6AzOgJ6K+Uh81xEsG1Ufkq5x m93VPHmatP3A1WPVFipfkOd9PM1ghgvMsdQyRiIJAoX9o+h590vx X-Proofpoint-ORIG-GUID: pjekVOVu5lVW4HtZq2zfkKPks-gXD1St X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=10 suspectscore=0 malwarescore=0 spamscore=0 bulkscore=10 clxscore=1015 adultscore=0 lowpriorityscore=10 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 Nothing writes a v1 space cache any more, and since commit 545e560a5b0f ("btrfs: disable v1 space cache") the mount option can't be enabled to read one either. Remove load_free_space_cache(), its io_ctl helpers and struct btrfs_io_ctl. Drop the gfp constraint on the inode mapping as well, it only covered the cache's page cache allocations. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/block-group.c | 18 +- fs/btrfs/free-space-cache.c | 565 ----------------------------------------= ---- fs/btrfs/free-space-cache.h | 15 -- 3 files changed, 1 insertion(+), 597 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 5790396482db..47d48b4abf17 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -904,22 +904,6 @@ static noinline void caching_thread(struct btrfs_work = *work) down_read(&fs_info->commit_root_sem); =20 load_block_group_size_class(caching_ctl); - if (btrfs_test_opt(fs_info, SPACE_CACHE)) { - ret =3D load_free_space_cache(block_group); - if (ret =3D=3D 1) { - ret =3D 0; - goto done; - } - - /* - * We failed to load the space cache, set ourselves to - * CACHE_STARTED and carry on. - */ - spin_lock(&block_group->lock); - block_group->cached =3D BTRFS_CACHE_STARTED; - spin_unlock(&block_group->lock); - wake_up(&caching_ctl->wait); - } =20 /* * If we are in the transaction that populated the free space tree we @@ -933,7 +917,7 @@ static noinline void caching_thread(struct btrfs_work *= work) ret =3D btrfs_load_free_space_tree(caching_ctl); else ret =3D load_extent_tree_free(caching_ctl); -done: + spin_lock(&block_group->lock); block_group->caching_ctl =3D NULL; block_group->cached =3D ret ? BTRFS_CACHE_ERROR : BTRFS_CACHE_FINISHED; diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 336b546b0a94..a25c4db561b4 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include "extent-tree.h" @@ -23,7 +22,6 @@ #include "space-info.h" #include "block-group.h" #include "discard.h" -#include "subpage.h" #include "inode-item.h" #include "accessors.h" #include "file-item.h" @@ -57,11 +55,6 @@ static void bitmap_clear_bits(struct btrfs_free_space_ct= l *ctl, struct btrfs_free_space *info, u64 offset, u64 bytes, bool update_stats); =20 -static void btrfs_crc32c_final(u32 crc, u8 *result) -{ - put_unaligned_le32(~crc, result); -} - static void __btrfs_remove_free_space_cache(struct btrfs_free_space_ctl *c= tl) { struct btrfs_free_space *info; @@ -123,10 +116,6 @@ static struct inode *__lookup_free_space_inode(struct = btrfs_root *root, if (IS_ERR(inode)) return ERR_CAST(inode); =20 - mapping_set_gfp_mask(inode->vfs_inode.i_mapping, - mapping_gfp_constraint(inode->vfs_inode.i_mapping, - ~(__GFP_FS | __GFP_HIGHMEM))); - return &inode->vfs_inode; } =20 @@ -262,226 +251,6 @@ int btrfs_truncate_free_space_cache(struct btrfs_tran= s_handle *trans, return ret; } =20 -static void readahead_cache(struct inode *inode) -{ - struct file_ra_state ra; - pgoff_t last_index; - - file_ra_state_init(&ra, inode->i_mapping); - last_index =3D (i_size_read(inode) - 1) >> PAGE_SHIFT; - - page_cache_sync_readahead(inode->i_mapping, &ra, NULL, 0, last_index); -} - -static int io_ctl_init(struct btrfs_io_ctl *io_ctl, struct inode *inode, - int write) -{ - int num_pages; - - num_pages =3D DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); - - /* Make sure we can fit our crcs and generation into the first page */ - if (write && (num_pages * sizeof(u32) + sizeof(u64)) > PAGE_SIZE) - return -ENOSPC; - - memset(io_ctl, 0, sizeof(struct btrfs_io_ctl)); - - io_ctl->pages =3D kzalloc_objs(struct page *, num_pages, GFP_NOFS); - if (!io_ctl->pages) - return -ENOMEM; - - io_ctl->num_pages =3D num_pages; - io_ctl->fs_info =3D inode_to_fs_info(inode); - io_ctl->inode =3D inode; - - return 0; -} -ALLOW_ERROR_INJECTION(io_ctl_init, ERRNO); - -static void io_ctl_free(struct btrfs_io_ctl *io_ctl) -{ - kfree(io_ctl->pages); - io_ctl->pages =3D NULL; -} - -static void io_ctl_unmap_page(struct btrfs_io_ctl *io_ctl) -{ - if (io_ctl->cur) { - io_ctl->cur =3D NULL; - io_ctl->orig =3D NULL; - } -} - -static void io_ctl_map_page(struct btrfs_io_ctl *io_ctl, int clear) -{ - ASSERT(io_ctl->index < io_ctl->num_pages); - io_ctl->page =3D io_ctl->pages[io_ctl->index++]; - io_ctl->cur =3D page_address(io_ctl->page); - io_ctl->orig =3D io_ctl->cur; - io_ctl->size =3D PAGE_SIZE; - if (clear) - clear_page(io_ctl->cur); -} - -static void io_ctl_drop_pages(struct btrfs_io_ctl *io_ctl) -{ - int i; - - io_ctl_unmap_page(io_ctl); - - for (i =3D 0; i < io_ctl->num_pages; i++) { - if (io_ctl->pages[i]) { - unlock_page(io_ctl->pages[i]); - put_page(io_ctl->pages[i]); - } - } -} - -static int io_ctl_prepare_pages(struct btrfs_io_ctl *io_ctl, bool uptodate) -{ - struct folio *folio; - struct inode *inode =3D io_ctl->inode; - gfp_t mask =3D btrfs_alloc_write_mask(inode->i_mapping); - int i; - - for (i =3D 0; i < io_ctl->num_pages; i++) { - int ret; - - folio =3D __filemap_get_folio(inode->i_mapping, i, - FGP_LOCK | FGP_ACCESSED | FGP_CREAT, - mask); - if (IS_ERR(folio)) { - io_ctl_drop_pages(io_ctl); - return PTR_ERR(folio); - } - - ret =3D set_folio_extent_mapped(folio); - if (ret < 0) { - folio_unlock(folio); - folio_put(folio); - io_ctl_drop_pages(io_ctl); - return ret; - } - - io_ctl->pages[i] =3D &folio->page; - if (uptodate && !folio_test_uptodate(folio)) { - btrfs_read_folio(NULL, folio); - folio_lock(folio); - if (folio->mapping !=3D inode->i_mapping) { - btrfs_err(BTRFS_I(inode)->root->fs_info, - "free space cache page truncated"); - io_ctl_drop_pages(io_ctl); - return -EIO; - } - if (!folio_test_uptodate(folio)) { - btrfs_err(BTRFS_I(inode)->root->fs_info, - "error reading free space cache"); - io_ctl_drop_pages(io_ctl); - return -EIO; - } - } - } - - for (i =3D 0; i < io_ctl->num_pages; i++) - clear_page_dirty_for_io(io_ctl->pages[i]); - - return 0; -} - -static int io_ctl_check_generation(struct btrfs_io_ctl *io_ctl, u64 genera= tion) -{ - u64 cache_gen; - - /* - * Skip the crc area. If we don't check crcs then we just have a 64bit - * chunk at the front of the first page. - */ - io_ctl->cur +=3D sizeof(u32) * io_ctl->num_pages; - io_ctl->size -=3D sizeof(u64) + (sizeof(u32) * io_ctl->num_pages); - - cache_gen =3D get_unaligned_le64(io_ctl->cur); - if (cache_gen !=3D generation) { - btrfs_err_rl(io_ctl->fs_info, - "space cache generation (%llu) does not match inode (%llu)", - cache_gen, generation); - io_ctl_unmap_page(io_ctl); - return -EIO; - } - io_ctl->cur +=3D sizeof(u64); - return 0; -} - -static int io_ctl_check_crc(struct btrfs_io_ctl *io_ctl, int index) -{ - u32 *tmp, val; - u32 crc =3D ~(u32)0; - unsigned offset =3D 0; - - if (index >=3D io_ctl->num_pages) - return -EIO; - - if (index =3D=3D 0) - offset =3D sizeof(u32) * io_ctl->num_pages; - - tmp =3D page_address(io_ctl->pages[0]); - tmp +=3D index; - val =3D *tmp; - - io_ctl_map_page(io_ctl, 0); - crc =3D crc32c(crc, io_ctl->orig + offset, PAGE_SIZE - offset); - btrfs_crc32c_final(crc, (u8 *)&crc); - if (val !=3D crc) { - btrfs_err_rl(io_ctl->fs_info, - "csum mismatch on free space cache"); - io_ctl_unmap_page(io_ctl); - return -EIO; - } - - return 0; -} - -static int io_ctl_read_entry(struct btrfs_io_ctl *io_ctl, - struct btrfs_free_space *entry, u8 *type) -{ - struct btrfs_free_space_entry *e; - int ret; - - if (!io_ctl->cur) { - ret =3D io_ctl_check_crc(io_ctl, io_ctl->index); - if (ret) - return ret; - } - - e =3D io_ctl->cur; - entry->offset =3D get_unaligned_le64(&e->offset); - entry->bytes =3D get_unaligned_le64(&e->bytes); - *type =3D e->type; - io_ctl->cur +=3D sizeof(struct btrfs_free_space_entry); - io_ctl->size -=3D sizeof(struct btrfs_free_space_entry); - - if (io_ctl->size >=3D sizeof(struct btrfs_free_space_entry)) - return 0; - - io_ctl_unmap_page(io_ctl); - - return 0; -} - -static int io_ctl_read_bitmap(struct btrfs_io_ctl *io_ctl, - struct btrfs_free_space *entry) -{ - int ret; - - ret =3D io_ctl_check_crc(io_ctl, io_ctl->index); - if (ret) - return ret; - - copy_page(entry->bitmap, io_ctl->cur); - io_ctl_unmap_page(io_ctl); - - return 0; -} - static void recalculate_thresholds(struct btrfs_free_space_ctl *ctl) { struct btrfs_block_group *block_group =3D ctl->block_group; @@ -527,340 +296,6 @@ static void recalculate_thresholds(struct btrfs_free_= space_ctl *ctl) div_u64(extent_bytes, sizeof(struct btrfs_free_space)); } =20 -static int __load_free_space_cache(struct btrfs_root *root, struct inode *= inode, - struct btrfs_free_space_ctl *ctl, - struct btrfs_path *path, u64 offset) -{ - struct btrfs_fs_info *fs_info =3D root->fs_info; - struct btrfs_free_space_header *header; - struct extent_buffer *leaf; - struct btrfs_io_ctl io_ctl; - struct btrfs_key key; - struct btrfs_free_space *e, *n; - LIST_HEAD(bitmaps); - u64 num_entries; - u64 num_bitmaps; - u64 generation; - u8 type; - int ret =3D 0; - - /* Nothing in the space cache, goodbye */ - if (!i_size_read(inode)) - return 0; - - key.objectid =3D BTRFS_FREE_SPACE_OBJECTID; - key.type =3D 0; - key.offset =3D offset; - - ret =3D btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - return 0; - else if (ret > 0) { - btrfs_release_path(path); - return 0; - } - - ret =3D -1; - - leaf =3D path->nodes[0]; - header =3D btrfs_item_ptr(leaf, path->slots[0], - struct btrfs_free_space_header); - num_entries =3D btrfs_free_space_entries(leaf, header); - num_bitmaps =3D btrfs_free_space_bitmaps(leaf, header); - generation =3D btrfs_free_space_generation(leaf, header); - btrfs_release_path(path); - - if (!BTRFS_I(inode)->generation) { - btrfs_info(fs_info, - "the free space cache file (%llu) is invalid, skip it", - offset); - return 0; - } - - if (BTRFS_I(inode)->generation !=3D generation) { - btrfs_err(fs_info, - "free space inode generation (%llu) did not match free space cache ge= neration (%llu)", - BTRFS_I(inode)->generation, generation); - return 0; - } - - if (!num_entries) - return 0; - - ret =3D io_ctl_init(&io_ctl, inode, 0); - if (ret) - return ret; - - readahead_cache(inode); - - ret =3D io_ctl_prepare_pages(&io_ctl, true); - if (ret) - goto out; - - ret =3D io_ctl_check_crc(&io_ctl, 0); - if (ret) - goto free_cache; - - ret =3D io_ctl_check_generation(&io_ctl, generation); - if (ret) - goto free_cache; - - while (num_entries) { - e =3D kmem_cache_zalloc(btrfs_free_space_cachep, - GFP_NOFS); - if (!e) { - ret =3D -ENOMEM; - goto free_cache; - } - - ret =3D io_ctl_read_entry(&io_ctl, e, &type); - if (ret) { - kmem_cache_free(btrfs_free_space_cachep, e); - goto free_cache; - } - - if (!e->bytes) { - ret =3D -1; - kmem_cache_free(btrfs_free_space_cachep, e); - goto free_cache; - } - - if (type =3D=3D BTRFS_FREE_SPACE_EXTENT) { - spin_lock(&ctl->tree_lock); - ret =3D link_free_space(ctl, e); - spin_unlock(&ctl->tree_lock); - if (ret) { - btrfs_err(fs_info, - "Duplicate entries in free space cache, dumping"); - kmem_cache_free(btrfs_free_space_cachep, e); - goto free_cache; - } - } else { - ASSERT(num_bitmaps); - num_bitmaps--; - e->bitmap =3D kmem_cache_zalloc( - btrfs_free_space_bitmap_cachep, GFP_NOFS); - if (!e->bitmap) { - ret =3D -ENOMEM; - kmem_cache_free( - btrfs_free_space_cachep, e); - goto free_cache; - } - spin_lock(&ctl->tree_lock); - ret =3D link_free_space(ctl, e); - if (ret) { - spin_unlock(&ctl->tree_lock); - btrfs_err(fs_info, - "Duplicate entries in free space cache, dumping"); - kmem_cache_free(btrfs_free_space_bitmap_cachep, e->bitmap); - kmem_cache_free(btrfs_free_space_cachep, e); - goto free_cache; - } - ctl->total_bitmaps++; - recalculate_thresholds(ctl); - spin_unlock(&ctl->tree_lock); - list_add_tail(&e->list, &bitmaps); - } - - num_entries--; - } - - io_ctl_unmap_page(&io_ctl); - - /* - * We add the bitmaps at the end of the entries in order that - * the bitmap entries are added to the cache. - */ - list_for_each_entry_safe(e, n, &bitmaps, list) { - list_del_init(&e->list); - ret =3D io_ctl_read_bitmap(&io_ctl, e); - if (ret) - goto free_cache; - } - - io_ctl_drop_pages(&io_ctl); - ret =3D 1; -out: - io_ctl_free(&io_ctl); - return ret; -free_cache: - io_ctl_drop_pages(&io_ctl); - - spin_lock(&ctl->tree_lock); - __btrfs_remove_free_space_cache(ctl); - spin_unlock(&ctl->tree_lock); - goto out; -} - -static int copy_free_space_cache(struct btrfs_free_space_ctl *ctl) -{ - struct btrfs_free_space *info; - struct rb_node *n; - int ret =3D 0; - - while (!ret && (n =3D rb_first(&ctl->free_space_offset)) !=3D NULL) { - info =3D rb_entry(n, struct btrfs_free_space, offset_index); - if (!info->bitmap) { - const u64 offset =3D info->offset; - const u64 bytes =3D info->bytes; - - unlink_free_space(ctl, info, true); - spin_unlock(&ctl->tree_lock); - kmem_cache_free(btrfs_free_space_cachep, info); - ret =3D btrfs_add_free_space(ctl->block_group, offset, bytes); - spin_lock(&ctl->tree_lock); - } else { - u64 offset =3D info->offset; - u64 bytes =3D ctl->block_group->fs_info->sectorsize; - - ret =3D search_bitmap(ctl, info, &offset, &bytes, false); - if (ret =3D=3D 0) { - bitmap_clear_bits(ctl, info, offset, bytes, true); - spin_unlock(&ctl->tree_lock); - ret =3D btrfs_add_free_space(ctl->block_group, offset, - bytes); - spin_lock(&ctl->tree_lock); - } else { - free_bitmap(ctl, info); - ret =3D 0; - } - } - cond_resched_lock(&ctl->tree_lock); - } - return ret; -} - -static struct lock_class_key btrfs_free_space_inode_key; - -int load_free_space_cache(struct btrfs_block_group *block_group) -{ - struct btrfs_fs_info *fs_info =3D block_group->fs_info; - struct btrfs_free_space_ctl *ctl =3D block_group->free_space_ctl; - struct btrfs_free_space_ctl tmp_ctl =3D {}; - struct inode *inode; - struct btrfs_path *path; - int ret =3D 0; - bool matched; - u64 used =3D block_group->used; - - /* - * Because we could potentially discard our loaded free space, we want - * to load everything into a temporary structure first, and then if it's - * valid copy it all into the actual free space ctl. - */ - btrfs_init_free_space_ctl(block_group, &tmp_ctl); - - /* - * If this block group has been marked to be cleared for one reason or - * another then we can't trust the on disk cache, so just return. - */ - spin_lock(&block_group->lock); - if (block_group->disk_cache_state !=3D BTRFS_DC_WRITTEN) { - spin_unlock(&block_group->lock); - return 0; - } - spin_unlock(&block_group->lock); - - path =3D btrfs_alloc_path(); - if (!path) - return 0; - path->search_commit_root =3D true; - path->skip_locking =3D true; - - /* - * We must pass a path with search_commit_root set to btrfs_iget in - * order to avoid a deadlock when allocating extents for the tree root. - * - * When we are COWing an extent buffer from the tree root, when looking - * for a free extent, at extent-tree.c:find_free_extent(), we can find - * block group without its free space cache loaded. When we find one - * we must load its space cache which requires reading its free space - * cache's inode item from the root tree. If this inode item is located - * in the same leaf that we started COWing before, then we end up in - * deadlock on the extent buffer (trying to read lock it when we - * previously write locked it). - * - * It's safe to read the inode item using the commit root because - * block groups, once loaded, stay in memory forever (until they are - * removed) as well as their space caches once loaded. New block groups - * once created get their ->cached field set to BTRFS_CACHE_FINISHED so - * we will never try to read their inode item while the fs is mounted. - */ - inode =3D lookup_free_space_inode(block_group, path); - if (IS_ERR(inode)) { - btrfs_free_path(path); - return 0; - } - - /* We may have converted the inode and made the cache invalid. */ - spin_lock(&block_group->lock); - if (block_group->disk_cache_state !=3D BTRFS_DC_WRITTEN) { - spin_unlock(&block_group->lock); - btrfs_free_path(path); - goto out; - } - spin_unlock(&block_group->lock); - - /* - * Reinitialize the class of struct inode's mapping->invalidate_lock for - * free space inodes to prevent false positives related to locks for norm= al - * inodes. - */ - lockdep_set_class(&(&inode->i_data)->invalidate_lock, - &btrfs_free_space_inode_key); - - ret =3D __load_free_space_cache(fs_info->tree_root, inode, &tmp_ctl, - path, block_group->start); - btrfs_free_path(path); - if (ret <=3D 0) - goto out; - - matched =3D (tmp_ctl.free_space =3D=3D (block_group->length - used - - block_group->bytes_super)); - - if (matched) { - spin_lock(&tmp_ctl.tree_lock); - ret =3D copy_free_space_cache(&tmp_ctl); - spin_unlock(&tmp_ctl.tree_lock); - /* - * ret =3D=3D 1 means we successfully loaded the free space cache, - * so we need to re-set it here. - */ - if (ret =3D=3D 0) - ret =3D 1; - } else { - /* - * We need to call the _locked variant so we don't try to update - * the discard counters. - */ - spin_lock(&tmp_ctl.tree_lock); - __btrfs_remove_free_space_cache(&tmp_ctl); - spin_unlock(&tmp_ctl.tree_lock); - btrfs_warn(fs_info, - "block group %llu has wrong amount of free space", - block_group->start); - ret =3D -1; - } -out: - if (ret < 0) { - /* This cache is bogus, make sure it gets cleared */ - spin_lock(&block_group->lock); - block_group->disk_cache_state =3D BTRFS_DC_CLEAR; - spin_unlock(&block_group->lock); - ret =3D 0; - - btrfs_warn(fs_info, - "failed to load free space cache for block group %llu, rebuilding it= now", - block_group->start); - } - - spin_lock(&ctl->tree_lock); - btrfs_discard_update_discardable(block_group); - spin_unlock(&ctl->tree_lock); - iput(inode); - return ret; -} - static inline unsigned long offset_to_bit(u64 bitmap_start, u32 unit, u64 offset) { diff --git a/fs/btrfs/free-space-cache.h b/fs/btrfs/free-space-cache.h index 2432f1783f47..29166cc09b90 100644 --- a/fs/btrfs/free-space-cache.h +++ b/fs/btrfs/free-space-cache.h @@ -14,7 +14,6 @@ #include "fs.h" =20 struct inode; -struct page; struct btrfs_fs_info; struct btrfs_path; struct btrfs_trans_handle; @@ -88,19 +87,6 @@ struct btrfs_free_space_ctl { struct list_head trimming_ranges; }; =20 -struct btrfs_io_ctl { - void *cur, *orig; - struct page *page; - struct page **pages; - struct btrfs_fs_info *fs_info; - struct inode *inode; - unsigned long size; - int index; - int num_pages; - int entries; - int bitmaps; -}; - int __init btrfs_free_space_init(void); void __cold btrfs_free_space_exit(void); struct inode *lookup_free_space_inode(struct btrfs_block_group *block_grou= p, @@ -111,7 +97,6 @@ int btrfs_remove_free_space_inode(struct btrfs_trans_han= dle *trans, =20 int btrfs_truncate_free_space_cache(struct btrfs_trans_handle *trans, struct inode *inode); -int load_free_space_cache(struct btrfs_block_group *block_group); =20 void btrfs_init_free_space_ctl(struct btrfs_block_group *block_group, struct btrfs_free_space_ctl *ctl); --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 327CF38330F for ; Sun, 13 Sep 2026 21:21:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334499; cv=none; b=sFH5qCkJVPvuf3HXrginMNnCtR1b4fqDRTj1y/yGxWyEYSlB8tSJ43t5M1xS9tDeM4smTTtmEE0N1vljwXBLaYpe8k0c+ew97o7yhQBvBMUqAKVQaNce6+DfmrNThMuNJ5EcA94ldI5cjihIxtIL9RSBNGeTXOOBGOugZljeTDQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334499; c=relaxed/simple; bh=HdeCUQk+ecGhJfYRWqbSdat+3roKzCrHRSLpkYGjVNg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TCSG9AWOYLHSLGh4AOgTU/5lDEbBRW88wNidv2Pu50TtAdk9Oobvhf9NrKRObHQzZDOvlbDgaQPrBxdvb4Povnq4DsbaFQukYChAJC4FPtCqBdoPJteetecRd0wK7mL+0uF81VKbsHbUyDbiJgk1QgEHLuImTh3kG9x7+FCIo+o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=dR98ATwI; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=UXCygE8+; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="dR98ATwI"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="UXCygE8+" Received: from pps.filterd (m0167073.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKXfQi652189 for ; Sun, 13 Sep 2026 17:21:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=lCAz fzDZ4UxiQ0/InC3dh+MEBGzJ4Gj38MBd2fo6ivs=; b=dR98ATwIJ6CwIp9Lxczm AjyP+IM3q7qES8EKLD2frMYhJ1G3264boXAJU8JyPVdB/LLEMuv8630SWaQEilS/ uB80mWJQ47/mKjk97EpGMmjBEVCWI1f3jv9HtSL0F/lo8ljtkuAOo3WLAQM+6BNi 8QdUvoRvQJpAzYVcfo4W6S15BWOSTDl8ews6zBWva/DIUsI7HZh6ljm73p4rABG8 UtxJSEPnO+2oPNTPHmrn1zCuPmeSJOwCasUbNXN9qoEAsJI08iv6VwlGZZiQd/dG FSYnyRE9OJzao2YTiTbSGRusqYgut7CA3F7SttWAtrp0hciDUrH0IgpZJEl8pYqM UQ== Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gp2mjg7ws-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:33 -0400 (EDT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-912195e911aso37421696d6.0 for ; Sun, 13 Sep 2026 14:21:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334493; x=1789939293; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=lCAzfzDZ4UxiQ0/InC3dh+MEBGzJ4Gj38MBd2fo6ivs=; b=UXCygE8+JSkhnwDPLiyJPjoUbqp/de64qWpIj3JKAl1ivqF4J+uS4xW7q0U8WdAUHf zZpjNVthfeXtfxz6vEKph0cHSlzCHTYJxT3mFuel2gldVjvhofL4KAGFTIpZL9XJ31yt 1sm/ZCYzm1r0XgvNBQZ/+w/K75iw4dcYy0Rfot4yjnXxc5l+zro5SQTewc9oAc+KXbU6 46sExecr5GUptoWvb9h/9SfJ19RnZ9OwR18cz9ypISt+WmCMZBMCxXEpSImxJl0w1Sf4 8byxnid71oX6MEyxNyozXVnV7SXeV+ZKpYpw6UGkcKAGoR79FH8O9616LV/qV4QKMXLg Z65A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334493; x=1789939293; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=lCAzfzDZ4UxiQ0/InC3dh+MEBGzJ4Gj38MBd2fo6ivs=; b=D826uhcfuKInxO/eNaW7n9EwCgvBM/nXc6sT00/ooI317gFlYsBMhJXknAxVVVg70O YSaYla0NBY/X2n05agTVScushp21VdpeHsPrlv9V6xqjXw/kGocb9spevA/3HcYJTOL0 ECtvF76SJE8+p2edFU79OTPO7d0B5hUwO1sTdE/lHX9LRxnRL+lfUuKFm1mrT22A0X+G +lF7ktQBtoUPSNd6UFGmRoqknb2wOnemYOiPtZjJMGJ1AzzX8R+n8sJUBM1UCbjpz6O3 aIdcxpIXb6W7YjWogTr6uzqFBdlOkn82R66qO3L6ID1SYpCTwZG+L1GSljEsHIMf20S4 vQXA== X-Forwarded-Encrypted: i=1; AKwUvBxA806V0xn4d7bPp7QcurK9HkfUf/VqP6hEe8N7YbCVwlyLR/3stmTt12o1vdz1BCswzGsd0bfg9GpU/GA=@vger.kernel.org X-Gm-Message-State: AFuF++nI1zMezp4iFRItafAjEY6KZtHGTE/Z0IJo2ouLndDCPgJ0U7// +QtPJXfZUjsu0pLDFvOtXQ4ok0gA8w3bRUmCed+ixdureN0VvvGwCCZoQuN9tC05Bl7ClMfZ7a2 L9ZorNXa4O3IfLPf2vru+MD7iziu+L4cJNiwNrxvkxp6swG4xSMw27/eEMBkonA== X-Gm-Gg: AYBFou2+7NrndWWJxijs1C4xXUdXyBUGJF9j2HAwEIHDfgLicp5EXg5esGqnkA2u043 rNFwvvPqcP4hxV4jjMgxPaxZmfaJIgQd6PdO9mCN2rTrYKA53btkk+kTSINaE/sQUqc+2QknEPd QP7waJvJIALCGfS7i2075rBPwy35nBpY11WcvjJRdpETIGgXclaFB1nAy5BZ78eB89Wa7sgQpi1 0X3gsJkvxgBmm2J2UAogVr5dsRrvDHYWTepFIvo3zZ/qdXx12Ac9jFNkEINgCx8tjP858kwJ15o 8qoHTn1x5sc6rHokFc70eXyPNSgh052J52orRo6QB5mWE80tHuGaWk+svDIt4AnnJlXyuu4kHf9 LTEBJJYQJX/2VrNGTdaAOjCNQ8GMudfQHEQ6toIUuwVdCXrdrgHuPtQ== X-Received: by 2002:a05:6214:3d99:b0:912:bd1:49f5 with SMTP id 6a1803df08f44-9121d8efdf6mr128349006d6.10.1789334493355; Sun, 13 Sep 2026 14:21:33 -0700 (PDT) X-Received: by 2002:a05:6214:3d99:b0:912:bd1:49f5 with SMTP id 6a1803df08f44-9121d8efdf6mr128348816d6.10.1789334492878; Sun, 13 Sep 2026 14:21:32 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:32 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:19 -0400 Subject: [PATCH v2 07/16] btrfs: remove btrfs_disk_cache_state Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-7-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=5421; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=HdeCUQk+ecGhJfYRWqbSdat+3roKzCrHRSLpkYGjVNg=; b=M6LmKrgNlr9shNqT6BX7WO0hUIabaX4460JVgsXyjTkBg7iDXhCj2dGrRzEcXzvI7+c2iob6N gdSFc56tizFARWpa6b2XaJRVY4AKtmgZbdjWbjoEfQC1tEZmT0CU/wE X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=NfpzRGD4 c=1 sm=1 tr=0 ts=6aa713de cx=c_pps a=oc9J++0uMp73DTRD5QyR2A==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=jHxIr1HyPKZ_Q5_91PL3:22 a=CrexS6knh-isOgJd2j4A:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX2LW5LJCM1CIH kkdVcNQxKclNO8sEyGfNa3jV+W7MW/JjcQYcVl1jfazBd3fzBCVQuuT1cUThUYngD/ed+fE2vus gM6WOG74LvoKQfhbI+mfI9Dr1ptMS8i145T1Wl0D3lQaqOzJ+BXWhOZN1K1K+MTx7RSJPkBiIvq mxoNsA7umEovfvQoUyJq7bT8jJ03kg9OCuVDtYrNSZGbx3+yAaT8SqepbSmeGYUMjgH4SdActem MSjLB/V2jvOI/DPhbPBNU597rx2390iVJ6E47dknmvPljUpgFQuenUq73ygzhRhXkUIcmfvwF/f DCIUWyw4C0LCNaZZWHXyhSK4RY+PIzXjqiF0Cmk936+gQPABZ3ILGcMEqdpwRzW9vICVgAK6MkG w5G0s77fWB7Mzpx7GtvuSRxiUpKA7Ss8zcgTkM3pprGW9KKJDDDPLv6lhDUexaGjcz8TUy7l84W c2bJM+bumtpTrRZyZVw== X-Proofpoint-GUID: UNQTDcV13NQ_b6uNqnaZRks6Q8PrER1E X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX59+5fh/60DxP yGXpGf8yivNMiBruq/IAZgfPu0zau2qGvVE+GLjTB6fwMo1FkNrOVAPnwNsXW8kv0i4ar3beyTx vJVc5OR4jd3Rw10Fbx8ABrOxsbn3ZONy6YB8AK2ykWCl5G0bi7Pl X-Proofpoint-ORIG-GUID: UNQTDcV13NQ_b6uNqnaZRks6Q8PrER1E X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=10 suspectscore=0 malwarescore=0 spamscore=0 bulkscore=10 clxscore=1015 adultscore=0 lowpriorityscore=10 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 With neither the writer nor the loader left, nothing acts on disk_cache_state. Remove it, the need_clear handling when reading block groups, and the enum. While at it, drop the unused cache_generation field from struct btrfs_block_group. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/block-group.c | 32 ++------------------------------ fs/btrfs/block-group.h | 10 ---------- fs/btrfs/disk-io.c | 4 ---- fs/btrfs/free-space-cache.c | 1 - 4 files changed, 2 insertions(+), 45 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 47d48b4abf17..cc8207b028fa 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -2448,8 +2448,7 @@ static int check_chunk_block_group_mappings(struct bt= rfs_fs_info *fs_info) =20 static int read_one_block_group(struct btrfs_fs_info *info, struct btrfs_block_group_item_v2 *bgi, - const struct btrfs_key *key, - bool need_clear) + const struct btrfs_key *key) { struct btrfs_block_group *cache; const bool mixed =3D btrfs_fs_incompat(info, MIXED_GROUPS); @@ -2475,20 +2474,6 @@ static int read_one_block_group(struct btrfs_fs_info= *info, =20 btrfs_set_free_space_tree_thresholds(cache); =20 - if (need_clear) { - /* - * When we mount with old space cache, we need to - * set BTRFS_DC_CLEAR and set dirty flag. - * - * a) Setting 'BTRFS_DC_CLEAR' makes sure that we - * truncate the old free space cache inode and - * setup a new one. - * b) Setting 'dirty flag' makes sure that we flush - * the new space cache info onto disk. - */ - if (btrfs_test_opt(info, SPACE_CACHE)) - cache->disk_cache_state =3D BTRFS_DC_CLEAR; - } if (!mixed && ((cache->flags & BTRFS_BLOCK_GROUP_METADATA) && (cache->flags & BTRFS_BLOCK_GROUP_DATA))) { btrfs_err(info, @@ -2629,8 +2614,6 @@ int btrfs_read_block_groups(struct btrfs_fs_info *inf= o) struct btrfs_block_group *cache; struct btrfs_space_info *space_info; struct btrfs_key key; - bool need_clear =3D false; - u64 cache_gen; =20 /* * Either no extent root (with ibadroots rescue option) or we have @@ -2651,13 +2634,6 @@ int btrfs_read_block_groups(struct btrfs_fs_info *in= fo) if (!path) return -ENOMEM; =20 - cache_gen =3D btrfs_super_cache_generation(info->super_copy); - if (btrfs_test_opt(info, SPACE_CACHE) && - btrfs_super_generation(info->super_copy) !=3D cache_gen) - need_clear =3D true; - if (btrfs_test_opt(info, CLEAR_CACHE)) - need_clear =3D true; - while (1) { struct btrfs_block_group_item_v2 bgi; struct extent_buffer *leaf; @@ -2686,7 +2662,7 @@ int btrfs_read_block_groups(struct btrfs_fs_info *inf= o) =20 btrfs_item_key_to_cpu(leaf, &key, slot); btrfs_release_path(path); - ret =3D read_one_block_group(info, &bgi, &key, need_clear); + ret =3D read_one_block_group(info, &bgi, &key); if (ret < 0) goto error; key.objectid +=3D key.offset; @@ -3539,10 +3515,6 @@ int btrfs_update_block_group(struct btrfs_trans_hand= le *trans, spin_lock(&space_info->lock); spin_lock(&cache->lock); =20 - if (btrfs_test_opt(info, SPACE_CACHE) && - cache->disk_cache_state < BTRFS_DC_CLEAR) - cache->disk_cache_state =3D BTRFS_DC_CLEAR; - old_val =3D cache->used; if (alloc) { old_val +=3D num_bytes; diff --git a/fs/btrfs/block-group.h b/fs/btrfs/block-group.h index 939d4bfbd4b4..eac794a053cd 100644 --- a/fs/btrfs/block-group.h +++ b/fs/btrfs/block-group.h @@ -20,13 +20,6 @@ struct btrfs_fs_info; struct btrfs_inode; struct btrfs_trans_handle; =20 -enum btrfs_disk_cache_state { - BTRFS_DC_WRITTEN, - BTRFS_DC_ERROR, - BTRFS_DC_CLEAR, - BTRFS_DC_SETUP, -}; - enum btrfs_block_group_size_class { /* Unset */ BTRFS_BG_SZ_NONE, @@ -131,7 +124,6 @@ struct btrfs_block_group { u64 delalloc_bytes; u64 bytes_super; u64 flags; - u64 cache_generation; u64 global_root_id; u64 remap_bytes; u32 identity_remap_count; @@ -171,8 +163,6 @@ struct btrfs_block_group { unsigned long full_stripe_len; unsigned long runtime_flags; =20 - enum btrfs_disk_cache_state disk_cache_state; - /* Cache tracking stuff */ enum btrfs_caching_type cached; struct btrfs_caching_control *caching_ctl; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index f256a91f58b4..881d95080709 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4864,10 +4864,6 @@ void btrfs_cleanup_dirty_bgs(struct btrfs_transactio= n *cur_trans, dirty_list); =20 list_del_init(&cache->dirty_list); - spin_lock(&cache->lock); - cache->disk_cache_state =3D BTRFS_DC_ERROR; - spin_unlock(&cache->lock); - spin_unlock(&cur_trans->dirty_bgs_lock); btrfs_put_block_group(cache); btrfs_dec_delayed_refs_rsv_bg_updates(fs_info); diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index a25c4db561b4..57991a413f82 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -143,7 +143,6 @@ struct inode *lookup_free_space_inode(struct btrfs_bloc= k_group *block_group, btrfs_info(fs_info, "Old style space inode found, converting."); BTRFS_I(inode)->flags |=3D BTRFS_INODE_NODATASUM | BTRFS_INODE_NODATACOW; - block_group->disk_cache_state =3D BTRFS_DC_CLEAR; } =20 if (!test_and_set_bit(BLOCK_GROUP_FLAG_IREF, &block_group->runtime_flags)) --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 107DE391E52 for ; Sun, 13 Sep 2026 21:21:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334499; cv=none; b=kVxB9K0c8XDYiWeLlHsoVNKBN/U7bUik0I9YzNXsWmzor0ZMxPX8TvwTAQ/AkFKYj/KDa2BMk26uQrYFBmUg/y1Z3hXG0NrhA7EZLDMCUkvdnkd5KfxSk1Nz+SdZvYi8wA6J8aH5asvPQeQzwLnLdM4C+1DiYlyRNKJ+OxH1Ch0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334499; c=relaxed/simple; bh=7i0VfcvZQmUCFhFA/RzvqDGIG2nYJzqXUsp52XcxgEQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Fxj6nUfqVd+Oyi8T1jGawofAfB2OZtWXncaB91jKvTNu8BJqu4KFYFxzYfDA85ydC4Zz9453V68+WtFGcFkPvLdB4peivMPrhueXDNnZqOUKty971LqGPnvKs3N22/R7Whxo7q6JHHapqQqPVazEuBUfOgrr1ML8coNUfU8zab0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=PTZ6vMsP; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=fH5l5Ger; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="PTZ6vMsP"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="fH5l5Ger" Received: from pps.filterd (m0167074.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKXnmL634633 for ; Sun, 13 Sep 2026 17:21:35 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=Gn9n qykr0SdSJPm6wutmUZGM7NDQjVOE6T87Ys4ezfc=; b=PTZ6vMsPFiG68hPI5ZqK qooEJTJCdIbjCrK6HTUNJRNcabEzqCP5WqdTpGGcemQ+3vtLml6jepdyy9/eokP8 XcL4lmuN4/MvV1rOz+j3yZZ1RMIVwoDzp8aIRRlZ34Mmrv6zGdgWzCECljmBptMv A7S1mz8d91NkqUYiWUlV6b/jWBy7z+VY9hrtRt4GoHQaZqkrKk0f8LUGOZuZwOTV JpeBhEdblKfwc8uSmz5a1+to9KgliLRWCL+QGqCPjNmJkgnoaJ3DVFo9H4y5JQ8c NZBBbPdyzid4mZG2JN7Jt/ZZBiI5avgVmbtHpCdkFyFW08s/aggOXvDTHu6MEUAR Bg== Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gnwac9nwn-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:35 -0400 (EDT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-90ceabcd64aso62202696d6.3 for ; Sun, 13 Sep 2026 14:21:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334494; x=1789939294; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Gn9nqykr0SdSJPm6wutmUZGM7NDQjVOE6T87Ys4ezfc=; b=fH5l5Gerei9LID6sARTpcTvfQDWwe1P9JrlBL4FrfaNzVJxg1BJbt39XgGRDw96V7M h0dZ9Pe1fHAFcHLEnDO79egya8rf7LBN4B0NBUMcnZJTqQH3ukUeqt5EUAvxyKPxlIKd rHJ48jHzXftY8eF15ig+F71HBTpiJMqiMVL8FHes4I7OWl6Zl9XZWou253qCs+IJcyS8 coQxUbWfDm3X5EAD/md4305veNAGTC3OpoTdl9CK2IrnkQpr9kezgNWQEIWJYKjz6bnD F9FmYq1YQYpVxZ2zdf0c3owzqyXQ6bqZ6Hzfb/RmrkRDWX0TxXodpwymDF+Tb4Ajhbe2 JTNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334494; x=1789939294; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Gn9nqykr0SdSJPm6wutmUZGM7NDQjVOE6T87Ys4ezfc=; b=q2uyNNM33ZjSx18DRsE8hZJrwpxCW5ebOL3MZblF4L6MgTJ5EDFmC8l5sD+X9AlEic E6BwDKY9WnuKeLPzbW3hbL1UPO8DwSNlK9xWNFzirAh7gcpEfTbvbfISMzpN+YM4/NCx wKlq+/1a3gSwV2cYzdcZBZrLBjTo/Akc6CH0bldohKmq6zgjN1Og8mHfFy4Lai5loMof NGwD2GRxpwAoaGK1d7h2qZv6ChrM3wvMk0V6P9JJe+X/ohOkLqu07G7H01P864FO6Ck1 esa0iYkkqNUvNRVfOVIhXf4gQ3sPu0EL9Z5r9DLYy4Sh2lc8d+lnovLh9Z+yVIUyBz74 hiNQ== X-Forwarded-Encrypted: i=1; AKwUvBxCpvul2Q4KxmdUir6c5J/BUpEboRnnC1+fymWMMJoFw9PgSj4y1KGfHArvlS6UsjFGlrR0Rq56ziFWIqc=@vger.kernel.org X-Gm-Message-State: AFuF++lBUGzu9hLKf8VMfvUbcEXyHKEz7Lun8jDdBBXfBznimH9tqXZK Pjxt9O+JOhN1b6g2v3i38m15tMttJtcXyOiz5xOUbGiBcE41NEEYxLnhXhWn+vsNd6A9Ds1Y+VG +UZv180O2fHnfcBi234WuMp8KoR8N/lhXCOjsfByidQs6k4SvUcaFt3/BF1tilg== X-Gm-Gg: AYBFou03EYiwd3VYm1vIstjcSevezN41oMVQDWFr6Ck3Zewy3SBsVB/g8quFZg7twsc +xycBSUGF1Ydaf819qzpEYdQU/wqXEfUk4V5r8JGkXlxsr7Ci3cbjNPDFb0XAEpgwj9JjH/RHvr YIAiotjVjL/w/zur1bEd64y8ms9P8MRmfbIYM81O/vZsfGqshRjbN947JlRQWdR5NNy1PPKys8O 15W9LqJfo/ZvzcmsjMZKyFpoPYrlfOiXG41O+wGtmwqSj5gOtwkx5ERRZJBb5mUYrMkHYeBJdA3 JLAk4drTDjqSrfma9CPiAyEwvu5Hw1s0wtolY6k2oTWG31fq2yTQHpZtdaUPxJGI7gacTkQULV/ m/Rppuip8SF0QCEtOMcybxrenOCC2xDezuAv3bYG4N80G3PRbJOU1MA== X-Received: by 2002:a05:6214:5989:b0:90e:98b2:f594 with SMTP id 6a1803df08f44-9121daa7fc9mr148448166d6.17.1789334494480; Sun, 13 Sep 2026 14:21:34 -0700 (PDT) X-Received: by 2002:a05:6214:5989:b0:90e:98b2:f594 with SMTP id 6a1803df08f44-9121daa7fc9mr148447796d6.17.1789334493817; Sun, 13 Sep 2026 14:21:33 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:33 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:20 -0400 Subject: [PATCH v2 08/16] btrfs: remove the SPACE_CACHE mount option flag Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-8-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=8891; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=7i0VfcvZQmUCFhFA/RzvqDGIG2nYJzqXUsp52XcxgEQ=; b=V8WLEMGXxSyT054qn7V2D2sYeybpWrBQ8VXD89O2kh8m4lEtxLr+GO/CrMJE6QdNWbkePPJ4C 593K8OzG+dRCDM3ERJKI9m4XE3O5eNPYYsrqvGg1yquvexTzjvcM25x X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=BqQIUoX5 c=1 sm=1 tr=0 ts=6aa713df cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=azVShVRs0zEubeQ0wG0L:22 a=iLG6Hs8F1K9pulr5F7gA:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 X-Proofpoint-ORIG-GUID: P0D5wcnfMtG4Ow-nsw7ose3i4M_TQnDD X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX4qTy0vGOOR0l 3qMDPey/A/SS4OYJp8vFwekQMjkhT5SJMqYgFr2xkdacutma1WLj2waYnij6HLg4bLsbN4kamex aAyoWeH+s2vryDTiT8crjUQfj36Di+TwsvolkyB24MlxPltE0Mtd X-Proofpoint-GUID: P0D5wcnfMtG4Ow-nsw7ose3i4M_TQnDD X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfXy/mqy1USjnGm Trx87aatQRxQag8vAfswUhP1WwC7nZZKtdbee7am6cN2MJ6W7qY7xI8gJkC6oJlQE8Q9YFoe7gv z7C38ZbI2400iHRLCbfkGgYVr+KD5A/FJ7o5F0fHWR2G4yGR/IvpwoG0UzsSriTH6LpZxs+Se6Z 6v1sGW0YUWm61eQbu79Ah+FDQZdx3WB5x0w/sFDfX0YoplkI8NA47xlk10o/D8IvEJupnqPRv4M yk8KO/nUEOJGRte0mNm7ONsuPb0jqFMfxlzq570Fz42MJqSQy+xuLo33FDOjmKylvGivM+6pmKF F6XeF7OgY59eFzdDBw4gQz+tFs8qFNw1VQ6Pu4/ydnV1xmB3DlGqiN9+AdMS/lEiLUnfQa+sIyD CBXKKUEFBorkuVT8BHMpu0XfwJwW7tiW+cZZW0ONfEVUYkkmDvFNS7gDDUlbLQNNWM4ihygTAVF FPbuPHx5FdIptajkcXA== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 bulkscore=10 impostorscore=10 clxscore=1015 priorityscore=1501 adultscore=0 suspectscore=0 phishscore=0 spamscore=0 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 Nothing sets BTRFS_MOUNT_SPACE_CACHE anymore, so every test of it is false. Remove the flag, the checks rejecting the v1 cache on zoned filesystems and for sector sizes other than the page size, and the deprecation warning. Show a read-only filesystem that still has an old cache as nospace_cache, since that's what's in effect. space_cache and space_cache=3Dv1 keep falling back to no space cache with a warning. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/disk-io.c | 19 ++----------------- fs/btrfs/fs.h | 1 - fs/btrfs/super.c | 31 ++----------------------------- fs/btrfs/transaction.c | 4 +--- fs/btrfs/zoned.c | 9 --------- 5 files changed, 5 insertions(+), 59 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 881d95080709..2ac0e7c2f1e4 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3054,7 +3054,6 @@ static int btrfs_cleanup_fs_roots(struct btrfs_fs_inf= o *fs_info) int btrfs_start_pre_rw_mount(struct btrfs_fs_info *fs_info) { int ret; - const bool cache_opt =3D btrfs_test_opt(fs_info, SPACE_CACHE); bool rebuild_free_space_tree =3D false; =20 if (btrfs_test_opt(fs_info, CLEAR_CACHE) && @@ -3149,8 +3148,8 @@ int btrfs_start_pre_rw_mount(struct btrfs_fs_info *fs= _info) } } =20 - if (cache_opt !=3D btrfs_free_space_cache_v1_active(fs_info)) { - ret =3D btrfs_set_free_space_cache_v1_active(fs_info, cache_opt); + if (btrfs_free_space_cache_v1_active(fs_info)) { + ret =3D btrfs_set_free_space_cache_v1_active(fs_info, false); if (ret) return ret; } @@ -3266,20 +3265,6 @@ int btrfs_check_features(struct btrfs_fs_info *fs_in= fo, bool is_rw_mount) return -EINVAL; } =20 - /* - * Subpage/bs > ps runtime limitation on v1 cache. - * - * V1 space cache still has some hard coded PAGE_SIZE usage, while - * we're already defaulting to v2 cache, no need to bother v1 as it's - * going to be deprecated anyway. - */ - if (fs_info->sectorsize !=3D PAGE_SIZE && btrfs_test_opt(fs_info, SPACE_C= ACHE)) { - btrfs_warn(fs_info, - "v1 space cache is not supported for page size %lu with sectorsize %u", - PAGE_SIZE, fs_info->sectorsize); - return -EINVAL; - } - /* This can be called by remount, we need to protect the super block. */ spin_lock(&fs_info->super_lock); btrfs_set_super_incompat_flags(disk_super, incompat); diff --git a/fs/btrfs/fs.h b/fs/btrfs/fs.h index 96cc8c50af82..ad4b2cbf64b7 100644 --- a/fs/btrfs/fs.h +++ b/fs/btrfs/fs.h @@ -259,7 +259,6 @@ enum { BTRFS_MOUNT_NOSSD =3D (1ULL << 9), BTRFS_MOUNT_DISCARD_SYNC =3D (1ULL << 10), BTRFS_MOUNT_FORCE_COMPRESS =3D (1ULL << 11), - BTRFS_MOUNT_SPACE_CACHE =3D (1ULL << 12), BTRFS_MOUNT_CLEAR_CACHE =3D (1ULL << 13), BTRFS_MOUNT_USER_SUBVOL_RM_ALLOWED =3D (1ULL << 14), BTRFS_MOUNT_ENOSPC_DEBUG =3D (1ULL << 15), diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index b44b16970a62..6ddb7b352166 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -515,7 +515,6 @@ static int btrfs_parse_param(struct fs_context *fc, str= uct fs_parameter *param) btrfs_warn(NULL, "v1 space cache is deprecated, falling back to no space cache"); btrfs_set_opt(ctx->mount_opt, NOSPACECACHE); - btrfs_clear_opt(ctx->mount_opt, SPACE_CACHE); btrfs_clear_opt(ctx->mount_opt, FREE_SPACE_TREE); break; case Opt_space_cache_version: @@ -524,11 +523,9 @@ static int btrfs_parse_param(struct fs_context *fc, st= ruct fs_parameter *param) btrfs_warn(NULL, "v1 space cache is deprecated, falling back to no space cache"); btrfs_set_opt(ctx->mount_opt, NOSPACECACHE); - btrfs_clear_opt(ctx->mount_opt, SPACE_CACHE); btrfs_clear_opt(ctx->mount_opt, FREE_SPACE_TREE); break; case Opt_space_cache_v2: - btrfs_clear_opt(ctx->mount_opt, SPACE_CACHE); btrfs_set_opt(ctx->mount_opt, FREE_SPACE_TREE); break; default: @@ -705,13 +702,6 @@ bool btrfs_check_options(const struct btrfs_fs_info *i= nfo, if (btrfs_check_mountopts_zoned(info, mount_opt)) ret =3D false; =20 - if (!test_bit(BTRFS_FS_STATE_REMOUNTING, &info->fs_state)) { - if (btrfs_raw_test_opt(*mount_opt, SPACE_CACHE)) { - btrfs_warn(info, -"space cache v1 is being deprecated and will be removed in a future releas= e, please use -o space_cache=3Dv2"); - } - } - return ret; } =20 @@ -729,14 +719,6 @@ bool btrfs_check_options(const struct btrfs_fs_info *i= nfo, */ void btrfs_set_free_space_cache_settings(struct btrfs_fs_info *fs_info) { - if (fs_info->sectorsize !=3D PAGE_SIZE && btrfs_test_opt(fs_info, SPACE_C= ACHE)) { - btrfs_info(fs_info, - "forcing free space tree for sector size %u with page size %lu", - fs_info->sectorsize, PAGE_SIZE); - btrfs_clear_opt(fs_info->mount_opt, SPACE_CACHE); - btrfs_set_opt(fs_info->mount_opt, FREE_SPACE_TREE); - } - /* * At this point our mount options are populated, so we only mess with * these settings if we don't have any settings already. @@ -751,9 +733,6 @@ void btrfs_set_free_space_cache_settings(struct btrfs_f= s_info *fs_info) return; } =20 - if (btrfs_test_opt(fs_info, SPACE_CACHE)) - return; - if (btrfs_test_opt(fs_info, NOSPACECACHE)) return; =20 @@ -1107,9 +1086,7 @@ static int btrfs_show_options(struct seq_file *seq, s= truct dentry *dentry) seq_puts(seq, ",discard=3Dasync"); if (!(info->sb->s_flags & SB_POSIXACL)) seq_puts(seq, ",noacl"); - if (btrfs_free_space_cache_v1_active(info)) - seq_puts(seq, ",space_cache"); - else if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE)) + if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE)) seq_puts(seq, ",space_cache=3Dv2"); else seq_puts(seq, ",nospace_cache"); @@ -1441,7 +1418,6 @@ static void btrfs_emit_options(struct btrfs_fs_info *= info, btrfs_info_if_set(info, old, DISCARD_SYNC, "turning on sync discard"); btrfs_info_if_set(info, old, DISCARD_ASYNC, "turning on async discard"); btrfs_info_if_set(info, old, FREE_SPACE_TREE, "enabling free space tree"); - btrfs_info_if_set(info, old, SPACE_CACHE, "enabling disk space caching"); btrfs_info_if_set(info, old, CLEAR_CACHE, "force clearing of disk cache"); btrfs_info_if_set(info, old, AUTO_DEFRAG, "enabling auto defrag"); btrfs_info_if_set(info, old, FRAGMENT_DATA, "fragmenting data"); @@ -1459,7 +1435,6 @@ static void btrfs_emit_options(struct btrfs_fs_info *= info, btrfs_info_if_unset(info, old, SSD_SPREAD, "not using spread ssd allocati= on scheme"); btrfs_info_if_unset(info, old, NOBARRIER, "turning on barriers"); btrfs_info_if_unset(info, old, NOTREELOG, "enabling tree log"); - btrfs_info_if_unset(info, old, SPACE_CACHE, "disabling disk space caching= "); btrfs_info_if_unset(info, old, FREE_SPACE_TREE, "disabling free space tre= e"); btrfs_info_if_unset(info, old, AUTO_DEFRAG, "disabling auto defrag"); btrfs_info_if_unset(info, old, COMPRESS, "use no compression"); @@ -1524,10 +1499,8 @@ static int btrfs_reconfigure(struct fs_context *fc) btrfs_warn(fs_info, "remount supports changing free space tree only from RO to RW"); /* Make sure free space cache options match the state on disk. */ - if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) { + if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) btrfs_set_opt(fs_info->mount_opt, FREE_SPACE_TREE); - btrfs_clear_opt(fs_info->mount_opt, SPACE_CACHE); - } } =20 ret =3D 0; diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index e3ab0f705cb1..e49d83d3148f 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -1983,9 +1983,7 @@ static void update_super_roots(struct btrfs_fs_info *= fs_info) super->root =3D root_item->bytenr; super->generation =3D root_item->generation; super->root_level =3D root_item->level; - if (btrfs_test_opt(fs_info, SPACE_CACHE)) - super->cache_generation =3D root_item->generation; - else if (test_bit(BTRFS_FS_CLEANUP_SPACE_CACHE_V1, &fs_info->flags)) + if (test_bit(BTRFS_FS_CLEANUP_SPACE_CACHE_V1, &fs_info->flags)) super->cache_generation =3D 0; if (test_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags)) super->uuid_tree_generation =3D root_item->generation; diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c index 9cc2c9c1a606..c916053aefad 100644 --- a/fs/btrfs/zoned.c +++ b/fs/btrfs/zoned.c @@ -804,15 +804,6 @@ int btrfs_check_mountopts_zoned(const struct btrfs_fs_= info *info, if (!btrfs_is_zoned(info)) return 0; =20 - /* - * Space cache writing is not COWed. Disable that to avoid write errors - * in sequential zones. - */ - if (btrfs_raw_test_opt(*mount_opt, SPACE_CACHE)) { - btrfs_err(info, "zoned: space cache v1 is not supported"); - return -EINVAL; - } - if (btrfs_raw_test_opt(*mount_opt, NODATACOW)) { btrfs_err(info, "zoned: NODATACOW not supported"); return -EINVAL; --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 2F4C9391E7A for ; Sun, 13 Sep 2026 21:21:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334500; cv=none; b=ESkHLVDLwNcWg1JIrzmJeAwwOiLPsn5rqb04S0O3TadDy4iXT1nNmV7cTf4IJAuZU0ppKl8xeTieY1gpLC2YfQ2M9m7jzVDBNhm37HF+bK6lgZmVMh3FpT5CuBhiLTqS1u1/eIVJWgE3qMrgx/hYhK6+eEGlDxze+gUdsqMlPOA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334500; c=relaxed/simple; bh=LuBTan9y3xIHGem/hBUH0BrWE94YbZlpNQ0hZxPS8Yk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZG1kTatiNlKgqOKaYEtA/VBDewvwfc/1yyp2xia318bDjGInI7krBY3/635GOeRBDcl61JMzizRwiV7PGL6nusyaugobJVAkE3Jyak0skc4WSk/r7/NExffacKx9cmycaiF08UK5UJ6Vkqdsv9zm3a15lNJyyDesPp83Ypa+Ou4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=ivWDxcDs; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=apgKnky+; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="ivWDxcDs"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="apgKnky+" Received: from pps.filterd (m0167077.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKY8Lu558067 for ; Sun, 13 Sep 2026 17:21:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=D30r uv+yKSOAMmMucte1JDQTKk9fW9AMM4RyOBGX0vc=; b=ivWDxcDsdmYDVW4UHE1c NNXK7VPqHl1K+iC1GpI39qaJnq+n0q56sbSE7ThGx00VwUK/dBDNlI99ccRpcNU+ EGizDj9v2/BIZh3a8hsIA0X8EwLGW+fopAksNufvOYjwTMLWmbBQe4KUlrk2MhrW V1bQ4RDFUEV6z1Tt2ga9KtIXdLEiKijXb88sjDdnFMz+wzvSSROLK0MYipEYIC46 lsg94rhE/StD9+pWyLNbnAsSLAYSexeIcCwL4+KYw6cGjn+pBxIBUOKqaEWUb/WS 9vXUGAAyo8XNbIGxlGD1NwEV8/gFwIw+2LNeq1oRrmz386OeMAaP7VjapI8eDvNl cg== Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gp2yv05qa-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:35 -0400 (EDT) Received: by mail-qt1-f200.google.com with SMTP id d75a77b69052e-530ef71ee55so15337711cf.0 for ; Sun, 13 Sep 2026 14:21:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334495; x=1789939295; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=D30ruv+yKSOAMmMucte1JDQTKk9fW9AMM4RyOBGX0vc=; b=apgKnky+ULzwl464VgRc4obMnWeZDnNj8rQ4kixHUFfcibENfTrVS266I3KSN6TLay Cy7tMLnf+b6KEjhSYhNxWleTcwvuJ/tTmgDlIlA26j1dKKMdgOwhLOu10KgJzCk5tJyw NA2FwKqTFqhNDKcO9RaPSwzsbc1/V5nTgUzxLkJBnRjkL7G31VHgP6MDwF7Bd1OUEOer cmPnyuOGT5T+Gm2TrdQnutD/o2vgifKGfQVqNgwQAP+0CrVas4ZI0aVsr4B9nkwnekWB rMyrXbbjUIjGNgUwqRu01ZnLYanWadqPhN7bxUZ37c4jEIGihrzt3/Go60TBQEBR9UDP KNmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334495; x=1789939295; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=D30ruv+yKSOAMmMucte1JDQTKk9fW9AMM4RyOBGX0vc=; b=n1RF8l/cLEqxLW3o4kNol6zi/iQz5ExwtPRDeKDDoBF5j8iPt8w8dVV9CVImWgn3NH +Vs58yajdCffTJNmojv2zCrrctqP+zfkw4oTBX0Gyq/SjyCUHLjOlhRrqa/iW0ePUagf vr4AWkUwIO8szJk83twRd+xQY+Byad4KE7r/ybV0g4OrHnVcqW7m7eZTckZUyx/Xwui+ ZPdu/6Xv9RfNRbXXEKhaeo0VZDjjhSFwDIRYLgXFsSC/tpTb328a2o8fz82vAJd1+uaQ BCH9bPKGpRqTgNIwlFin7t5nvOtpa18Pn1H9aQfnJ69fnq968Cr1qnOMLVt/miSazJKW GJuA== X-Forwarded-Encrypted: i=1; AKwUvBzK49svhkkdg8C4IyenvutruzJcfJMQizdHgRXoGp/38uwnZd+vJDrq0/ApnprZ/nfUQkPq/DPfz6lRY1Y=@vger.kernel.org X-Gm-Message-State: AFuF++lKi32aHvrMDqeELLxcWAj7F46G0c3hfetB8RWELSJ8TxT/AjGj MPHHgvKw/kybDsRdCgSnTADRE4MB0XYqOlqGTeGMkylJQmRQBn9KdJsraiMeoQ0dwmSxXijlIcw A5mgHpUCt5ELcqGp6JRcK/+VcmkC7Mcox8igBb/IxpCZUfpMUxVXclvYqFJHzFA== X-Gm-Gg: AYBFou19p3NuS+LjgzoIIJs63ddTrwIESYZ6qhfey3pnuHyvOklIRdLO270jrFKCJAr Z9a9ebKk3RItkJHqY6h0jAghMgMRHg3kATl+7aMT5MH568absG3XGMWmUw5ZunR/Qn7evssEHkU dPWrvJ4Q+5CIY2h2jJi8o9Xw8b6uN/h9B4aqSPzWVpt/y2PlecTFKCZQzp+bvsjBbEnxK7m4uwp V5EFN+kNx87J7pD4hn9+rpXlxErmZDaD8N9XAGTbJsBr0dd/E2hOaV148c1hMDyP77/+GWqUaI9 n+u+o74Bb7BnrctK/SFjD4QtXCjPqinG90F1hWoQoczzOLMD9GN06jmklxJQNjneITrAPjTA7J/ +MBZVsGZpzpGqpVvpPepmQ9Zw5dAuVrN35EfbGJ6CydSp/JANtERBKQ== X-Received: by 2002:ac8:7e84:0:b0:530:35dd:d6e with SMTP id d75a77b69052e-530c8525cc9mr216212121cf.7.1789334495263; Sun, 13 Sep 2026 14:21:35 -0700 (PDT) X-Received: by 2002:ac8:7e84:0:b0:530:35dd:d6e with SMTP id d75a77b69052e-530c8525cc9mr216211821cf.7.1789334494785; Sun, 13 Sep 2026 14:21:34 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:34 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:21 -0400 Subject: [PATCH v2 09/16] btrfs: replace btrfs_set_free_space_cache_v1_active() with a cleanup helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-9-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=4011; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=LuBTan9y3xIHGem/hBUH0BrWE94YbZlpNQ0hZxPS8Yk=; b=CciFdnVe6cwEgYXGnMnIPHVwh8wh4/+Bu1rfFb59+zEZW2GdRG6ISs37OTzdP8uTyKN1nOIhZ g3wuUpe5OKZAXfDTnedRn15x44ZpoT4eC3NOSWey+7KgLy1f7TxNWgn X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=HtPjiETS c=1 sm=1 tr=0 ts=6aa713df cx=c_pps a=JbAStetqSzwMeJznSMzCyw==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=QOCMdifcju39GKoXhKua:22 a=UPWLJQKup_2xIvwY5mAA:9 a=QEXdDO2ut3YA:10 a=uxP6HrT_eTzRwkO_Te1X:22 X-Proofpoint-ORIG-GUID: 19T_yyj2yby9HdyFM11LOh-UHDZg5glx X-Proofpoint-GUID: 19T_yyj2yby9HdyFM11LOh-UHDZg5glx X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNSBTYWx0ZWRfX/WMkLzojcJAT TyYc9lAror1doUXnUsXL9GbHxXacvg0TwOFpe0sEAomxzzJgwyC9UGYpw68J5MiTv0st0aVffz+ zHQjhnxpNUGrL8o/TaXIxJ8x5xF0Lroyjw2UYpiCK8ReU8UedVID X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNSBTYWx0ZWRfX3QHjfYiDya89 i7GDXWNR6gjtumTNkeUUiiGfzEJ8TQrc0DPwKdyjFSAhGTdmKbFqAhwSSii57s/wHvKam7DLM18 5uEAAj9K66nk6clBXMq6FwbgKwtwzPxIlOlR4GCyx+AAKQI2luTrn4bqqlLTM+sVxmSP6/9mW4z RvwRQI6Xk9MU+2seT7KIrDPzOfO5HkHzexa55el86L2umEFDTSgk9RotRaPFukt2d92a1AVoVVj 6kVmchQoqUaGVxWOeG2Bos2pY9J41Wpwtch+DerTYBx6ufEAGu749CXsPS+bE4wV7f5joIRwAXY SUZmZylymN1XsJ6QqI9F334SzdILr9vScw2W7BIkko2Lk4h2cJypqJj3dkGDtxYI1Fxe3AnlrhS L+R1hOrkop1lgRGMMw1nzciDhDVXapNbd6CdoqkicSKNLyqzP2CoSPwtThRRkR52W6E3siVXhvS HWqJXWv5DeKqFwBHb1w== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=10 priorityscore=1501 malwarescore=0 suspectscore=0 spamscore=0 clxscore=1015 adultscore=0 impostorscore=10 bulkscore=10 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130305 The only caller passes active =3D false. Turn it into btrfs_cleanup_free_space_cache_v1() and fold the block group loop into it. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/disk-io.c | 2 +- fs/btrfs/free-space-cache.c | 42 ++++++++++++------------------------------ fs/btrfs/free-space-cache.h | 2 +- 3 files changed, 14 insertions(+), 32 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 2ac0e7c2f1e4..323fbbea48e5 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3149,7 +3149,7 @@ int btrfs_start_pre_rw_mount(struct btrfs_fs_info *fs= _info) } =20 if (btrfs_free_space_cache_v1_active(fs_info)) { - ret =3D btrfs_set_free_space_cache_v1_active(fs_info, false); + ret =3D btrfs_cleanup_free_space_cache_v1(fs_info); if (ret) return ret; } diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 57991a413f82..a36d0465510d 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -2898,47 +2898,29 @@ bool btrfs_free_space_cache_v1_active(struct btrfs_= fs_info *fs_info) return btrfs_super_cache_generation(fs_info->super_copy); } =20 -static int cleanup_free_space_cache_v1(struct btrfs_fs_info *fs_info, - struct btrfs_trans_handle *trans) +int btrfs_cleanup_free_space_cache_v1(struct btrfs_fs_info *fs_info) { - struct btrfs_block_group *block_group; + struct btrfs_trans_handle *trans; struct rb_node *node; + int ret; =20 btrfs_info(fs_info, "cleaning free space cache v1"); =20 - node =3D rb_first_cached(&fs_info->block_group_cache_tree); - while (node) { - int ret; - - block_group =3D rb_entry(node, struct btrfs_block_group, cache_node); - ret =3D btrfs_remove_free_space_inode(trans, NULL, block_group); - if (ret) - return ret; - node =3D rb_next(node); - } - return 0; -} - -int btrfs_set_free_space_cache_v1_active(struct btrfs_fs_info *fs_info, bo= ol active) -{ - struct btrfs_trans_handle *trans; - int ret; - /* - * update_super_roots will appropriately set or unset - * super_copy->cache_generation based on SPACE_CACHE and - * BTRFS_FS_CLEANUP_SPACE_CACHE_V1. For this reason, we need a - * transaction commit whether we are enabling space cache v1 and don't - * have any other work to do, or are disabling it and removing free - * space inodes. + * update_super_roots() zeroes super_copy->cache_generation while + * BTRFS_FS_CLEANUP_SPACE_CACHE_V1 is set, so this needs a commit. */ trans =3D btrfs_start_transaction(fs_info->tree_root, 0); if (IS_ERR(trans)) return PTR_ERR(trans); =20 - if (!active) { - set_bit(BTRFS_FS_CLEANUP_SPACE_CACHE_V1, &fs_info->flags); - ret =3D cleanup_free_space_cache_v1(fs_info, trans); + set_bit(BTRFS_FS_CLEANUP_SPACE_CACHE_V1, &fs_info->flags); + for (node =3D rb_first_cached(&fs_info->block_group_cache_tree); node; + node =3D rb_next(node)) { + struct btrfs_block_group *block_group; + + block_group =3D rb_entry(node, struct btrfs_block_group, cache_node); + ret =3D btrfs_remove_free_space_inode(trans, NULL, block_group); if (unlikely(ret)) { btrfs_abort_transaction(trans, ret); btrfs_end_transaction(trans); diff --git a/fs/btrfs/free-space-cache.h b/fs/btrfs/free-space-cache.h index 29166cc09b90..f5f18e397b13 100644 --- a/fs/btrfs/free-space-cache.h +++ b/fs/btrfs/free-space-cache.h @@ -136,7 +136,7 @@ int btrfs_trim_block_group_bitmaps(struct btrfs_block_g= roup *block_group, void btrfs_trim_fully_remapped_block_group(struct btrfs_block_group *bg); =20 bool btrfs_free_space_cache_v1_active(struct btrfs_fs_info *fs_info); -int btrfs_set_free_space_cache_v1_active(struct btrfs_fs_info *fs_info, bo= ol active); +int btrfs_cleanup_free_space_cache_v1(struct btrfs_fs_info *fs_info); /* Support functions for running our sanity tests */ #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS bool btrfs_use_bitmap(struct btrfs_free_space_ctl *ctl, --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 B1CC938F92F for ; Sun, 13 Sep 2026 21:21:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334501; cv=none; b=YiHNwTL08K0usCjalD+/4cOkdZWtZC0ExD1RE9VUD2PD/WWd09ZQHeSSL6k2lRgFC8t1UfBAG4IFrHuo8dbV0MPFMUcXM7wUkuznw5XRMPz2dt+Q/7Bcsffdab+QyTyXFIg+U+QU6h5F672zEsa+0gBRbu6V3Ge9z2laJt7gWRM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334501; c=relaxed/simple; bh=f7QP8rjkTL/hFBjwJZZfAUG7xOyxTCYpKox4iSRIc30=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kLqQMs2WWWK1SaJCryBz6ALU+XIrYbSDr2foArIGYyAV8xmbiTZ7J1cfam4RV0bLCZFKy5ja8R8IavA9IiCqy8JzSIAJhWXr9XymT/XO26D+Kh5Rw2Y1E1BTaBk49n/JSzC3RgmsuJCRQMPHFEzxAfolvDnAVBWWhr//kGGdalE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=UJDB89TV; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=eNDdgQA/; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="UJDB89TV"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="eNDdgQA/" Received: from pps.filterd (m0167077.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKXta3557467 for ; Sun, 13 Sep 2026 17:21:37 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=L5P9 pth53AeiU9Aso0fVLD2mVQiBr0GVZfhtL06tuN4=; b=UJDB89TVwt6uvHfyvH1K tToQt2DNqBGHFfZOHeO+Gv1VGPONEI9YpZcKSygjh7XIZ/YhQv2vbxpaaVJijAhm x0twoubcRRPHm5P7rcABxHMf5x2W3QoTC6flYjsSinfuawzb5THMTtufXf3HKTAP mce7MFEk5CU/QO7QZbpY9PdzY4ijdfftI8Z4Uh1Fnp61uZCMzMhV8MP/pjS1r7jw BhR1dIx3TWHFTGub5oQgbBlkgXba9BRBieZFw+qpCseKn4G0XA1dDKdgQyDXr7jD LuikjVq6zD/BdWIvRKCOAAQAfdQXPCuJlB4nFX3/K4L1nf0DZsbe3yadr7qEMs5W 6g== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gp2yv05qc-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:36 -0400 (EDT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-934963b2bc0so556853185a.3 for ; Sun, 13 Sep 2026 14:21:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334496; x=1789939296; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=L5P9pth53AeiU9Aso0fVLD2mVQiBr0GVZfhtL06tuN4=; b=eNDdgQA/rVlIy3YCU1BeDI12gNxWfTIu6LIoWFLPMCCl+2lLneN5vkYTOCX36b1I2e H8aywG1Dm2lDj0M7iAspRVQNrrQ72LdhEJgSSwzQ2pv3ctp4WPBVW2RBxBOAl8LIWkrQ sG9GHkjmjj4lR9lpjWDgw5zMM13TUbno8TokdtsB+p2wpWt2LbL6bPfGJgIBa29CgrZx KHKRaH1HYgBVMdPtmdZUoydKtf3gevwsgeNxTpBFC1e17KCLNlSCgU2NMScTBttdmkao zdoHRPu5jHkX/cGM57dGwECSeiiGd0/Eo8KOAdb/qXT0cIh6jJzneMfI8S5LsVS5rQKC YeWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334496; x=1789939296; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=L5P9pth53AeiU9Aso0fVLD2mVQiBr0GVZfhtL06tuN4=; b=E8oz6eWSrLi2I/RD97JQK2cw4UQtemWOf10X0rMj7Vk1YAQHgCK7P9yZyuqLjGSfpN Ppfc+/fy8h9whxpj+k+YOLVNMCi2OGmEzLEq75aIteXxHQr0iZ9ENfWpJEg9NWbMt6lK LMrK3KjHNako76/N/rr+GEC7oxePs71ZIrMrDRsnB1erUhQ664CxtpmLuN2fsEXt+4fW W5XP4IZLd6mq4BL7cIY3mfw0lTHmdo7kCcbaijG/Fr9JJn6H7urfioABrc6zHHFo0e/D g8TdZ48ihURJFkC7WJQo/XJNtkv0gqgr8mkyZQGezvA4Uu2cBL+2emaynSnlyRsNubAJ sGIw== X-Forwarded-Encrypted: i=1; AKwUvBw81lGqbiGa3uqd1BBXGn0lLDaUFIEoi/kliX/w0cQyqsV+Kz2Wv/kOsBwze78NyKNkPANPHtayETEraRY=@vger.kernel.org X-Gm-Message-State: AFuF++mQrUlCTwcLCyH/ZdfsqqSaK4Vv4hNgxhnqykIUUdx+ywiAgoME 9pUuxC7vV3S+2fq9gTOwPcTzcrLH/ie2qkBS8XbXycAuil2JEg9PqrSBpsKco4DkCx4mvp9+N3k RtJoJmXeNtCpLRMBO9F7pGDB9JxOfKsXMGHV1+/9o9rfuPg3T4ZMLKzNJx0fEcQ== X-Gm-Gg: AYBFou3Z++1zGEmDzO7L9sJEr7dGPG/5UnQc3FoA2gip/usKoSxrf15rhMD6BaKmQWR mj+46Hm36cC8Y8XiI+IP3/RVspfswal1A9NDlwBlXZKgclJJOw+LHEXljc5PRYGCK0wIQsqdxX9 KemwSwJf4u/1JLGdWuXtyHoCyetUuxlhmUrwXaRCSkMck/hVfi4GYi+q8ido1PT8AX7A4DgvnAP xlVnMHBGPOZx0/QLQohbDE5vnWF4A9CrjG2FgYSMg7rJ69TUqdT588NMbPQ2kYiPakJWHrkvHgI ad8TCRKl0Dqn6BfQlqJFfqnDe+EGP9iOiPgZ3gxsr/Nz8Opg1fS8jYlQbaQoRPgQj0Cb+GyVgxa j6DIZi31hobWJV7lP16bpfJ0KotlMhabmoKcApI01/8KFujQM4bkXvA== X-Received: by 2002:a05:620a:468b:b0:930:9585:e08e with SMTP id af79cd13be357-939ea037950mr2081633185a.10.1789334496400; Sun, 13 Sep 2026 14:21:36 -0700 (PDT) X-Received: by 2002:a05:620a:468b:b0:930:9585:e08e with SMTP id af79cd13be357-939ea037950mr2081629785a.10.1789334495883; Sun, 13 Sep 2026 14:21:35 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:35 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:22 -0400 Subject: [PATCH v2 10/16] btrfs: remove the free space cache trimming ranges Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-10-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=7181; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=f7QP8rjkTL/hFBjwJZZfAUG7xOyxTCYpKox4iSRIc30=; b=MAgnTbCS0pwIMf78vilctT03yYx45aNf1mhvlopyN1t8opGmaoCx4RLY43InsXG37uPYA05A+ Iew0FURXcG9CtIUUMuuyj/w7rb9FsgdkPwzeVjQX/tOOTUUqLzsqP7o X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=HtPjiETS c=1 sm=1 tr=0 ts=6aa713e1 cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=QOCMdifcju39GKoXhKua:22 a=qCNzSPQ7UVaF4CatvjwA:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-ORIG-GUID: 9iL9pbZV9aav9orejzyFPnnJzYFZgY3k X-Proofpoint-GUID: 9iL9pbZV9aav9orejzyFPnnJzYFZgY3k X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNSBTYWx0ZWRfXzBkxuo1+VGOG OFOd6GBe8UeSOTc+rkQlIZJdA9UipIwgD1Rm+0FZrUo8tWjBL/1jcy3zJWrN5PokrPUCS8Pmsqe npRqBmjBwBBp2tE19xTbT88GJYDfNDHD+kWq2KplKNdUf2BE1cWa X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNSBTYWx0ZWRfX5bNSoFwG38FQ AOuKmzs09wPSaUQx0pno1Py/XbwybYsxRGb+oTdzsPMlRfms0iqxwcPXn+lbP3Qk/KmZJFNaHQD owzc6S6+I8rWeKoL+qUMemAAl66ZEbX3YShpvb9LSFyZoRiyEcwokSjKmyLKHfA9RWQOBIujDs2 Jd7PQnPQuxiBoydp9yNQYxvGnXoFGNn6oupPxwRovRqKSeAaz08euQ5xvVvll4arFlQNsiSRbVe GLq1WXtVosNpr5uexDUXWCMhWVAYewqswUKiA0Tb9fmJYadbQp+c5dwbfbZ8cwooF+kXGQS30Eh AsKvcNx/McBF709srwTp7aQsXCFytT7WjlTDFDds1hz0wBemwai3WD7DxhGn7LfksS1/wCQiUiN ble0ITqPvs0V3KT4P8txn7AtUbdt+G2OcADfqU+391ldjNaYmkBAmXp9ERbjMO4kG+FeuDYKXie jr53M1Sq6ixXAyhIfFA== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=10 priorityscore=1501 malwarescore=0 suspectscore=0 spamscore=0 clxscore=1015 adultscore=0 impostorscore=10 bulkscore=10 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130305 cache_writeout_mutex and trimming_ranges let the v1 cache writer see ranges that were unlinked from the free space tree while being discarded. Nothing consumes the list anymore, and the tree itself is protected by tree_lock, so remove them. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/free-space-cache.c | 41 +++-------------------------------------- fs/btrfs/free-space-cache.h | 2 -- 2 files changed, 3 insertions(+), 40 deletions(-) diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index a36d0465510d..8a6d896b4108 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -36,12 +36,6 @@ static struct kmem_cache *btrfs_free_space_cachep; static struct kmem_cache *btrfs_free_space_bitmap_cachep; =20 -struct btrfs_trim_range { - u64 start; - u64 bytes; - struct list_head list; -}; - static int link_free_space(struct btrfs_free_space_ctl *ctl, struct btrfs_free_space *info); static void unlink_free_space(struct btrfs_free_space_ctl *ctl, @@ -1699,8 +1693,6 @@ void btrfs_init_free_space_ctl(struct btrfs_block_gro= up *block_group, spin_lock_init(&ctl->tree_lock); ctl->block_group =3D block_group; ctl->free_space_bytes =3D RB_ROOT_CACHED; - INIT_LIST_HEAD(&ctl->trimming_ranges); - mutex_init(&ctl->cache_writeout_mutex); =20 /* * we only want to have 32k of ram per block group for keeping @@ -2396,12 +2388,10 @@ void btrfs_init_free_cluster(struct btrfs_free_clus= ter *cluster) static int do_trimming(struct btrfs_block_group *block_group, u64 *total_trimmed, u64 start, u64 bytes, u64 reserved_start, u64 reserved_bytes, - enum btrfs_trim_state reserved_trim_state, - struct btrfs_trim_range *trim_entry) + enum btrfs_trim_state reserved_trim_state) { struct btrfs_space_info *space_info =3D block_group->space_info; struct btrfs_fs_info *fs_info =3D block_group->fs_info; - struct btrfs_free_space_ctl *ctl =3D block_group->free_space_ctl; int ret; bool bg_ro; const u64 end =3D start + bytes; @@ -2427,7 +2417,6 @@ static int do_trimming(struct btrfs_block_group *bloc= k_group, trim_state =3D BTRFS_TRIM_STATE_TRIMMED; } =20 - mutex_lock(&ctl->cache_writeout_mutex); if (reserved_start < start) __btrfs_add_free_space(block_group, reserved_start, start - reserved_start, @@ -2436,8 +2425,6 @@ static int do_trimming(struct btrfs_block_group *bloc= k_group, __btrfs_add_free_space(block_group, end, reserved_end - end, reserved_trim_state); __btrfs_add_free_space(block_group, start, bytes, trim_state); - list_del(&trim_entry->list); - mutex_unlock(&ctl->cache_writeout_mutex); =20 if (!bg_ro) { spin_lock(&space_info->lock); @@ -2475,9 +2462,6 @@ static int trim_no_bitmap(struct btrfs_block_group *b= lock_group, const u64 max_discard_size =3D READ_ONCE(discard_ctl->max_discard_size); =20 while (start < end) { - struct btrfs_trim_range trim_entry; - - mutex_lock(&ctl->cache_writeout_mutex); spin_lock(&ctl->tree_lock); =20 if (ctl->free_space < minlen) @@ -2508,7 +2492,6 @@ static int trim_no_bitmap(struct btrfs_block_group *b= lock_group, bytes =3D entry->bytes; if (bytes < minlen) { spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); goto next; } unlink_free_space(ctl, entry, true); @@ -2533,7 +2516,6 @@ static int trim_no_bitmap(struct btrfs_block_group *b= lock_group, bytes =3D min(extent_start + extent_bytes, end) - start; if (bytes < minlen) { spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); goto next; } =20 @@ -2542,14 +2524,9 @@ static int trim_no_bitmap(struct btrfs_block_group *= block_group, } =20 spin_unlock(&ctl->tree_lock); - trim_entry.start =3D extent_start; - trim_entry.bytes =3D extent_bytes; - list_add_tail(&trim_entry.list, &ctl->trimming_ranges); - mutex_unlock(&ctl->cache_writeout_mutex); =20 ret =3D do_trimming(block_group, total_trimmed, start, bytes, - extent_start, extent_bytes, extent_trim_state, - &trim_entry); + extent_start, extent_bytes, extent_trim_state); if (ret) { block_group->discard_cursor =3D start + bytes; break; @@ -2573,7 +2550,6 @@ static int trim_no_bitmap(struct btrfs_block_group *b= lock_group, out_unlock: block_group->discard_cursor =3D btrfs_block_group_end(block_group); spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); =20 return ret; } @@ -2684,16 +2660,13 @@ static int trim_bitmaps(struct btrfs_block_group *b= lock_group, =20 while (offset < end) { bool next_bitmap =3D false; - struct btrfs_trim_range trim_entry; =20 - mutex_lock(&ctl->cache_writeout_mutex); spin_lock(&ctl->tree_lock); =20 if (ctl->free_space < minlen) { block_group->discard_cursor =3D btrfs_block_group_end(block_group); spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); break; } =20 @@ -2709,7 +2682,6 @@ static int trim_bitmaps(struct btrfs_block_group *blo= ck_group, if (!entry || (async && minlen && start =3D=3D offset && btrfs_free_space_trimmed(entry))) { spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); next_bitmap =3D true; goto next; } @@ -2735,7 +2707,6 @@ static int trim_bitmaps(struct btrfs_block_group *blo= ck_group, else entry->trim_state =3D BTRFS_TRIM_STATE_UNTRIMMED; spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); next_bitmap =3D true; goto next; } @@ -2746,14 +2717,12 @@ static int trim_bitmaps(struct btrfs_block_group *b= lock_group, */ if (async && *total_trimmed) { spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); return ret; } =20 bytes =3D min(bytes, end - start); if (bytes < minlen || (async && maxlen && bytes > maxlen)) { spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); goto next; } =20 @@ -2773,13 +2742,9 @@ static int trim_bitmaps(struct btrfs_block_group *bl= ock_group, free_bitmap(ctl, entry); =20 spin_unlock(&ctl->tree_lock); - trim_entry.start =3D start; - trim_entry.bytes =3D bytes; - list_add_tail(&trim_entry.list, &ctl->trimming_ranges); - mutex_unlock(&ctl->cache_writeout_mutex); =20 ret =3D do_trimming(block_group, total_trimmed, start, bytes, - start, bytes, 0, &trim_entry); + start, bytes, 0); if (ret) { reset_trimming_bitmap(ctl, offset); block_group->discard_cursor =3D diff --git a/fs/btrfs/free-space-cache.h b/fs/btrfs/free-space-cache.h index f5f18e397b13..e22443598b8e 100644 --- a/fs/btrfs/free-space-cache.h +++ b/fs/btrfs/free-space-cache.h @@ -83,8 +83,6 @@ struct btrfs_free_space_ctl { s32 discardable_extents[BTRFS_STAT_NR_ENTRIES]; s64 discardable_bytes[BTRFS_STAT_NR_ENTRIES]; struct btrfs_block_group *block_group; - struct mutex cache_writeout_mutex; - struct list_head trimming_ranges; }; =20 int __init btrfs_free_space_init(void); --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 F28A5396B6F for ; Sun, 13 Sep 2026 21:21:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334504; cv=none; b=TFUNGlr2LHBPf20CCn3Jh3VruS9LtTWog26Ag3kbZ7OUJnLS6bd8NFKh4FpJLrwFoiR2FjSuQ2BFc+4f1B+5MVK6dZSnkKpIKcf9E91q4Que//XyAqJhtWbuF5XBkEoNvU65V/Z5N2YtuQTLnlYCG0E37Ur8GOz3cJNtHrNiMVE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334504; c=relaxed/simple; bh=rTEatSh2afYJTS/R+S9oth9gqbiO3TcMxRS2cWJg+9I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bGzzC2EMLER6UhyN3ucEkstpTYLWAl7WWYkuaiChjbMmbcErB0Y3Qw/jilMOPExrdybVDdHAZxisfUU1pNSHGLt6FNhky2PLcEx1Lz/PeyRDnVwRrYRlsem8iICok45S049PDHTPY8o6T8S1w8xLgE0HUB1/WzuWafBKES9BBIk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=Yi2XrKf+; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=f/OpCnbQ; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="Yi2XrKf+"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="f/OpCnbQ" Received: from pps.filterd (m0167074.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKXnmN634633 for ; Sun, 13 Sep 2026 17:21:40 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=GK6I 62eBP+KN+hKQKgUP5QjzfCNYZqmQtRtjxGM6l5s=; b=Yi2XrKf+av8ZxyThDfqa GJVLeK9JtYYFmAjln8d7+GMzoBS4Z3OCTNUmQPOPSolLcRGHanCXTAldf8SSX8vs +xKd1WftY/Qgps8/xiCQs/fGjBei1C2WSsPhPa6txB/bSeJhuIaWYU6HnjKX9KEw 9g+OO278T5/IJcE150+J05Ol18fkGo7V6VEdicLymlhHZC5w344D+GzXjplHgXt2 9bTGlBIA1hHg/ZpFLRM17hQXwqROh0z1Awg7o82WWGcPuGhu7U/uILJFfK78MW5A L+2+kJc5TAjzTMdHTaMPjxpMKaLB7sQqwXltqgSAopQAbH2wjKnQkqqjOEBK1Xnt ug== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gnwac9nx3-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:40 -0400 (EDT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-9104ba8bf51so73763236d6.3 for ; Sun, 13 Sep 2026 14:21:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334499; x=1789939299; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=GK6I62eBP+KN+hKQKgUP5QjzfCNYZqmQtRtjxGM6l5s=; b=f/OpCnbQfzcrkCJtNyonRmE5cn0mIfXN7SLd0VJTDLnh/X2NQE6ru1/avbHXNVDlD2 snnqTdAmO6V9abxmNhcKkCFHKLVale6KaPjZaU6IShDcR0rlsNjONiQBrNmbCfNnb2sW LxanefRsTpZ/DunhhKTHJwYlS/Kw81cpSgyja+c7Z4aUXEdT5/EQEh0wmSupuxmcapnI /dU304zJTRghw2xAVIc0C+eG/f0o6GMrnQhbKJx/rLuBnn6w7ClZgctwh3E95N6v0FER olzFr+Lu/a6KA4Rr3TEJeJie9tsxZ7rQA0PTAAiuGB5yhmdEaSvdij2trqk1UswwrnuV GIcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334499; x=1789939299; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=GK6I62eBP+KN+hKQKgUP5QjzfCNYZqmQtRtjxGM6l5s=; b=QtuP3AGcko0Z1Ho7q1HLAGuGX1DSE7o1R/aQx5bYuytpBPR9+qFJEHS2UpO6tdw8Xi Iaiizqg9bo3gb17eNpP73Du386hx+eNKgJSYNAkW4fR9KOUR89iPord57yKsNwxMHG7W a8n9Knsr7/39UhTqA+vmO0HSlU0U7ScHwTPIB6aZ/rqHPJ6uMUNd0eWxZbtpeARGr8kR fb11wf0THmd+xgp4i8lE1PM/8Y0Edw/yU/YdofrWR1eciJ2BMcmBxglI8khIblz/fTYm ZUEiGitdEIDkqI+DPE/S4O1G5uKJB7HUlE2qdAv59rdgOFMCTNOX4KPgWNdhMzF+YVFf W4eg== X-Forwarded-Encrypted: i=1; AKwUvBwO4WlhQ/7FTzzHsRAQ0hmE/zpdOz+eAoKiru9RUIojiJMieClbIpIRu8wBX5OpR9Dm8cEEltkt8hLqCo8=@vger.kernel.org X-Gm-Message-State: AFuF++nybslmSD9d5j52fVsIfzzUcE0caeFmVP0UO8DZoYzXy5/4y7Bz meXJkIIDWThiwpMsHA/LpbnuHy0IKye/zoTpBn1UqZ/cXsWAzEcbGiW4wiR7SBn0GbPQxuwZUb/ la1sYSwOGzn3jUFr6xHlRKPYuHDiWkPsvHwaq/kNv8JjcYPXAQtg9y9X3TyqwGg== X-Gm-Gg: AYBFou0x0uz6D/ftHjdNVRe4fpx+auCVhHrgC7dtZ3cyPWZpRT5hdj8xegk7HNKtDM1 XVsM5DedWxkR4leXSTH/J1HtWvaWg/cMJ6n4NzKIlNgby/BHCFkiZuufcdgZxiwBep3iu8yOdFI oMABcVrrDoShh7pDtOBHulPYJFGGgGvS+pfFI9gbAHfUr56BkwUz4SHNFVDWgExOu3RT5ZrsLNa YX9YfoYFjA6ydYtpZRHcgqgjM0TkWdodbX4J0xlvoYUFxC+611o7Q2zjTv+1c9dhZqTTJ9T2csF U/TbQdBOPepRQAZsoMuf8qNzSyhWR1lzvkat5oaMPqYB6DTNManHrDnqnhv9SddJH6iHAF5Dlke mbrmn1vKjzp9z7vote3pMig8OJ8ZPtAqTZhY7q5+M+noWIyy8fdPjBA== X-Received: by 2002:a05:6214:f64:b0:910:3452:d57f with SMTP id 6a1803df08f44-912120efc7fmr263360566d6.31.1789334497312; Sun, 13 Sep 2026 14:21:37 -0700 (PDT) X-Received: by 2002:a05:6214:f64:b0:910:3452:d57f with SMTP id 6a1803df08f44-912120efc7fmr263360196d6.31.1789334496876; Sun, 13 Sep 2026 14:21:36 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:36 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:23 -0400 Subject: [PATCH v2 11/16] btrfs: remove BTRFS_RESERVE_FLUSH_FREE_SPACE_INODE Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-11-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=3841; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=rTEatSh2afYJTS/R+S9oth9gqbiO3TcMxRS2cWJg+9I=; b=ZbhxTfceyOk0EoQpTnqyXZfr/fWc5hGSseSPlkPuJw+jo4skgofAAjaaotzC+HWztoppbiEJG sBGxD3uyFZWDmkZ8L8Fpq8ZZnQZOAfU6yCR1KVzDsPU1V6jYfNk/dZP X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=BqQIUoX5 c=1 sm=1 tr=0 ts=6aa713e4 cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=azVShVRs0zEubeQ0wG0L:22 a=BlyEiQbNVX7t3OJdSnkA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-ORIG-GUID: BPvr7KVVfYzke-wiB-MC_BDLnt0fXAXU X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX8WZj+beLm9U1 JDiFOesucKLTlCOXHq9JH+3MVvTmO0Wk+sK/pqfh2GMPV5fD/V2Egp09iZTUKHya2onbhX6DjM7 4QGmmmtWHr/zPL2WdzaHe9NXk1pGiWiJZKOB0nrzPuJzRUBEb1HH X-Proofpoint-GUID: BPvr7KVVfYzke-wiB-MC_BDLnt0fXAXU X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfXyeBxYz/bQSGG fE/cDpKMtIIdeKNyWOxb830OlhYjwN7B968kIMzGXx/9HYHlXsMtuYLfeJjDnwsiU4wsKFyPIQs 7v+7azmJOoSXcyPIXpDyq49S2Ee6HIybQggVMzcYfdKKeq2tRrj2tH7n+klDjNkIoiVDm1CB5r5 1xE6s0c2PKr6Z/gxFW3iISlX0+yFT/+jlZgCgERE3z+3LQ1eEvBB48afbXaHmlUk204HenYQ3Ht DJ1OD3kSVp/WhsqeVZ/vB1IPTjqEaXQAvCEVI9azSwOMMHbKST5rfHA0/LFgHbcM5iwBf9U0t7I p4KDNxFNeyJ4iZb531sv46Om2Tcry3XPS0PlpVxD6u/jEju9sLgsbPF+6BqSL6FWVExTKItpBvQ DlqYB+zNH3Arwly5ZmcCqGc75Ul2zB3IjENJbF2wJQoY5Iijcqyf2JjvydCwS8MQ6Ha4+CNSrCB hnyFbdXfUxm38Ax8Ukg== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 bulkscore=10 impostorscore=10 clxscore=1015 priorityscore=1501 adultscore=0 suspectscore=0 phishscore=0 spamscore=0 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 Free space inodes no longer reserve data or delalloc space, as nothing writes to them. Remove the flush mode and the special cases that selected it. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/delalloc-space.c | 13 ++----------- fs/btrfs/space-info.c | 2 -- fs/btrfs/space-info.h | 4 ---- 3 files changed, 2 insertions(+), 17 deletions(-) diff --git a/fs/btrfs/delalloc-space.c b/fs/btrfs/delalloc-space.c index d357ed7efd99..77781852e417 100644 --- a/fs/btrfs/delalloc-space.c +++ b/fs/btrfs/delalloc-space.c @@ -132,9 +132,7 @@ int btrfs_alloc_data_chunk_ondemand(const struct btrfs_= inode *inode, u64 bytes) /* Make sure bytes are sectorsize aligned */ bytes =3D ALIGN(bytes, fs_info->sectorsize); =20 - if (btrfs_is_free_space_inode(inode)) - flush =3D BTRFS_RESERVE_FLUSH_FREE_SPACE_INODE; - else if (btrfs_is_zoned(fs_info) && btrfs_is_data_reloc_root(root)) + if (btrfs_is_zoned(fs_info) && btrfs_is_data_reloc_root(root)) flush =3D BTRFS_RESERVE_FLUSH_ZONED_RELOCATION; =20 return btrfs_reserve_data_bytes(data_sinfo_for_inode(inode), bytes, flush= ); @@ -155,8 +153,6 @@ int btrfs_check_data_free_space(struct btrfs_inode *ino= de, =20 if (noflush) flush =3D BTRFS_RESERVE_NO_FLUSH; - else if (btrfs_is_free_space_inode(inode)) - flush =3D BTRFS_RESERVE_FLUSH_FREE_SPACE_INODE; =20 ret =3D btrfs_reserve_data_bytes(data_sinfo_for_inode(inode), len, flush); if (ret < 0) @@ -326,15 +322,10 @@ int btrfs_delalloc_reserve_metadata(struct btrfs_inod= e *inode, u64 num_bytes, int ret =3D 0; =20 /* - * If we are a free space inode we need to not flush since we will be in - * the middle of a transaction commit. We also don't need the delalloc - * mutex since we won't race with anybody. We need this mostly to make - * lockdep shut its filthy mouth. - * * If we have a transaction open (can happen if we call truncate_block * from truncate), then we need FLUSH_LIMIT so we don't deadlock. */ - if (noflush || btrfs_is_free_space_inode(inode)) { + if (noflush) { flush =3D BTRFS_RESERVE_NO_FLUSH; } else { if (current->journal_info) diff --git a/fs/btrfs/space-info.c b/fs/btrfs/space-info.c index 39a28e1bec8a..01018152c054 100644 --- a/fs/btrfs/space-info.c +++ b/fs/btrfs/space-info.c @@ -1704,7 +1704,6 @@ static int handle_reserve_ticket(struct btrfs_space_i= nfo *space_info, evict_flush_states, ARRAY_SIZE(evict_flush_states)); break; - case BTRFS_RESERVE_FLUSH_FREE_SPACE_INODE: case BTRFS_RESERVE_FLUSH_ZONED_RELOCATION: priority_reclaim_data_space(space_info, ticket); break; @@ -1968,7 +1967,6 @@ int btrfs_reserve_data_bytes(struct btrfs_space_info = *space_info, u64 bytes, int ret; =20 ASSERT(flush =3D=3D BTRFS_RESERVE_FLUSH_DATA || - flush =3D=3D BTRFS_RESERVE_FLUSH_FREE_SPACE_INODE || flush =3D=3D BTRFS_RESERVE_FLUSH_ZONED_RELOCATION || flush =3D=3D BTRFS_RESERVE_NO_FLUSH, "flush=3D%d", flush); ASSERT(!current->journal_info || flush !=3D BTRFS_RESERVE_FLUSH_DATA, diff --git a/fs/btrfs/space-info.h b/fs/btrfs/space-info.h index aa836e8a9d4a..d0130c8ba3dd 100644 --- a/fs/btrfs/space-info.h +++ b/fs/btrfs/space-info.h @@ -66,7 +66,6 @@ enum btrfs_reserve_flush_enum { * Can be interrupted by a fatal signal. */ BTRFS_RESERVE_FLUSH_DATA, - BTRFS_RESERVE_FLUSH_FREE_SPACE_INODE, BTRFS_RESERVE_FLUSH_ALL, =20 /* @@ -82,9 +81,6 @@ enum btrfs_reserve_flush_enum { * priority flushing for this, because otherwise we can deadlock on * waiting for a ticket, that cannot be granted, because we cannot do * any allocations. - * - * Apart from being specific to zoned relocation, it is equal to - * BTRFS_FLUSH_FREE_SPACE_INODE. */ BTRFS_RESERVE_FLUSH_ZONED_RELOCATION, =20 --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 45D00394EBA for ; Sun, 13 Sep 2026 21:21:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334502; cv=none; b=FFk9j3hUpoJlAmEuqr4JmcpHQSgyUyVIlk6TY2eb2bUry1s94TO9uZzZs7SpddZ6FBiwpcGqn9v+j+x726XjiKGeSNfLK4Hz0JM+CYjXmAKTLlG++RG1DFEJqGRcMHVGAgD7Ozs5svHf+Vw/ZIQBe+xX0SbEF+FETfCAKe2Uioo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334502; c=relaxed/simple; bh=oYP7pv2FTTOlOSBcQhESw9fz2W/r6y0ZOZU2Sr5Vr8I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=D6BIudh86AkEePfJh5ojYsSwPD0/f39zh7Q9IwKE07y+RtYnQKkPlYujUtL7qajS5rKwxF7Kz0sWk3tX3c5jzupb4MGor/ownWI5AXY+Du/46/xyiNuF1HKdx7UHQeCPuNeigLdZCOL7VO5XE563FNOuV4ziAYK1YI02FJBEg2Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=ZpyIR9rE; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=L9lytLI4; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="ZpyIR9rE"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="L9lytLI4" Received: from pps.filterd (m0167074.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKYWKU635253 for ; Sun, 13 Sep 2026 17:21:39 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=i3P/ srcPAEWDlqUpM+pY7VuFwWMYCOBkTHbn0K5TBeY=; b=ZpyIR9rE+ftYR8wBS1KX ikURwiBWifNPzs/AdEEsNuxp6QfbyaR0NeIQCIgkFisImlYd+dsvEAlc1TZksXYf R+mlJvmhdN7oPaEB0dPlOazx2ctKcfzdJWBxzF7rtDwqIi7eGLLri2MjJQK27Ynv Z9+RdSUdLBn5lnJHaahY6D2qALZI/T1fyUyv3/+KSNqQ/cqGwyCc+r886pl/e+4P b0M8YacrSwqqJilSaxeExO9os49nHtzcuVqjgbUQpaVBR4y0uAFODrSDoVDH44NF FtI8OdzukOEkTnwD1EGf1wT0+8SBsuDRJSGQhtBQ1Z2BvIH8OAAGVE7kDTUuF8Ew 4w== Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gnwac9nx1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:38 -0400 (EDT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-9104ba8bf51so73762916d6.3 for ; Sun, 13 Sep 2026 14:21:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334498; x=1789939298; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=i3P/srcPAEWDlqUpM+pY7VuFwWMYCOBkTHbn0K5TBeY=; b=L9lytLI4sM/dj6aBCQdKQdseMaMIcPOVEh77hVA7f23LG93pIssX7wHE41fbLsGN7c WJhc+zYLRt8binnYP7EiYCU556Km3bXZUryrXv0RgKyjBZkPuhPApMDVtUpcSrmlaJQS 6XVfu3U86+aRNu+nksX95nK0QL1K2jMZI5WKXDnkD+ZC1wZKzg0mSLDv2X9jgLWLkafS eftk5/RelQRSpml0sVhjhTHi68hTPHh1GOCFXdxrp8UMyBCsTawaYqTLBdTOiNb8GYZn +Lu21HQeK5TZTN9dFeIyBzxB799TLP3XQQ+tNVrIuJo7pJ2e6kEVS88vAZMgFaB/ZeXC 6ssw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334498; x=1789939298; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=i3P/srcPAEWDlqUpM+pY7VuFwWMYCOBkTHbn0K5TBeY=; b=rr0SJYqRkMF1XpU6itsc+uKS1r11r5MDmZQCkS68hFqL0JkKtOCp6R35BixAvuqZ9a LBWJn7XtVHihgAk9LOf66FkQ5gbw7EizAhJKd/MMbyX3s8r4KsnpnTqNzugu8EdMqxzr UnJQuEDUAdc7ki6zLliXBWEOPF22n8rwUDwVL15Gh53y9bgEtCA7HLXQD5cX6Lox62I8 lHdHUwiHDlIfNvaDyydq7S4HhEeFBIGepF6R4MGQGby+hVPPHovq5Xk0xMPjcEd4ldjl 8WuHLQ4/gcas/abqx7yxk3bLUL/xtIkcqReRFA6NofkhZDV98zKPNa5ILcs/WHPW41+Z Wv5Q== X-Forwarded-Encrypted: i=1; AKwUvBykR9NH0C8og0AviANw7wjJ5OzNOBVFWHARRaSjFJzrEAYn7jZl7c75+9GbhFgbj86XeKh+a9lDDYY5X+k=@vger.kernel.org X-Gm-Message-State: AFuF++lLnr973+Gx54hzmV2vR6IUzpr0LuKTCPKBeJttWCoxlTxlsBVJ QumSlfQ19/WQDx3JBKQUzgwRzTOUEvrvjpWYb/Y+nErwSmxRVp7tqVtHLG67q6ATY1m5exzzl2y 3RbVP3+TO9q7zGqtiGUPDjWxCa7iCv/Th002OD17j24zH37VuEqypn3T4dOdoyg== X-Gm-Gg: AYBFou2JRjyHMK+fOOc5HadLX8k6VsDZCtzEML9QKqN3da7cCWj9bFVqBpkUrdYIdgn w8uSu0gkS5GWwNuR4ALIm2gp02R+dJoHxdIbG+QwW4E2Bz+XYj7QP0OeA7kY/UCji51RUJt6Eon DFT/ABqNwrMuARwTPjewmIdjZNQvqmulbS2s7xRWJoSsczjlUWlR7DQoufDTLczdfOBxRKTfaWt tPJYkUdTTnzwvyofVDkeyywDFUns/+Nbo4B3oKVQ4mA/uIK03cpv4xi7YiEFSjC6FqlIGtC9L0Z Ol0G/LVpuhNhtX+jRoh6N8rSYGDhojnOn1HICSlS5mXuVYwt7mrxQ42echCWN6mvbycN8HnKrp8 UtRBXrGKJK41a0S40Pr7Dh2RUqUskFe6MccBgbVFpOu9TTA7lMOFgZA== X-Received: by 2002:a05:622a:192a:b0:530:d7c6:16d9 with SMTP id d75a77b69052e-530d7c619fdmr205147821cf.25.1789334498349; Sun, 13 Sep 2026 14:21:38 -0700 (PDT) X-Received: by 2002:a05:622a:192a:b0:530:d7c6:16d9 with SMTP id d75a77b69052e-530d7c619fdmr205147491cf.25.1789334497862; Sun, 13 Sep 2026 14:21:37 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:37 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:24 -0400 Subject: [PATCH v2 12/16] btrfs: remove the free space inode ordered extent special cases Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-12-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=6340; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=oYP7pv2FTTOlOSBcQhESw9fz2W/r6y0ZOZU2Sr5Vr8I=; b=4CWplzF+UtYHlQLXmA8E4PG1BlU+kWV1Ofbrzj2WHS2AH/7bHWXbdO//jsBRmL7ZsW8L4hhvB IFk+fAOcy7CA1/oQ29y5Q4PD7nclgUDs9wn6XujMeIW5Ff1U+QvLNCC X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=BqQIUoX5 c=1 sm=1 tr=0 ts=6aa713e3 cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=azVShVRs0zEubeQ0wG0L:22 a=Rsr-QhNx__N08eNVIAUA:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 X-Proofpoint-ORIG-GUID: 2r57jNzgAq_9G5NucH_RUZd8Ch86bAg- X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfXw6pFNx/N+9Qk ch/WTskDCS9LwaixcknZTWMBH5ukH1rQIQ6g6SY5ZI5w9JKrBwxv39u9pJRe1nVFEq/+HIqiFX5 QaLhlYk7u0Xn3co9oj+c5MSN+3+32zuIZ7ar2vlAO+dA5R6PjPmk X-Proofpoint-GUID: 2r57jNzgAq_9G5NucH_RUZd8Ch86bAg- X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX8Ywh3b5Ivpwo DxYGxHThq8M+40HKkGMtc3PdZqQsemPkLlVqkle5ZkRiznPGJ0aKrzVBsuCruarZ39FSQrHNg+2 jR7t3bVsBqXzczXBiam/2ghLsVi+ddEoCqxnx99on65fXtXFc33aZvXXwmYi983MTf6O5URPKqv olepMmQhSwMoxu7b05kzc4/eygz2mamHmmJms92/BCBwet3m3hAMA4blkFXZHj8BqoBfZFuoVaK Z4r88zYRRx4GF/gZDivH70LZ7C/8qaYvwR+g99W/XwDmZQRTbqC20/dGe1SmhZizRQ6K65VqZXv BmjGN5hwe+eLQD52k6ivwS9RdF+5XV7UlI2Fgj+WcUQCrirmTF7+oKznhnS5cM9JdgOcLn5ybYl oPgustHVgrvmcxKFJML/z2KTxAqNbbWuOcPEpKhD5VqT7p+T8tJvdlc/4ybISuUcqsV6qedRpZv 30Ymjifj+a1l/I906Lg== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 bulkscore=10 impostorscore=10 clxscore=1015 priorityscore=1501 adultscore=0 suspectscore=0 phishscore=0 spamscore=0 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 Free space inodes never have ordered extents anymore. Drop the lockdep exceptions for them and btrfs_join_transaction_spacecache(), which was only used to finish their ordered extents during a commit. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/inode.c | 20 +++----------------- fs/btrfs/ordered-data.c | 20 ++------------------ fs/btrfs/transaction.c | 6 ------ fs/btrfs/transaction.h | 1 - 4 files changed, 5 insertions(+), 42 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 0539f27776e1..dec1a848c7ca 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -3203,7 +3203,6 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_ext= ent *ordered_extent) int compress_type =3D 0; int ret =3D 0; u64 logical_len =3D ordered_extent->num_bytes; - bool freespace_inode; bool truncated =3D false; bool clear_reserved_extent =3D true; unsigned int clear_bits =3D 0; @@ -3220,9 +3219,7 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_ext= ent *ordered_extent) if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) clear_bits |=3D EXTENT_DEFRAG; =20 - freespace_inode =3D btrfs_is_free_space_inode(inode); - if (!freespace_inode) - btrfs_lockdep_acquire(fs_info, btrfs_ordered_extent); + btrfs_lockdep_acquire(fs_info, btrfs_ordered_extent); =20 if (unlikely(test_bit(BTRFS_ORDERED_IOERR, &ordered_extent->flags))) { ret =3D -EIO; @@ -3257,10 +3254,7 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_ex= tent *ordered_extent) &cached_state); } =20 - if (freespace_inode) - trans =3D btrfs_join_transaction_spacecache(root); - else - trans =3D btrfs_join_transaction(root); + trans =3D btrfs_join_transaction(root); if (IS_ERR(trans)) { ret =3D PTR_ERR(trans); trans =3D NULL; @@ -8131,7 +8125,6 @@ void btrfs_destroy_inode(struct inode *vfs_inode) struct btrfs_ordered_extent *ordered; struct btrfs_inode *inode =3D BTRFS_I(vfs_inode); struct btrfs_root *root =3D inode->root; - bool freespace_inode; =20 WARN_ON(!hlist_empty(&vfs_inode->i_dentry)); WARN_ON(vfs_inode->i_data.nrpages); @@ -8154,12 +8147,6 @@ void btrfs_destroy_inode(struct inode *vfs_inode) if (!root) return; =20 - /* - * If this is a free space inode do not take the ordered extents lockdep - * map. - */ - freespace_inode =3D btrfs_is_free_space_inode(inode); - while (1) { ordered =3D btrfs_lookup_first_ordered_extent(inode, (u64)-1); if (!ordered) @@ -8169,8 +8156,7 @@ void btrfs_destroy_inode(struct inode *vfs_inode) "found ordered extent %llu %llu on inode cleanup", ordered->file_offset, ordered->num_bytes); =20 - if (!freespace_inode) - btrfs_lockdep_acquire(root->fs_info, btrfs_ordered_extent); + btrfs_lockdep_acquire(root->fs_info, btrfs_ordered_extent); =20 btrfs_remove_ordered_extent(ordered); btrfs_put_ordered_extent(ordered); diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index e9f1cbeb555a..df74c75d6c29 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -654,13 +654,6 @@ void btrfs_remove_ordered_extent(struct btrfs_ordered_= extent *entry) struct btrfs_fs_info *fs_info =3D root->fs_info; struct rb_node *node; bool pending; - bool freespace_inode; - - /* - * If this is a free space inode the thread has not acquired the ordered - * extents lockdep map. - */ - freespace_inode =3D btrfs_is_free_space_inode(btrfs_inode); =20 btrfs_lockdep_acquire(fs_info, btrfs_trans_pending_ordered); /* This is paired with alloc_ordered_extent(). */ @@ -735,8 +728,7 @@ void btrfs_remove_ordered_extent(struct btrfs_ordered_e= xtent *entry) } spin_unlock(&root->ordered_extent_lock); wake_up(&entry->wait); - if (!freespace_inode) - btrfs_lockdep_release(fs_info, btrfs_ordered_extent); + btrfs_lockdep_release(fs_info, btrfs_ordered_extent); } =20 static void btrfs_run_ordered_extent_work(struct btrfs_work *work) @@ -867,16 +859,9 @@ void btrfs_start_ordered_extent_nowriteback(struct btr= fs_ordered_extent *entry, u64 start =3D entry->file_offset; u64 end =3D start + entry->num_bytes - 1; struct btrfs_inode *inode =3D entry->inode; - bool freespace_inode; =20 trace_btrfs_ordered_extent_start(inode, entry); =20 - /* - * If this is a free space inode do not take the ordered extents lockdep - * map. - */ - freespace_inode =3D btrfs_is_free_space_inode(inode); - /* * pages in the range can be dirty, clean or writeback. We * start IO on any dirty ones so the wait doesn't stall waiting @@ -896,8 +881,7 @@ void btrfs_start_ordered_extent_nowriteback(struct btrf= s_ordered_extent *entry, } } =20 - if (!freespace_inode) - btrfs_might_wait_for_event(inode->root->fs_info, btrfs_ordered_extent); + btrfs_might_wait_for_event(inode->root->fs_info, btrfs_ordered_extent); wait_event(entry->wait, test_bit(BTRFS_ORDERED_COMPLETE, &entry->flags)); } =20 diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index e49d83d3148f..ccc8d5840355 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -853,12 +853,6 @@ struct btrfs_trans_handle *btrfs_join_transaction(stru= ct btrfs_root *root) true); } =20 -struct btrfs_trans_handle *btrfs_join_transaction_spacecache(struct btrfs_= root *root) -{ - return start_transaction(root, 0, TRANS_JOIN_NOLOCK, - BTRFS_RESERVE_NO_FLUSH, true); -} - /* * Similar to regular join but it never starts a transaction when none is * running or when there's a running one at a state >=3D TRANS_STATE_UNBLO= CKED. diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index d6a2eafd162e..d2e2dd6101bc 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -288,7 +288,6 @@ struct btrfs_trans_handle *btrfs_start_transaction_fall= back_global_rsv( struct btrfs_root *root, unsigned int num_items); struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root); -struct btrfs_trans_handle *btrfs_join_transaction_spacecache(struct btrfs_= root *root); struct btrfs_trans_handle *btrfs_join_transaction_nostart(struct btrfs_roo= t *root); struct btrfs_trans_handle *btrfs_attach_transaction(struct btrfs_root *roo= t); struct btrfs_trans_handle *btrfs_attach_transaction_barrier( --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 7AEA238F95B for ; Sun, 13 Sep 2026 21:21:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334506; cv=none; b=rWH5FYAJjWO8THLhTek2rXhzWEU3XcGzBJXrnwayYpFpYGk+ULATEhnErnU3S3FBEsI+TMRGd1xl/x3N9pk3+JfT/IlxOFclpQiwZQQfFomMXG4iy0YjFqcXkB2KNWNaOVud2W4Sy8dUH/ItabeemEShPGNWZX3yKvRDmRz8PWY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334506; c=relaxed/simple; bh=vKb/gGmZfXP29NVMCIBexCHeMi4FmxmfEWzn7IiL0cs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lgfNBfZnP5FvPWF6Yb/0ax631vtyp0L2D1pTFZHNHEDwI8tiefzeXyHBc/rfHen6kYR/Jt78F49qpk2md+JOf8+5HTgj5H1aiZgvBPnmqP1744qQ1A99uCRFfvhFBVW6ueV7dhGl240LsMs6zjYhd3xp0MVbzGT8Exbi3XJp0Uk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=TF5xDUtV; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=K17FmWzF; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="TF5xDUtV"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="K17FmWzF" Received: from pps.filterd (m0167074.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKXnmM634633 for ; Sun, 13 Sep 2026 17:21:40 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=FGtc 1NLeQBu+kS94gpur8nkzS5KJcdAIY3+s7g2GWMM=; b=TF5xDUtVk7YIBsCZqgQm mVbOBpnNaT6o8mvoG5TDRH23HEAsulammU99qtCLL/OJhZm9YyiwX3V2hqVgFyor 1AP9LIc1DA+AWBVFkOGdcFgzjwKlljaI1dOHxNts5oxk8IG1UbOS+3nVSY2txPVd UnqLpgzra0UAr04pOpby7ru5T7sCY/R2F5/4rkkINqjISQ1ZrVDavo0IocpobJLZ R7kZZK4mZ3X7NayMBRI0vcHyVXZ0QhWKiGVTLmg4X7Fx3/R0nvGwoBHz7zkQfLCS DuGPDi+BkUpaboFCucuWmoCAgsaAisTwBOgypqgfHtqbGWuiX6DizZztO6UWVPJ2 fg== Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gnwac9nx2-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:39 -0400 (EDT) Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-936e393061dso418698785a.2 for ; Sun, 13 Sep 2026 14:21:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334499; x=1789939299; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=FGtc1NLeQBu+kS94gpur8nkzS5KJcdAIY3+s7g2GWMM=; b=K17FmWzF7o8Xy0uhh6uSdmWeBs0I5oxZCD2oXyytNZsKDC0IgBGQMDArWFRThVCfOF gig7Ysota3j7maFzZn+azY19sOUN1HHNuhJSWG3DNejbPLsQ99EpiOEWMEuVAQBZMGiE G3k/aBKOzZxSkMJgcQPj0zEDNB6WZ81PnwG8a11YwVwWCjwIY9k3V+uVb49FZePlovAA V2cu4JpQMSw3DwPxlHJgWMdrSWIuzA9IEMqkgjLAxpvRZh8lOzajh9roS+DAuDV8lDZz uBSaIjl1gqjLEcmj/wA9AaEnnjw+jSZGW4aJG7bsL6gNuSXN7xdGh5pOeeS6NHocyGbo 3sAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334499; x=1789939299; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=FGtc1NLeQBu+kS94gpur8nkzS5KJcdAIY3+s7g2GWMM=; b=Rr3GgN5mD04aqBVZCl02YBNH7yOUqC3w6AbDVa5Rwc35dklg87iDE04wJ5byTUcGCB 5Yt03G7YaYLQkUx7Aym3SiFMQenvB92qSKfJ6TjC7blkhR5siR4j28hFfMfyidNCTJ+f dNnWOB95jh7Ss/tlJ/7Sc6KCzsYHYtocB27fKJ5/dXrTZtzzUv+DWP/Y3BHQT/1DMzUo NnRLSURgMO6/uhuy6xC2/rP4zwVYfeaKESeLk3+MzmGdy/Ud8vgDXFPnh+4RZF39C0uw AM/dnCM87bqrwyOGwasCf9yoKxFelBJn4CyT6FChz8SxQsZc26xQ0KlFRyDSKyvfvIl6 NuZA== X-Forwarded-Encrypted: i=1; AKwUvBxq87dmxL7edWy3jYosZ4GgkxkhjgUDJzLiHkSgXEuuZs9fhSRrR27b5B1cBZj7EZ0EkfMCbiltnQpUxyM=@vger.kernel.org X-Gm-Message-State: AFuF++l7TwIfOai7hsAVZG3ZHXqppSMwzXtomoCsJPL0rgl0QdtvQyWX x1+N5b6Zdrb1iRupAFeiubuVweo8Vdr7xCROTwRaV52FroK0KDazCXe5Lmhjn0wuwHEgZY2eQBV kx1uypsmCWyjmv2Y3FbkBk0zlScUiFVoOm695ivMoKCpMDf++1oMVMjHnVVxJKRoYdBZeTi3N X-Gm-Gg: AYBFou0imXWFwSYWetOaYiAyGAEx2m0NHZj/rBKRajVFp66NC/vS795dM3Q3D6a4PBZ ThV4ebuxzj5DdjoyBlwSKJqcmZ2Y+NjchdVnIgnI2y7IODFY9XEE/tODlx/RvibM/irMMq7W+Em ynuECM1AkJKcajv7S7WSbFPqp8Rf61tvR8q9cB5o8x7dxW4lHTuiCmWH3ICJ/6iTBVgYQfRZLvq TwaTK//gJ21mewrrqUEkbZCn8vq7GiLbbLZ+hZ5BE/VoG9R/5gtMOpQyZzdns3v3RxlP66dHGuG rIrY5qg9hKHnqNt075RyjTlXlgooL/cID4CP8yDhB7nOqiOChPQW+3YmVDuvR0GW7oQDYa00ZZQ ZTzVik2cG52IPGBKO/dWFQaxp7moorpcppKWRth5jx8/7NdlmmbKgHw== X-Received: by 2002:a05:620a:40d2:b0:92e:d7c7:7de9 with SMTP id af79cd13be357-93a035f329fmr1127896685a.8.1789334499300; Sun, 13 Sep 2026 14:21:39 -0700 (PDT) X-Received: by 2002:a05:620a:40d2:b0:92e:d7c7:7de9 with SMTP id af79cd13be357-93a035f329fmr1127894485a.8.1789334498875; Sun, 13 Sep 2026 14:21:38 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:38 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:25 -0400 Subject: [PATCH v2 13/16] btrfs: remove the free space inode special cases from the COW paths Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-13-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=5995; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=vKb/gGmZfXP29NVMCIBexCHeMi4FmxmfEWzn7IiL0cs=; b=6dmXrOeyfpj8q4IcK508wpbKAGr0yK8joC2pHxGAD2oZtkgGX2G74qloxg7K1oSdmNW32p3+T e3N+l50hiMXDcdhb0SA69qp1cepL2GtjjrlcNkRaON4q14ipY2pC3rC X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=BqQIUoX5 c=1 sm=1 tr=0 ts=6aa713e3 cx=c_pps a=qKBjSQ1v91RyAK45QCPf5w==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=azVShVRs0zEubeQ0wG0L:22 a=2oXXyLKhFp2WroVMdz4A:9 a=QEXdDO2ut3YA:10 a=NFOGd7dJGGMPyQGDc5-O:22 X-Proofpoint-ORIG-GUID: 73iw_QtuojgAEgwiKkFRssZkWWr21h0h X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX2aCGVyZNjWXt OjradmO6F921ll11Az4cKp6Q4Nxw4Pw20nnO7GaD0C2CFUH0vtZopgQNO+34faWI3JMZ9GWSLaU TIMXRX0hO/9Vl57c4uIw3E/32jphWqGWMC9rrwLWnFYEg2VZh6la X-Proofpoint-GUID: 73iw_QtuojgAEgwiKkFRssZkWWr21h0h X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfXwtMsyafHufyD TDbpSuGZL0JkVTfxkd2xhpmAZ1d7n3Itb7ncGhy7pMy66NZTwJmryngtEE/090cPdm6LuCRd4xV yFsi7mLhBF5zwQmGsEQwTfnuzD7hgXbWsCRiULX4wsiLM5zBL9QVdYnWIsFHjR/q5rctim8Cw0s K7Ydn3Fd/GZIS6vFagY38UMLPZNU00rRJ33sWlOz/q2C0Abk2/yVXUyPa5pJ3LllEtDqG4qKM8a SgdQI4a3phlK2VJSp6TOnNJOZGQmesu64j0zN33opcMWb/vwH8bevkAlsNATrdK4W3OG59iAUV1 PgAXTVNdpi69aQvHSTvqcuhgqp5L831sRDFuV6XFU3KhPcXbVusgLcGn4uyVHVxpGxYVXj03tl1 1V0mOUAndmG93BbjPUsQwKhE74pw+t7LPCMsjZhH2eeZBZkOovgA8ZgYH0QZrfrwfbWvD/0JDKf 7Jgd27sCM4FNuYPxjVQ== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 bulkscore=10 impostorscore=10 clxscore=1015 priorityscore=1501 adultscore=0 suspectscore=0 phishscore=0 spamscore=0 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 Free space inodes are never written anymore, so drop the special cases for them in cow_file_range(), fallback_to_cow(), can_nocow_file_extent() and btrfs_finish_one_ordered(). Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/inode.c | 58 +++++++++++++++-------------------------------------= ---- 1 file changed, 15 insertions(+), 43 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index dec1a848c7ca..c8292174b550 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1366,11 +1366,6 @@ static noinline int cow_file_range(struct btrfs_inod= e *inode, goto out_unlock; } =20 - if (btrfs_is_free_space_inode(inode)) { - ret =3D -EINVAL; - goto out_unlock; - } - num_bytes =3D ALIGN(end - start + 1, blocksize); num_bytes =3D max(blocksize, num_bytes); ASSERT(num_bytes <=3D btrfs_super_total_bytes(fs_info->super_copy)); @@ -1680,7 +1675,6 @@ static int fallback_to_cow(struct btrfs_inode *inode, struct folio *locked_folio, const u64 start, const u64 end) { - const bool is_space_ino =3D btrfs_is_free_space_inode(inode); const bool is_reloc_ino =3D btrfs_is_data_reloc_root(inode->root); const u64 range_bytes =3D end + 1 - start; struct extent_io_tree *io_tree =3D &inode->io_tree; @@ -1713,23 +1707,22 @@ static int fallback_to_cow(struct btrfs_inode *inod= e, * extent_clear_unlock_delalloc()) the bytes_may_use counter of the * data space info, which we incremented in the step above. * - * If we need to fallback to cow and the inode corresponds to a free - * space cache inode or an inode of the data relocation tree, we must - * also increment bytes_may_use of the data space_info for the same - * reason. Space caches and relocated data extents always get a prealloc - * extent for them, however scrub or balance may have set the block - * group that contains that extent to RO mode and therefore force COW - * when starting writeback. + * If we need to fallback to cow and the inode is in the data relocation + * tree, we must also increment bytes_may_use of the data space_info for + * the same reason. Relocated data extents always get a prealloc extent, + * however scrub or balance may have set the block group that contains + * that extent to RO mode and therefore force COW when starting + * writeback. */ btrfs_lock_extent(io_tree, start, end, &cached_state); count =3D btrfs_count_range_bits(io_tree, &range_start, end, range_bytes, EXTENT_NORESERVE, false, NULL); - if (count > 0 || is_space_ino || is_reloc_ino) { + if (count > 0 || is_reloc_ino) { u64 bytes =3D count; struct btrfs_fs_info *fs_info =3D inode->root->fs_info; struct btrfs_space_info *sinfo =3D fs_info->data_sinfo; =20 - if (is_space_ino || is_reloc_ino) + if (is_reloc_ino) bytes =3D range_bytes; =20 spin_lock(&sinfo->lock); @@ -1794,7 +1787,6 @@ static int can_nocow_file_extent(struct btrfs_path *p= ath, struct btrfs_inode *inode, struct can_nocow_file_extent_args *args) { - const bool is_freespace_inode =3D btrfs_is_free_space_inode(inode); struct extent_buffer *leaf =3D path->nodes[0]; struct btrfs_root *root =3D inode->root; struct btrfs_file_extent_item *fi; @@ -1807,8 +1799,7 @@ static int can_nocow_file_extent(struct btrfs_path *p= ath, bool nowait =3D path->nowait; =20 /* If there are pending snapshots for this root, we must do COW. */ - if (args->writeback_path && !is_freespace_inode && - atomic_read(&root->snapshot_force_cow)) + if (args->writeback_path && atomic_read(&root->snapshot_force_cow)) goto out; =20 fi =3D btrfs_item_ptr(leaf, path->slots[0], struct btrfs_file_extent_item= ); @@ -1857,7 +1848,6 @@ static int can_nocow_file_extent(struct btrfs_path *p= ath, =20 ret =3D btrfs_cross_ref_exist(inode, key->offset - args->file_extent.offs= et, args->file_extent.disk_bytenr, path); - WARN_ON_ONCE(ret > 0 && is_freespace_inode); if (ret !=3D 0) goto out; =20 @@ -1892,7 +1882,6 @@ static int can_nocow_file_extent(struct btrfs_path *p= ath, ret =3D btrfs_lookup_csums_list(csum_root, io_start, io_start + args->file_extent.num_bytes - 1, NULL, nowait); - WARN_ON_ONCE(ret > 0 && is_freespace_inode); if (ret !=3D 0) goto out; =20 @@ -3203,6 +3192,7 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_ext= ent *ordered_extent) int compress_type =3D 0; int ret =3D 0; u64 logical_len =3D ordered_extent->num_bytes; + u64 unwritten_start; bool truncated =3D false; bool clear_reserved_extent =3D true; unsigned int clear_bits =3D 0; @@ -3364,29 +3354,11 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_e= xtent *ordered_extent) if (ret) btrfs_mark_ordered_extent_error(ordered_extent); =20 - /* - * Drop extent maps for the part of the extent we didn't write. - * - * We have an exception here for the free_space_inode, this is - * because when we do btrfs_get_extent() on the free space inode - * we will search the commit root. If this is a new block group - * we won't find anything, and we will trip over the assert in - * writepage where we do ASSERT(em->block_start !=3D - * EXTENT_MAP_HOLE). - * - * Theoretically we could also skip this for any NOCOW extent as - * we don't mess with the extent map tree in the NOCOW case, but - * for now simply skip this if we are the free space inode. - */ - if (!btrfs_is_free_space_inode(inode)) { - u64 unwritten_start =3D start; - - if (truncated) - unwritten_start +=3D logical_len; - - btrfs_drop_extent_map_range(inode, unwritten_start, - end, false); - } + /* Drop extent maps for the part of the extent we didn't write. */ + unwritten_start =3D start; + if (truncated) + unwritten_start +=3D logical_len; + btrfs_drop_extent_map_range(inode, unwritten_start, end, false); =20 /* * If the ordered extent had an IOERR or something else went --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 4B8CC396B70 for ; Sun, 13 Sep 2026 21:21:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334504; cv=none; b=ulrKmHjkHws0PTBm5LuJZqtp9Q64Rzt5hJ/uy3teICJgldBaFcL3WtBCzrDbuc+Lff4AHbtidEVBSEjTgYstX3W7ncdMn+5Czv36N+ZpRA41kItMzGfR+pF90tmbtbCUm76+xJz3z2ox2rG4lcQPad7tXdze8uc/aspAYCvHzEY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334504; c=relaxed/simple; bh=dkg0MwKLg1iLy+Etq/q2Hvf0oO7DoeoyOqsWTmh7O0I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YmYem8fufqLYyEcO0ZCztZ/O0+MIlcLKa83sQ/GYl/BND7QDeznUyw0W1sA01ga+14GsVylbdBJ+jpERwnuUvBrPlxOO2O+nvinxfl0wSvzm9JEroCPs42M5dBPh+mUsGXlzeEOWEpSqtKhy7VGg+zy6Llalh2UHnjWSqvWBzNI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=uQc4+Cml; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=r+oqpklu; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="uQc4+Cml"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="r+oqpklu" Received: from pps.filterd (m0167074.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKXlnc634554 for ; Sun, 13 Sep 2026 17:21:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=V0ci pskccyeD14O9cgglEpzzEgLikHPr63hXXeLz4FI=; b=uQc4+Cmlja9URfRzCMMt N0Fj4IJECCkO1PINxnegaVEAULeM+/vietsKVtAeEHyY2Mdmj5+s34ftS9A3y3Pr B867D13YA/3fOIzBhwJZqR4CpWNbJz9NpeQickEVJqp71v1KIkZLtuAF0a7nUyr0 /TR8cnlQng1EoWz2RBfLzjoIsBUk6riUWex6NTrOJcMAnNuogHjYSWruK4WbF3BX kcHrz4QSjrOi6kxUxE3XpR6ynBNFfVHeOGPm5JC75ShirFCuzyVLkGGYYMKAgLSa HeZWCqJSjE8HZ284jRE4x0tw9/OUe8tyqtEeOrNv7sW5pt7PgW8FsTUq8hAmAozp KA== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gnwac9nx5-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:40 -0400 (EDT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-9399b66e0e7so641200185a.1 for ; Sun, 13 Sep 2026 14:21:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334500; x=1789939300; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=V0cipskccyeD14O9cgglEpzzEgLikHPr63hXXeLz4FI=; b=r+oqpklud08boTACTrILEFKm6SVYrMzY3rGrQCFBB3IFiJ+ztKrP6QSu24DcgzVS9j lW+rvwhkowoVfaF+Ko6n3gpHIpqPFxiXZqa06BFr24TOPOmcngLbnwDelYoBkZj0IdoX A1idPsif8qRzGwSZRiq5dMP3LMV19Wa6lFf8ImcwLYHDUd/izKAeUER1WkAVcsaFd9xa 8joQNerpBRQKsUiGSJ0WRBfhOKTMN9nX+G0tQzvjbug1q4ziZ00Uf6d6L3vbj0ZFM4Ap LS24okoBqifIffoHj3BJetxiPalvTo+GjzpKYVftltoe0UqOaZnOr/4Eu/ZHimv/wM1C BYtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334500; x=1789939300; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=V0cipskccyeD14O9cgglEpzzEgLikHPr63hXXeLz4FI=; b=JcxRZ03tcGEKFuh2IrBwqLOLVqMskgW7fgdIvh/Iy2JBba/4kATxgdDasFqs8YsQNQ vaf0n/AnDnpBv0W6p4xNTbL+eyFQnRGf+IsESogkP+t/+u6QFvdJIHKQz0Uc3Hq2jmj1 6QTxqj2Blp8SIe6UMQv28+mryyFcJapWJNBRUGGsuoeP4o6NUCXKzAEvcCoPfsvZJC7l +oSfoJ9YIqg45nWLaAZ5kgLaq9Fwl02G2Ed/Nwuw6GT9wAg4t2V1kUQ59p8fqQflk/eo 0f76wt27gIDHgkd71QU9sZ4LgqLcOgC5+MriluUvLl8SKRt3HLV1tEbnJm6NVO/X9Wir FGDw== X-Forwarded-Encrypted: i=1; AKwUvByA8Q994Y9PCHxJmeE5EY2AxRoYOr/ogGmIMMB143uxEAtFCJtWesMFkZNWLeRPpA6MiNN9YVkZUnLvyG4=@vger.kernel.org X-Gm-Message-State: AFuF++lygNc5NxWgZ9oYSak4lbfPV7CJLc8pF46qB5UMXS4n+T9RhF9k JbIe8iPGtSu8pRHL70YYfc8HBoyDqDPGCTODrjA1ynQC/joLTXpkPvz4UDI/fJ+AB0CtNJX7GSP LKso3B28dS8VBlNW/uA4ozpLURs0J+4Ji49UuQjbDNQCachInWJ4MhONFqiWJ3g== X-Gm-Gg: AYBFou3V2/S1AHIOpGYcZqf1/FDQIyFs1LpkJlbN5PgOsRQP+PnjrRw1YyavM6XMfk5 InoZxCiVgpYf3oYmYzgEKunAp/bXzN90VBN39bm0NNaxIkpn1LuRj4ijWt1UEC2zRMnJ64SbxOH yMim1mzS931EkUOjdTCqszz6I5EQgbecTz9EZUN/cghBkZQss/PyUBsCEWCtfyiJ1La9AsmIkYj 1Yoe+d5afyHPrMPgqwfkPZGg5FL6U2iBFOPr6euTPKxosBZ/O3oCE9sRg23jf7Ip1AX3fWZ+qdM hV6s/zcFzVAh3DCHGYZFjVbJombo4R0KaVzG9mLXV819XLzXyc7SAtOpBxepuxLV8L2aHkT57Ju SlpD2UBb0hky3zn6qI2GnKYAE0rlMDoVicRSMFwAdI9rFZv3gTaaEGg== X-Received: by 2002:a05:620a:3188:b0:939:5cd3:75ce with SMTP id af79cd13be357-93a0364c9c3mr1117787085a.8.1789334500269; Sun, 13 Sep 2026 14:21:40 -0700 (PDT) X-Received: by 2002:a05:620a:3188:b0:939:5cd3:75ce with SMTP id af79cd13be357-93a0364c9c3mr1117784485a.8.1789334499712; Sun, 13 Sep 2026 14:21:39 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:39 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:26 -0400 Subject: [PATCH v2 14/16] btrfs: stop special-casing free space inodes in the delalloc accounting Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-14-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=2215; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=dkg0MwKLg1iLy+Etq/q2Hvf0oO7DoeoyOqsWTmh7O0I=; b=KdeJK5DOxzGkfTa0NRh3Nqvj7e4CiCfIO2wKWAoWJ60UCAPZ4iVFaElD6mntCkUkz0aSh9dbg YR/CWxQej+AAOAI0E4EckQ3Qtg5kZQ5L+Uvu8pJLYgqwhnTnue0JHtM X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=BqQIUoX5 c=1 sm=1 tr=0 ts=6aa713e4 cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=azVShVRs0zEubeQ0wG0L:22 a=bn-TaVTt-omw3cABb-QA:9 a=QEXdDO2ut3YA:10 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-ORIG-GUID: 1dBGCi_9ABnk9tIboXsw-136KlKWKZcc X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX881MqOg5zrQG zOynFYrxvVoSGjMCmN9mKFyvKcgEjwXyIgQAb1XJhv2Z4dj2bslsAxNRiCvGuWQk4nrTKFf4OCv AybCJUQGaKeqM3Ga/dRwBUwggKDJvkWKwiBNiA4kDUH2qbxrVdWI X-Proofpoint-GUID: 1dBGCi_9ABnk9tIboXsw-136KlKWKZcc X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX9TfPFzIYsU2o k7wA5tqJjp8COB8ticdBrnS95Sajd15xx3rPLvbPEUv84tSlVsNkRokOJfMS1ivb5/zFxe09BfD MudxCWaZl9blf9c1vEd7t6dVgNW2LivvjmOb62/8+xqD+ZQfTl3X/k23zxbsHQcQDmsyAMk3QiV /LeUIrEj19cv2hUVsap/F4cjMNDm2WMUq2k1AS1yhO+LMWcCDcFVaHfr9w5wgGfaFvlTQOZMI2X 35SrR0k9j/Usqx78rzTnnvyrcF0SWxtmFzTLtWjrE8AvJVSaON6G32mnxkF37ezmN4qGUyzzHes U5ShtxZ884Fy/58GriABGg+AZ7K5GXyJzGOTyxBZUQwe9xhOZ1leScyg4iVnNKj9Vk8zROeg/j1 V8YmZ03+1OGEY/su71HaMLxTVGc1N19FBvGWhGy6ITNVBvRaz6HUu840f9qJYJXJ4QWHEHnDsmH /SJdwThoDLxwZaJ6M8w== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 bulkscore=10 impostorscore=10 clxscore=1015 priorityscore=1501 adultscore=0 suspectscore=0 phishscore=0 spamscore=0 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 Free space inodes never have delalloc or outstanding extents any more, so they don't need to be kept off the root's delalloc inode list or out of the outstanding extents tracepoint. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/btrfs_inode.h | 2 -- fs/btrfs/inode.c | 5 ++--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index 26cc5d1aca4c..795bb222a2d0 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h @@ -402,8 +402,6 @@ static inline void btrfs_mod_outstanding_extents(struct= btrfs_inode *inode, { lockdep_assert_held(&inode->lock); inode->outstanding_extents +=3D mod; - if (btrfs_is_free_space_inode(inode)) - return; trace_btrfs_inode_mod_outstanding_extents(inode->root, btrfs_ino(inode), mod, inode->outstanding_extents); } diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c8292174b550..89b50d4e0400 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -2614,7 +2614,7 @@ void btrfs_set_delalloc_extent(struct btrfs_inode *in= ode, struct extent_state *s * and are therefore protected against concurrent calls of this * function and btrfs_clear_delalloc_extent(). */ - if (!btrfs_is_free_space_inode(inode) && prev_delalloc_bytes =3D=3D 0) + if (prev_delalloc_bytes =3D=3D 0) btrfs_add_delalloc_inode(inode); } =20 @@ -2672,7 +2672,6 @@ void btrfs_clear_delalloc_extent(struct btrfs_inode *= inode, return; =20 if (!btrfs_is_data_reloc_root(root) && - !btrfs_is_free_space_inode(inode) && !(state->state & EXTENT_NORESERVE) && (bits & EXTENT_CLEAR_DATA_RESV)) btrfs_free_reserved_data_space_noquota(inode, len); @@ -2690,7 +2689,7 @@ void btrfs_clear_delalloc_extent(struct btrfs_inode *= inode, * and are therefore protected against concurrent calls of this * function and btrfs_set_delalloc_extent(). */ - if (!btrfs_is_free_space_inode(inode) && new_delalloc_bytes =3D=3D 0) { + if (new_delalloc_bytes =3D=3D 0) { spin_lock(&root->delalloc_lock); btrfs_del_delalloc_inode(inode); spin_unlock(&root->delalloc_lock); --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 721F3399011 for ; Sun, 13 Sep 2026 21:21:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334505; cv=none; b=k1owmMw2rmxwu96ggUqH0B9Ts73FqsfN8aBYPBmhG5fFZYhp/5yLmt5cQ2ml9pVzbP29ZMhYKX+H1dHBVzkgQnogmlr/UJEj41Ih3w9JZHeuxLssnNnUQFGvBpSo6Um4SCf2FXM/3AZm+HkIvYwYKPxQcJaFZ4Bktp1bDDdhrek= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334505; c=relaxed/simple; bh=IxPtZs7YmG0KTAjKIomldxp3suS2xlB2WlerF1Jtwhs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ViIRDI6ua0bqmsatlfLoPoqJggtIpfr+xZSXOW/WIBrP++o8fwr0YGRDIl+v60seiSXJA6XaNsIKAcNbMCD20cA0JJmvVPgaaCtZ5uytRYXLeIfpFWL27Tvf9+YUrGczuJsEHwZJLVMMFWNpgxawB8DEmWCy+uGWIi0QPS53uX8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=p6ojGcLn; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=XlTi0WyK; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="p6ojGcLn"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="XlTi0WyK" Received: from pps.filterd (m0167074.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKYWKV635253 for ; Sun, 13 Sep 2026 17:21:42 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=Jdph n3uGMtosHUIIlsCZR+S+zVxJ+iV/LKrDbHMNan8=; b=p6ojGcLnacZaWlqJxM8m idUPiStf/5BtKyU95PGAXHmuF9+lzN610mKtM/kNwgDMiEwnscgistSHyAeLRuaL eOFvZWCB+79CmS1wNqwqgJhduXz9N4aZPYV/GuvOE+1ppF8DQsUI8KmKpJgOMQrI L0AlJVyVNzfnKFkUOhWTuTvnyhofKM9NDCptcTKvGkVNXfwaEnPZLG6jBBtq+Jqs qgVNmkXq0l0ZkOyqEuwLXijAB4LePSUMbVJUF3qYK5ZBkoc7c8mEWe7n5eV+UTOv Heip/B6j+a3/6eW4RRe26FcrWcEZrJz7mY8aD/YZBh5MkmaNxiG19bH1jmaiwWbp Vg== Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gnwac9nx6-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:41 -0400 (EDT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-90e8341cfb4so58078516d6.0 for ; Sun, 13 Sep 2026 14:21:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334501; x=1789939301; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Jdphn3uGMtosHUIIlsCZR+S+zVxJ+iV/LKrDbHMNan8=; b=XlTi0WyKr7KJ6YyYVAwqYHbPrtjc2uWgUeZZIUt7L43Ip9617ShTAvgq81acLEXJFX lhczWzyJZx73qIC44aS+TYb1QnIxByRNHpjFpK1j/U/pLCKnXQ2V4FvnpVPdn3e+7IHC w473JVTEHLslKHl/a1smw9PsZ4VDfxegNlC5QjHfFPTbi9z6S3IeXFDNfn8jU1AP5AHh M4EzK+eJpD10xCHFEp7mby3CYT0NDZMSkmHJDUOGYkWJdYh8ZgkvIx0hO4+ZDyWvF56l r294shIllc/UwCoXFVTsbpTdB0iNoaH6xbxQKOIjqWcCv56tlblxjn3Fodm7n0BEYudJ ScVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334501; x=1789939301; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Jdphn3uGMtosHUIIlsCZR+S+zVxJ+iV/LKrDbHMNan8=; b=eb++eb46ikNG5X49opTB6PvkDV2OyH/oey4Js1TYVrQNYJKcm54QXW9MkM3GVY8baP +BAmymsnZGOIcE7s9PTlCy9qNDhF4nfKxMPCWnBU3kg4OwHhimfPLd4luXYFY6LQiMZY pTvd9qIOCIxNCz7Xz/7waXtUZiw2T31+KrS+rUEgusyAxnrWiuVicQgEJY5POAqUS7pW Gi9ubByX4hQGON8bH19bS21ta6pIe7K6YgL4TRM7BlZ2SqcRjaF1W6pU87pn3yIJKak8 pg6B3lRiKTNiuM7XNGBuoAX+WOuO26qwCBnCZu/EVeZ9+UVKX5KQXxklvSIb9dbL8sMJ 6gsg== X-Forwarded-Encrypted: i=1; AKwUvBw/QF5I0kgMRV8BX6AoX7+udBPpy+3uBV/0tGMuBpXVcSFt/sOE1dkSrNNNrl+vs6ZUwlZ10Y/DIrC3Juc=@vger.kernel.org X-Gm-Message-State: AFuF++ldtdChitPoaaTxDkWIzOkwPmWPoCAWvii7WE5TB2gye/CTOsS/ PTIu1mNgQn4irrBOCbuiM/ZQM2zV7+Vpr50oajEmv4fnyq3AHUc7E1zUSBshxZ9zZ5RGixDAEqO xkHij6mVvVfaWmJbzcWYLm5rUiSiJQFC4dI2kAoPKNBneo60JcydGEgQwIVz+GQ== X-Gm-Gg: AYBFou307/rd4SvsmHiliyqKP3xTNAuB2YuYXQsy58V/OuZQRHXTa1shdyV5quP8dVT d792OfN3aOK2uNSfd+cwB9OmXkRd0VOzfQumHKjbMOqlNMUNLlLkmdJHI85yvMo1FNepsW/zWfj wKlf9Y2Ye957utzVBVpyObZmXdh9vV2a7UYvPL+Gg67K8U6zfWEbisI986fwtSsML1JHAU0eX+k 0LkjJUBlQJwlNXxlc3S27ULEDVB2QMh0BixUD34Zsdyo1xPmyyaKRwyMHYLAqaWAA6SD2gJfJlV 34bWngDbbBe2gDyAFZ+yy9qObRek6hTo8xrQb/x4W+mKuLc+NKM85ccAIMLPDmrrwZ7nuRhDAUu zO2e8pnm6SzmwFVtLhAvZl6DejPtMaFZ+QgwFBqxOq4fcRFICltwugg== X-Received: by 2002:a05:6214:2307:b0:910:722f:b8b with SMTP id 6a1803df08f44-9121da7621emr122538056d6.21.1789334501265; Sun, 13 Sep 2026 14:21:41 -0700 (PDT) X-Received: by 2002:a05:6214:2307:b0:910:722f:b8b with SMTP id 6a1803df08f44-9121da7621emr122537846d6.21.1789334500804; Sun, 13 Sep 2026 14:21:40 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:40 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:27 -0400 Subject: [PATCH v2 15/16] btrfs: stop reading free space inodes from the commit root Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-15-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=1999; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=IxPtZs7YmG0KTAjKIomldxp3suS2xlB2WlerF1Jtwhs=; b=HwDXp2hZAq0UmkVROrNFPxKx1jq+lektak8Bvum3837X4k8O1P211QiJgEpv+APy4/X0vBUSg d5RwEzlZPqZAW32Br8ft6qSbpRkneztdVNIf8DMdNUCeslpHrOHW12G X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=BqQIUoX5 c=1 sm=1 tr=0 ts=6aa713e5 cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=azVShVRs0zEubeQ0wG0L:22 a=F-rX_8kjA07mH5tGMmcA:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 X-Proofpoint-ORIG-GUID: qOR0l0kZPhQYHARfNwqUr0Ojw2E-kXEy X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfXxux9gYLaM0os YK7LXnXrMoiRwlfTVT9Vi29h6XJqBAigul6cYeVnP39QQT954262J6La3+X+N4a5Ej6B4l/1HgP Ml8zCNfs5TxXrY9KN4EuwiwSEhq0En4wsludrQnDo+DhOwgyFZm5 X-Proofpoint-GUID: qOR0l0kZPhQYHARfNwqUr0Ojw2E-kXEy X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNCBTYWx0ZWRfX17Xyuanpnxt6 gAZTtoB8NfjPZf5a5gmUrXlhVv5s5u9QF1bmAgddG41zbMu8dgf8Cqpyvlpmj2Pkkh36siZWOa1 PSHsO4DZjNgS3CXGortrpTLykHfInjP7vfA56LcfW3/1CoZ6qgV+i6RtSgDP0Hsf0MdQdfhGJM1 I2N1Bk5fnCq7mHOnh3cRNQPGg2fpoldgs3DFiBhc2d3CCxgRCQV4gBHA65uyu//3RROOGrIIGYn iZNwnz/WfLZwRxvgl33oubG2CnVpr/xozfUtzifNw1L7cc26Z0qDheeAy3/Tb1offFvzCdb8uof ednzAydjtdwZUuhQUP1OvYlWeJtPqPAemr8J7Kzv96Kuq3OQW4TUiNqKdc74VDUfBsIbANzTnCu xI2sl750/VMm9AiUSqHT1tAq/wGUqMO4tlyUrq/m6jSjgPReYcrBpvJadP790LYftWw1TByDRWd s+BInc+X2tpbcL5tlEw== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 bulkscore=10 impostorscore=10 clxscore=1015 priorityscore=1501 adultscore=0 suspectscore=0 phishscore=0 spamscore=0 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130304 Free space inode data was only read when loading the v1 cache, which is gone, so btrfs_get_extent() and btrfs_lookup_bio_sums() no longer need to search the commit root for them. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/file-item.c | 11 ----------- fs/btrfs/inode.c | 10 ---------- 2 files changed, 21 deletions(-) diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index cf50fd623f41..484c04de1af5 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -396,17 +396,6 @@ int btrfs_lookup_bio_sums(struct btrfs_bio *bbio) if (nblocks > fs_info->csums_per_leaf) path->reada =3D READA_FORWARD; =20 - /* - * the free space stuff is only read when it hasn't been - * updated in the current transaction. So, we can safely - * read from the commit root and sidestep a nasty deadlock - * between reading the free space cache and updating the csum tree. - */ - if (btrfs_is_free_space_inode(inode)) { - path->search_commit_root =3D true; - path->skip_locking =3D true; - } - /* * If we are searching for a csum of an extent from a past * transaction, we can search in the commit root and reduce diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 89b50d4e0400..163f26fe36e7 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -7230,16 +7230,6 @@ struct extent_map *btrfs_get_extent(struct btrfs_ino= de *inode, /* Chances are we'll be called again, so go ahead and do readahead */ path->reada =3D READA_FORWARD; =20 - /* - * The same explanation in load_free_space_cache applies here as well, - * we only read when we're loading the free space cache, and at that - * point the commit_root has everything we need. - */ - if (btrfs_is_free_space_inode(inode)) { - path->search_commit_root =3D true; - path->skip_locking =3D true; - } - ret =3D btrfs_lookup_file_extent(NULL, root, path, objectid, start, 0); if (ret < 0) { goto out; --=20 2.39.5 From nobody Fri Sep 25 11:08:01 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (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 1830239C657 for ; Sun, 13 Sep 2026 21:21:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334506; cv=none; b=FDSzbya8nqOTc40t2XTyu3nKIGciv9aFLDLMgvZSaoTmYQzGxRT01ZVzelw5u9DDHNUCl403S22iC9k+rO46hO3gi1FghJ8pby5RlUjwilly8Umqvj7Y77zy0rD45NchUD8FN2w2cgSBKvpcI6WGEhaSS6UAx48JgnU/lQf00L4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789334506; c=relaxed/simple; bh=UTR8+ch4ryIY7tRDO5W3HY3l+J2/4/c+7TP/kDYrcqQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Sdldi730HnX4JFfAjKYq+VEGi1M5Us9CmOoLnCJ63QqRdgc+ZbKK7VlQ/KNge3lmpzFo8xKj9thsdp1pmK8JiWZqIm/zzr8S1mdBCyGmk0i6128Ac6TP1gWR2O8g5o+u13oV+6FUpSMUT7QsZrgNNcm8BoXjb0pwZcvjC8xKydI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=N6aYCz98; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=zJn3UOdS; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="N6aYCz98"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="zJn3UOdS" Received: from pps.filterd (m0499198.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68DKYDue1192645 for ; Sun, 13 Sep 2026 17:21:42 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=Ubm0 LbdrqVHYg4PE+94rjzX7D+QKZrMTkJ+a2PDrQYg=; b=N6aYCz98usOklcND6VjW izjfgVh3jZycdRHSkWmDskMyG04aU1oO9iMRjo3cHQtH+VL6hlmBO7XRoDT9YsR7 sGZPA9f19riUOzVan/2P7yWzKgeGXfkbYWk5vJh92ixqHeTzyrVlcDOQ9ytU8+SD MtBHlBi+J004crPbM0MJDzqe+SlhOS8EzPYT7Rx48jK5bEXVqVLhyk7laQjV+6qe jf54gbKL0s2eKpMhIZQFJHtB9ieqAbZC/NFRjyWsWlHErYnXGUtoz+Ke6rCeyoKQ ofCOc7F5x/JywvISJHL+YrOxo0cSrzj46cBW/YmonuukVLFowf4IGnYITR9RR8Ku dg== Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gnqqt2s22-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 13 Sep 2026 17:21:42 -0400 (EDT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-90e8341cfb4so58078676d6.0 for ; Sun, 13 Sep 2026 14:21:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789334502; x=1789939302; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Ubm0LbdrqVHYg4PE+94rjzX7D+QKZrMTkJ+a2PDrQYg=; b=zJn3UOdSU9pXwDGwOc82teU5yyewsx1izR0Szbi4P2siljX5PPrEm6SBe39TLITpeh F0Jq/K43ud+Rzsf5tb5RHjMsDQVJd0D6TWu1x2+YDwuXotOCd/ZyYaWrgJDzkbPybsXC tN5SJQE5ctW6bgtu9g74e3qjavDPDEIySlxAdmXvvDKZ+p/Kw8on/unskueRHVApvVlw N3XTPCUAIKVl/DDvg8Ew/yZKgd61Aou18bs5PZ/FpWDTnR7zKQsSl4R26d7LB0fE6OUB yo1m2Hk7/3h148EIDXOu23Nws/rQSGDVsypMLnWUtyP/ONRkiJDzIQ1106S0ksUrEA7X ThAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789334502; x=1789939302; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Ubm0LbdrqVHYg4PE+94rjzX7D+QKZrMTkJ+a2PDrQYg=; b=rER9zCDJAh6Tu1KDBzqhX7WFKO5ciHQzyiu78mCfisy3SSYxfJf21T16Q4Rjca45Ge sTaGLNEmayzQbtFI3ohxsMFMgO7jdpJzze/2o1KABqk+ayej4BDVTFGplTtSjxO4Rvi9 Sv8CAgXwrIEZXzYTZEsuL0KgeOqk1svj4QvStrxdaVe+ViXUrkwP7cpA0sEuE/xHjgNU +ZR91WF5h3fv/ggPAG16CotIpig8PdiCXpMiLuFvOq3GQl968jvCiiDgHoMLvk5MSv9b b41JTFfme5AcTVyFFYzv+u0UfrHgriwzUxruqj7s32c/8cjz9qhPXmaa/rE+VA6WJ/e/ gbGA== X-Forwarded-Encrypted: i=1; AKwUvBy2OJnhb+VJ0q3s3ZQSEjJ0mV8g4J96Z23yt9W91shFmYjq2aS+tRvI9GeuXi+9DK4gCSFSIdzzWHYTkeo=@vger.kernel.org X-Gm-Message-State: AFuF++nMOVOHr11mKcZ8kkbetQRLPR9j+jHr6Qyg0mIbKox0sDiACZbC N75r8RVHvk4Q2F3rswSW5itbKCRPtt1SUkw6oG7jPl/9+Cr4bJ05+aORL4/C3+mQEhpkMsDlfVZ hgIC+fkKYvj8vKOZWyqEhj8aLJqksv2QtGaPgPScbe5zzO+UezZwm+03SamRCig== X-Gm-Gg: AYBFou0GpwU0HNLkM/lvEK9wPsC38L7GLPkr2x66zt0MG5DTaiOjNyDYA2wEwnBhfNO WJQetbTJe9Jf8vmXhYA5u4oO/Sg40FZPZPeK3mn14A/V6cutx0Qo2ZQ2lVpke1Q03JdCd+25ADZ JtFpIkW+PlBMK4+xAOSX79UA+bqDrLFYX22+QrPwBhmxs3mN5ayhv98j1i3tAZaxxFpqlGQWFPt BM0D/rsvlxIk9kE1aV/3+byYWx2WjCeeh4q4IJPF6ZeDzE8zbkxXCqlOTUMNA5U4ead1Ct8Zvbn WcAphdEwf6KONEVYUennozJ8YvFGEDsbRVDfo96UhEPw+FVFJ92Cn6KWYWujF5pr5FjqFVBAQN5 fs0v6myplOUQYcI0O641uuV0f3rzs7IrZ+T70H0TIa6qeURvVVQvQsA== X-Received: by 2002:ad4:5cc3:0:b0:910:3453:d4a5 with SMTP id 6a1803df08f44-9121daaa77emr124611756d6.31.1789334502016; Sun, 13 Sep 2026 14:21:42 -0700 (PDT) X-Received: by 2002:ad4:5cc3:0:b0:910:3453:d4a5 with SMTP id 6a1803df08f44-9121daaa77emr124611556d6.31.1789334501613; Sun, 13 Sep 2026 14:21:41 -0700 (PDT) Received: from [127.0.1.1] (nat-128-59-179-215.net.columbia.edu. [128.59.179.215]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-9120f4d3a50sm78432696d6.40.2026.09.13.14.21.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 14:21:41 -0700 (PDT) From: Tal Zussman Date: Sun, 13 Sep 2026 17:21:28 -0400 Subject: [PATCH v2 16/16] btrfs: remove TRANS_JOIN_NOLOCK Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260913-btrfs-remove-v1-space-cache-v2-16-186767a7e106@columbia.edu> References: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> In-Reply-To: <20260913-btrfs-remove-v1-space-cache-v2-0-186767a7e106@columbia.edu> To: David Sterba , Chris Mason , Qu Wenruo Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789334484; l=3141; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=UTR8+ch4ryIY7tRDO5W3HY3l+J2/4/c+7TP/kDYrcqQ=; b=YXPUciB67uSyqLI9Un79rZpTow+H/No65LW1qiYVQ7f51090sdxJIx7JufFADXGN8Zf/x7Fk5 1fXGTeA3qE+AjWlrOoOOQ73h8x7w2TPLdlL62Cmx+JUiiNR4cRhu1Oi X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=N8y8hG9B c=1 sm=1 tr=0 ts=6aa713e6 cx=c_pps a=wEM5vcRIz55oU/E2lInRtA==:117 a=2jelXx5xVcRIF5zNctN5Qg==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=BpGzv1V74M3SfeTrGa8v:22 a=bdDZCe7T2lofFMgrKTwA:9 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEzMDMwNSBTYWx0ZWRfXx+jdxdFa7QlH 06CSwQ2QnSsTnIB+gFhybjWClS+VNxCfeOWkxEw2u2jARs8noNFa1SamRC6JARccYVG6NqfG0US Z46kv2Ybbri6S6r4Z4QQNxq76YuYbLQwZKn0UPnl9+/5G4ShF+n4 X-Proofpoint-ORIG-GUID: 3x1WJw7_UWvsy2lDecrs1vYJhPhxgVDf X-Proofpoint-GUID: 3x1WJw7_UWvsy2lDecrs1vYJhPhxgVDf X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEzMDMwNSBTYWx0ZWRfX5nLL2DxsXMH9 kCwcbOYSX8L7Ws7bVPGlXIeTo0U2XQmRuVCkI4wjl9i7bUanvhhYLHq4jCOEj8Owr8brmO9Imz9 fYocnOz+VuIpZOoynj4ZQ0nWbDuAFUYf6wabjZgskjcwf1VJVjoC6DbJyKyhs/P4BFjKYY9qRxC lH63+iCvtwIgwxhvm9ynPE9myiqxbofgFdmQI5lhCc71pKJ37nCv/+MC4/87xyGI69FKMOdXOhH Yu+2XmUZ4+vEKTd2B/peJ6ZJSLsTypWVKDlWZqH67t5SwP3PjrvToXUkyiVhH014YEkCX5YLZu2 aOh4EkNtU1KZ3OJsfVdzBWGXeLfkHdr8G6zz2MBa96f6dBZFEO/Pon2YOeu2+4MNSVXmOzI3vhf 28r/pERcZ1jlrNVuloDRqLlMt2c3i6FQCdhfDXbkRvLg72I8q/jQS8lTovwtk0DCRM0Lm6Dmepn 1pqWOuuJ4+tnmQK5zJA== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11904 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=10 spamscore=0 clxscore=1015 suspectscore=0 lowpriorityscore=10 adultscore=0 priorityscore=1501 phishscore=0 impostorscore=10 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609130305 btrfs_join_transaction_spacecache() was the only user of TRANS_JOIN_NOLOCK and is gone, so remove the join type, its entries in the blocked types table, and the special cases in join_transaction() and start_transaction(). Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/transaction.c | 17 +---------------- fs/btrfs/transaction.h | 2 -- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index ccc8d5840355..01d577cc13bc 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -125,17 +125,14 @@ static const unsigned int btrfs_blocked_trans_types[T= RANS_STATE_MAX] =3D { [TRANS_STATE_UNBLOCKED] =3D (__TRANS_START | __TRANS_ATTACH | __TRANS_JOIN | - __TRANS_JOIN_NOLOCK | __TRANS_JOIN_NOSTART), [TRANS_STATE_SUPER_COMMITTED] =3D (__TRANS_START | __TRANS_ATTACH | __TRANS_JOIN | - __TRANS_JOIN_NOLOCK | __TRANS_JOIN_NOSTART), [TRANS_STATE_COMPLETED] =3D (__TRANS_START | __TRANS_ATTACH | __TRANS_JOIN | - __TRANS_JOIN_NOLOCK | __TRANS_JOIN_NOSTART), }; =20 @@ -310,12 +307,6 @@ static noinline int join_transaction(struct btrfs_fs_i= nfo *fs_info, if (type =3D=3D TRANS_ATTACH || type =3D=3D TRANS_JOIN_NOSTART) return -ENOENT; =20 - /* - * JOIN_NOLOCK only happens during the transaction commit, so - * it is impossible that ->running_transaction is NULL - */ - BUG_ON(type =3D=3D TRANS_JOIN_NOLOCK); - cur_trans =3D kmalloc_obj(*cur_trans, GFP_NOFS); if (!cur_trans) return -ENOMEM; @@ -708,14 +699,8 @@ start_transaction(struct btrfs_root *root, unsigned in= t num_items, } =20 /* - * If we are JOIN_NOLOCK we're already committing a transaction and - * waiting on this guy, so we don't need to do the sb_start_intwrite - * because we're already holding a ref. We need this because we could - * have raced in and did an fsync() on a file which can kick a commit - * and then we deadlock with somebody doing a freeze. - * * If we are ATTACH, it means we just want to catch the current - * transaction and commit it, so we needn't do sb_start_intwrite().=20 + * transaction and commit it, so we needn't do sb_start_intwrite(). */ if (type & __TRANS_FREEZABLE) sb_start_intwrite(fs_info->sb); diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index d2e2dd6101bc..813f0a261b21 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -100,7 +100,6 @@ enum { ENUM_BIT(__TRANS_START), ENUM_BIT(__TRANS_ATTACH), ENUM_BIT(__TRANS_JOIN), - ENUM_BIT(__TRANS_JOIN_NOLOCK), ENUM_BIT(__TRANS_DUMMY), ENUM_BIT(__TRANS_JOIN_NOSTART), }; @@ -108,7 +107,6 @@ enum { #define TRANS_START (__TRANS_START | __TRANS_FREEZABLE) #define TRANS_ATTACH (__TRANS_ATTACH) #define TRANS_JOIN (__TRANS_JOIN | __TRANS_FREEZABLE) -#define TRANS_JOIN_NOLOCK (__TRANS_JOIN_NOLOCK) #define TRANS_JOIN_NOSTART (__TRANS_JOIN_NOSTART) =20 #define TRANS_EXTWRITERS (__TRANS_START | __TRANS_ATTACH) --=20 2.39.5