From nobody Fri Sep 25 22:21:06 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 EDEB72DD5F6 for ; Tue, 8 Sep 2026 01:19:53 +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=1788830403; cv=none; b=ID0qIPKuzzHGEIcqOmzHCvZmIxQzXOkk7fFj2r/edsOkARjwmy/bFdERMxK1wc1delcqO/GScg6aoot4s+4D0NBTLR8Zw+ZCdk77pZQYfNrjLOzL65vHDVmzS5FI5KXw1Temc0n5dbE8ALec9Vls+aiUxHfo9+g3sKCPCFs2wJU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830403; c=relaxed/simple; bh=lp6N7P6uRAwF4k80VrSyckftlj/cB8cKUNVuGaugFXs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sKfAHHLlQlwAJqmjsh2HNPka9koesTXrfdB2rcrPoiEtM6FR5jUwmvSBXoV0bq7DheAIl1UhveazYLrQdLoK3UXt6SpSk1XP6V5C7mxLWKDBrc2/HSPjtwOcl4SrOdNtNKLZze4DIRJmsuBgQ1wb1k5gweMIQX9AHEPVZET8l3s= 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=GGFNQ8el; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=zr3hgV89; 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="GGFNQ8el"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="zr3hgV89" Received: from pps.filterd (m0167076.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880vKTb3906570 for ; Mon, 7 Sep 2026 21:19:51 -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=GGFNQ8elMGqtaso+GdcV MSlVH9DB7bUvhPZQM1gfOKOEsz1GyCGtQlkBpMmLcLXTitWeTCaXjOwn4vwknp5f lWOF94QgsdzigPrYDDOu8jOK6AqgYyj0Hw0Mk6CYK/NpdrAiO/xXnyT63Pm3lnhH hbj1368ToS7sIjv7ycqdRHZGbmNYTTVRTfnRsuJenl2/gs3Ot2wDH3sE18lZNw9r n9UO/L9ePPaT2WLG5fJ3YyWWt3+Fzh3QKfYlNX1g4h8SxjBfjD6qO3RRwAErMEyI qnvHrafHslKMJAOe365xcRsUHLRBvu05OfJbeGJHsm2MC5Nwpart8+hZjLYBjDBz wQ== Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gj4yjryep-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:19:51 -0400 (EDT) Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-530006c6d43so72699431cf.2 for ; Mon, 07 Sep 2026 18:19:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830391; x=1789435191; 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=zr3hgV89CkdmLVlqco3AR7TavtMprbUU6g6P1v6RTj/AB5MrIGBJSzr8nEfeEnSaew sRw/ME6QZmd1ImOSznXi0jJZ8B8tjGVy97kIBhkiufPrY8qgx1QUEXsfXNpOWBJHYcj/ j3kZwTaIi7l41vRxeMg0pLGbngBTkh4fRYFU7PTsMtzrFYj4Nrv0uY6xp13EI+YA9qT9 quUtpgFes2bXEi1S6Ou9LCwwe5E1NzaQg8x0qDPlPHvO3RhfyIUtXTLP5BnDUz+fLYK6 qxYAMTfScBBIBlNbuHz7hWonioxq+dJbzVptud22jER3bkg6f4knXUbxKlIgpRVG8hxJ 2WHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830391; x=1789435191; 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=cxF3DIcIeKrrojOhtWjNztfcpzdlknpadLfrIh76FlAnhrqbfJa4YcriYvjGBpgl92 l3Uzg9qJJTqjv9+loAc88DVsk84ZU6+XXLYKctWU4CTIMMAtLOXwKf6c3YeFcSTz5rXe upeq2zn3HBL/TSck+Va43HqBdpJIAXQzrnTEwRZKNzPPfYBC2flL7e8V/4DgRpl7Fd8f wP99kE0GVmD85muabrFcrQtL6ELZ2lZjMwh4hDoo8pPYx9zQPMw1dID0ZODXSb4QN312 dBzIxXgHlUojlMZiFEJ/Lrmj9o7P0BjMuDmKG2dwx9jfShDxVgwax6FcHAoE9x4uVYgv Zebg== X-Forwarded-Encrypted: i=1; AKwUvByAd51euxPZvSGT17NtM2gngMYtfzfNIyUL7HKrdDn3PGEn9Zu8hvqpLpgG2hSjK4p+pW57y9noJG0YDoo=@vger.kernel.org X-Gm-Message-State: AFuF++m+61ft+lw9uKWAHn41QNcaGpnND7H5yj9lMGNWVNrWXZIR/Q4L Jowl+O+T8HNVRdvCLbWPXJWNsBrES7LF3MxhsrMwXhtAWCl1m2aH0oFf1ZqFKlRFg6hP0h0hFBl Ik3ULDtfmQIn5ZvRbk5DfKMx+ndEa7XOa/hk1tlC/8mrR0P+8859rV7qpyqShFg== X-Gm-Gg: AYBFou1JufzyUcIIdoKCK/jQF8Bg+iRWlSZLRno5A3I1ZKwHNvK14VzMWt+sT5eNrRf xbQAMtbmpOoA1/FgR1FMC4sbx6eFH4bchCrerIYTrzcX5QiOZQa6F4hJ8AqJktoU4YX5yEwwXFd l0TARyIe+0U68tFl0Vzgno6ktt9jd8KV6QiGnEa9PO2UNEqLHmh8wdWs9nN2Q5T+ryXAnklzl8f 3336xCP0PvGORAinkqhgRiK2/dBdJFFHe58E6zsjYQZWeaFiq1sn+2xfKRotqikKt8WV/R8RFMH GQPB6Xy3QfjjTTFytL1Ahx0++hoalq2OARSTla6xnan5mSOjWHH8emn4F7RIa4qgY6XIRuoVwbG lxtMUE7yG/4apwcXqgpJ5KglDOtvxf96RExa80x7TJjgP+v4HqPs= X-Received: by 2002:a05:622a:5c05:b0:52d:8257:666d with SMTP id d75a77b69052e-5305483acf5mr345357051cf.11.1788830390559; Mon, 07 Sep 2026 18:19:50 -0700 (PDT) X-Received: by 2002:a05:622a:5c05:b0:52d:8257:666d with SMTP id d75a77b69052e-5305483acf5mr345356401cf.11.1788830390069; Mon, 07 Sep 2026 18:19:50 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:49 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:16 -0400 Subject: [PATCH 01/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-1-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=3265; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=lp6N7P6uRAwF4k80VrSyckftlj/cB8cKUNVuGaugFXs=; b=IMvkXE5GdPNas7sHyPPQwTAp/61WcaYW99DKn1n6QvUNWjB9tm3SWAY2+9Qii4LHZ5x/oBG96 ilUy6ok7bUnC6YvNAOF9aNND90b/CoBmBaLGvxMlkFvDQFRzOPmzxDg X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX+3UDQEnMgkoD ZQg7Ap5bedNmlqBuUI6x68edHinsMD6hv9OEo4zR0JtbnVzoEgDAJUhOjT0ZK8EHLsTsSGt+wPS EnEjvGL2BdrJEUUGcLzQjNHhaHDsjmWctv5s4Pwz1p3RWxWVtI9KuS4k60+3OApd7En/1lfld8x AYUzA39IOElDKeK+BEm4+oNARnp9o3TNqKUwB9dvYjnLSeqySLyR4VYVAKiAJbSUnXutPgs7DsH OqkQDSTU1lonqWjksrasQ6M6xT4l3TeaHo7zbzlkHuCPR6J5eyj7vfvY8u1mhjI+iWnHFZblRrC VieNQhYUWL0wTKpzNJkADhBkEawZq0AIm9FW5THRdASiWbf78E1qe+nidM5hSODm86D/LDzXCM+ FjatbeuBfI3U03/d3UWTIBZ34Q/xdpzry/iJincohXoWGPx8WRbyO9Da1z3z6tt6MfKMRhE/Z9r ShCzJ+Hj4ASZXsAxXsg== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX7Kn7sEUyR2l9 0piTpIo9kie8zHP3SlRQ6W8TuvPWAqM1lrbyOo4fWjBUd4Cukxya0cpDKKt+X9AYLKJ37aiGPMU zkPIE6h5Rx8X8vfIiMLF5rIQtdVS7CEhRqixlCsfGXVe5t7rQH32 X-Proofpoint-GUID: wrY4tj54cN0mFVdoSOLAYpjoemgjkUns X-Proofpoint-ORIG-GUID: wrY4tj54cN0mFVdoSOLAYpjoemgjkUns X-Authority-Analysis: v=2.4 cv=K/QS2SWI c=1 sm=1 tr=0 ts=6a9f62b7 cx=c_pps a=WeENfcodrlLV9YRTxbY/uA==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=Qm0qsxP7aFY2tkT6R2MF:22 a=6xji9QrKO1GPOBtlZsEA:9 a=QEXdDO2ut3YA:10 a=kacYvNCVWA4VmyqE58fU:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=10 adultscore=0 suspectscore=0 spamscore=0 malwarescore=0 phishscore=0 clxscore=1015 priorityscore=1501 impostorscore=10 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080011 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 --- 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 22:21:06 2026 Received: from mx0a-00364e01.pphosted.com (mx0a-00364e01.pphosted.com [148.163.135.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 448DD29B20A for ; Tue, 8 Sep 2026 01:19:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830404; cv=none; b=mm4WigWCoaCkl/BLQlOj5f+IPRXMk5xnIOKMynfk/cdMEESdbUKsDUQopajSouzPZRLMY+EB6ri1aQbMvOZnQlegSm/eAHr37iB33Y71HxTjxXUd+DUzd/J6TXkNWKcXMeNtKNLrXBEEJScWDSOvj/vj7OCjFYoj/zshK/UJWRI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830404; c=relaxed/simple; bh=wFgeOK9JlmfOiQJzKrAnQJ/MSptyHUH6u1/BKT3diyI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Fc3osLPoASoChFb0JWfIjDFvP+wfI+xLJlm/720TqjFsWtKSXH558KwxAASuCv9KEhN8jCPz9Y/I7L3nFTvR6mXMn/oXg4Py/TtQ5nhQGCZpsIuyGBfRl3GTZmzw6V3brI4wGrTsQ1kNJWyd6jy54TitwR5KQiCER54+cOp2ycI= 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=mg/tz4Rm; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=Ybvw40ag; arc=none smtp.client-ip=148.163.135.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="mg/tz4Rm"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="Ybvw40ag" Received: from pps.filterd (m0167070.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880uWRA3396271 for ; Mon, 7 Sep 2026 21:19:53 -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=yAPt u3n4O1aTK7BPsQYKipuXAWO1lPCrH8dnvwsOOH4=; b=mg/tz4RmGggAb0yLTAjV eAMJSwDArgujswO4IW9WOmvj2jcnbyGUIj8rUVxVv7xUopr+Ne49VGxlt/+JOufF Qu12yvPY5nYSgkwJPB3PFbfSwQWU1GkscHBu/6+OvefpGW4NAHsw+bknKF2OrsR5 9CsmRdMGK28ubRplhxDHgoofr4alGFnwMLL1e39qOXLXNfmI885IzMIOeIIR9SqH uRDlycbAvoZRr+s3Y5jFcO0yhdPugo9rUeIfUH7luKI3B7cDuy3vAQbyNiX7lcAK CGX4HKk+wpsXu2Lwmnw0zHEVbGVp/R+CA+XS7+CG8RX0mTEwflDZXvE9UtJTDXmm bQ== Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gj4yks07p-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:19:53 -0400 (EDT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-90e80ce3597so75240556d6.1 for ; Mon, 07 Sep 2026 18:19:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830392; x=1789435192; 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=yAPtu3n4O1aTK7BPsQYKipuXAWO1lPCrH8dnvwsOOH4=; b=Ybvw40agDxeLS9OwbIRjFSzdtZBRik6xqipFNdiYdKVSJcrx9q6JVlt8K/YghcGXWG JPFR+F7qI4MpOF/nrRxRjR+J2jiAK3QreKdTRhMX1ItAxTkYilLPRZco/vr8CXYJ+m6a AF91Ok5+BjGv+gIdOh3YkvZOJVsC3ckLgxj16fEGQr/XgB7x+jZniAJKS722f8TCRTPm Fo0vRh4avAouJfbwYharBgmGJ53fN+ZqEXi3UelCAoymKXF/7+ksFVV09gdchVG5qI/Y Q0lbEsVwC6ZwRTx8HWdaTl5OZyaTHcD2KV0oqvkZ6NJ8sHHC+k2Zx6i9qDPII49PqTZj NWRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830392; x=1789435192; 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=yAPtu3n4O1aTK7BPsQYKipuXAWO1lPCrH8dnvwsOOH4=; b=Zp4P+1HHnrP2UdMP7DwHM8WbbQaRkgMoZM2qkKaHBiSMo6E8zKmdJZgDTHK5zd+FQW H4Zbx8Ib+M1TlruRBoTD60aFn0Vj5YncjX5ekFatZk6N42mz+LtBriTkvb3DWGvbTmzK 0z7Uy7kBSK7I3asFQrjdxQEAgov5yXmZeSgXupBgmXWa6QY24ti1/zp2i/tNTB1XE6PF UwdJvg26uLWxW4WjCgXkmtLB/u4rtwlbdGBk17m+pmP678250GusLaVAR6Mn1Uzfsr5R QPNs29kapf94FkNM1rltziXRcGDBUWm3JZjANrBubiS50gtnW3ZjxpPBv4ECf3sL1ZWg M+Ew== X-Forwarded-Encrypted: i=1; AKwUvBxFDHzqqGmX36xMqg1zdwgionmfuHs/OjRnZoHkomhhGcG8cyKd01Csx2pFCHnopCNOLwREmY/S7i3wjmo=@vger.kernel.org X-Gm-Message-State: AFuF++m6ApVkYk0MESk+GySusLio8HWErv0UaR2jvT1o8MXwGOuN4HN4 4YLAvtwsZ50UL5Xje2EVb5wQgtTZqlKiqRn0i/fmtEgS3Pid7dctoecT8BR1hYt9ER6mrxTWi8d wpbIapmSbX+BWdKVlLPhmQ/crxvTeO1dAyD7ntffaI0IeeMUcqFT39WtrmHHwrw== X-Gm-Gg: AYBFou3QM3H2Cv4SCganJH9o81a7lY1LngVxQVKr5f5sIWl/AV4yEGwuOKoVUzlP7ND 6SWxDCIkwFiaT+rKLQTI9WxsaB1h8hzwc8tGclxFJp+kDCJe7xIWe1ypy88PonKAPhkCLARDVQu RxgPM/SHRZ1StH7pnSbRJGvees822GVWnncSUSKp7cKTd3e1AfeNbh/Kz4rtyAv3fuKifxtBARr GPJik+WJIWna7zh6ldX6UPPSnqajRtZtFljl1rZ2wAzutLUQjnmm4HpVkf8lsASlLrGKH3YzBAa TkPr93Mig+TRVQ5EEBNvisbzI6hoBbdZWxu66d/inf5JLFcKHEBQ4OQXkpS+bKKftQB6zivjuYK DzeVnBESYM6Otz1umn+EJ17lNJx2/gwyxnp34az0Q9l1UHdaxpTI= X-Received: by 2002:a05:6214:448e:b0:910:44e8:e643 with SMTP id 6a1803df08f44-91044e8ef30mr283428846d6.15.1788830391810; Mon, 07 Sep 2026 18:19:51 -0700 (PDT) X-Received: by 2002:a05:6214:448e:b0:910:44e8:e643 with SMTP id 6a1803df08f44-91044e8ef30mr283428106d6.15.1788830391127; Mon, 07 Sep 2026 18:19:51 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:50 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:17 -0400 Subject: [PATCH 02/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-2-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=23733; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=wFgeOK9JlmfOiQJzKrAnQJ/MSptyHUH6u1/BKT3diyI=; b=m+C+V9hz7E6oryL10btX3qe+zIOOHjNkST5+2UBo35brIK494ScuAjgtZ/FQQcQ0LrhJZHG3h LEpA8vM3dFEA6El9/hyZUm2IGi8jUequdJeNDWTnt94VxcFThRJb8zN X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=bJQm5v+Z c=1 sm=1 tr=0 ts=6a9f62b9 cx=c_pps a=wEM5vcRIz55oU/E2lInRtA==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=svvvyxlR1OQQkelhaPoB:22 a=_t22J9a6CU8Tmy3Ye64A:9 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfXyiGX7NtwUyng U3cRGjIKhiB/Avyc2KDKie07Pte1abSPH2BBcTCS8uweP2PvkJheQTOWN+Fx8dde9L25QFS/duv CVGe80PsjkAD5ONB1AnQ2uP36Py7Tt/XY+HEXimIyiuQGZVrCdxN X-Proofpoint-ORIG-GUID: eJFHMLCuVpmmyRyers2TK6x5Sg79kfvz X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfXxqQay7Zwp3c5 wi39hRNsPH8kaDaqQjvYF8Nu4NTy7x3nAeInnQ00dxtPFyTgs/V+hmeo2hA8YpQ0IK+o1MwPKK0 ASzDcs3vL7cb1P0Rf0DJ+WARAdf2he3U84cKCv24Qa+KoSReY45BE6mAx6HdD9GRJvueW2ko7ME oeaLPy5Q+qAvvdsX18fUDYSIBdcbp4Ovi2aExAuXD61EPivedbaiIlNpJO9r7CNJ9CQlOsdF2rz 7eXASMFyfrLf30sb8qCSk1CxIkona27yAmg6OCvphj8ji3+ReXCP4M/oDg5mDps2WA9Ckn7pk0P 3iFhL8w9u68jEwxMyjhThrTLw7lsDQeUD6KD/GC78iQHjt++c4zNGgKQTgbe8/ijwqgPU4W57+R 7ztDx7EC+/ZShvAkrHDcuBA/O6GJ9R3YYNGMcpgjkMSRBY17Vu0lGi2ng3psNotB8gK6+UtRo34 /xSSsy9vsQTzV2HK1Hw== X-Proofpoint-GUID: eJFHMLCuVpmmyRyers2TK6x5Sg79kfvz X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=10 impostorscore=10 bulkscore=10 priorityscore=1501 spamscore=0 adultscore=0 suspectscore=0 clxscore=1015 malwarescore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080011 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 b349f94cf929..d69432b236ec 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 a1d83ad9a4c0..28c0a4a8d008 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4873,26 +4873,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) { @@ -4904,13 +4884,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; @@ -4922,22 +4895,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) @@ -4973,7 +4930,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 ca114235bbe1..a5097714578b 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; @@ -2542,7 +2536,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 89153cd22596..24b9be1833af 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 22:21:06 2026 Received: from mx0a-00364e01.pphosted.com (mx0a-00364e01.pphosted.com [148.163.135.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 D92302931DB for ; Tue, 8 Sep 2026 01:19:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830408; cv=none; b=t2K0JXtSNBGxh6bR1Yk2SBB5VbjwDiwX0KtojG3FTqXKBHB2IY3rp1ti4/Oj81Ka3JOkSzETS2IsoxwIF4hRKW3IEJkxEOqGSA4Li2l84wzVDJdQFbWDU85TBiwh7Iq2otW9cCGHfa2K/IWFmeK7subJnUjegBVd/6L05OM4C5c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830408; c=relaxed/simple; bh=WHBgYoAZXTwZCTC+uPtMCS1zTe/PB6K8lKFf7fwynMI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QOEQIQWGNuPsw+h3a8EARgUrChYa+W7efrDBB9/IJKlAiJBUuOyurUu1pBpOSj5gThcOvwbs+4UFc0wcY0YImcYkHKx2iQIa/wLC/ZmZ9spQUCrCvoH8ZmYG/Hdcuxj1YZCpehmThklTYMf7unyCJOOgDqL8n5VfqXH3pUYjcqQ= 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=HAzrSIqs; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=4dnR6moc; arc=none smtp.client-ip=148.163.135.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="HAzrSIqs"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="4dnR6moc" Received: from pps.filterd (m0167071.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880vdkY728471 for ; Mon, 7 Sep 2026 21:19:54 -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=b/ru /TkXYN6eZiCH1AP2YAl6cjgL8CV/iP5cVwKSpSI=; b=HAzrSIqshd3kUlIxVKjZ 0Xj9Qe01V4EgliYPF97DIjUUV6HilIMMD5wSkq2xV/wXluHQGi89tJQwqgEfDc4N UGo6nhE5c8BJr8tV7iXML6vwO6aoAMOc0WWPnyXpj7U2y5NmNsWK/X8M6/HkbnOt uoWw/sGV/HfgzmvNv8SP3BeoqErPJkUcTovKR8kYJrrv8VbHhSlANLddDJotWUZu ITLjEfYdezECiUxK5K95n32a5sy63ALyA1shp5knJnqhlnsspXHUVzyJpYrSMbPK mP/J61DQRv+lWy0+1GnTpkjYVc3ZONMC59cnkHfBLVe3+vOWb3N9t+2lyzvRfdyN +Q== Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gj4d596m7-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:19:53 -0400 (EDT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-91055aae7f4so26110906d6.1 for ; Mon, 07 Sep 2026 18:19:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830393; x=1789435193; 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=b/ru/TkXYN6eZiCH1AP2YAl6cjgL8CV/iP5cVwKSpSI=; b=4dnR6mocSCx+9maVfQRZrMuzcPvUG57c1OXzn+CmV8HkFLvYuhtV7cc1IsfnDvdklR kt+7UYrlApYdkPCOSQxwDJmK2EJtugmQ6gujTrm/cGoFQWXM4vvG03yp8dmTdUNc57IC wSGzaMD0E/xhTKszW3T41g1HVve8eFGyUOaWwm3civu9hDMrizdo889r7jIYigSCxdS/ bvKZGVYb2o8YPPBN6LwRlzjYpxJ7QCpC3ByVpa1saPP6sm3aXg52WRmkmtQwD+HRYd6u QoXuw+iduUiM/F1tO6mLAXaY/+ltzSGTkQhHEgNxFkodJpYfth+Hij8xCTGfFs/anLCI 411Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830393; x=1789435193; 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=b/ru/TkXYN6eZiCH1AP2YAl6cjgL8CV/iP5cVwKSpSI=; b=DCansMYRfo4jmv8awE+PXvKflOXiPifiBPDfL7DkYhgUBO1qZhDliEY7xZYsGt95MX ueE51WiV5QnAVqNYEEytXUiPf7zwY00c1X1nfXcqwtoP7w3SJubGbU0vFUS8plTaMymM Y7YckrmRWCrz8oP3zY36X72tmbwX6fAegEpeYzvj5d1kqbrfzC3BssBa0ZIUDgijmgAq Cvsn2O+cYhFQmSTylC72GvDjbO+qchoH35u+ozhvDtRgQyvvT2KZedwvUwUX2a0gXSEu IfjZ6cPySjTDZ7W2hGiYrn/g2+wAru2C8XCMTpdKatMri/BtNnfobb03rSn6gNiOkjWd Yjyg== X-Forwarded-Encrypted: i=1; AKwUvBwOaxXfVLPu3kkY3myEGlAY6R3HJRU5UvdFXBcr2GjuhtRLL7s1zTokBl1TQLBpHB1MAACjoDFx6wvWxOc=@vger.kernel.org X-Gm-Message-State: AFuF++nu3EP9XxXrgU3XQJtHDKEqJnmDrIpkBxNPoQn2H9fuFFFycr86 AThN0KPhf7VGxw1oxJ2kuHm4u0JzNx8qz6GJEfmJzDLksQBLBlbKbPjQ9OBwOsk0Oqjsw5HCstC 4njbg4L5Ea8XWSgNKvoGTP15puT9hdh4HilOglHlL57V4SBm/VVkiYduvDpHKsA== X-Gm-Gg: AYBFou2DqiABZtuZ2DObOYGl94YgT+K8VnAHPiBlyzfvVX1VQp6nfQA05nqxD1UwOuJ BykPNvJVOBuK+NBWyuZJQoS3AEQ/Cosm4rpvI6NW0fe7eyVBghzy/LIvHC1o+twgNLltUUUsqyA IGby3bpcCSfcfPq1zCKpabmyhdiW1kiuqf7azmbaVIyeFEdv9JRgbrtCV063zoo9A+UNQ0D4/6J Ldml0iUw/W/XwLgiwzvqKPpB+oeBLGElj+Tzc4v+SvNayjC4XgLBpVnULMFkquIhZdQBnclThod FHzluAeUUdVqx5ic4mJFafdI2MprEk+H2ga+nACyYzA9YgOZk/lZgilAp77Xi8fALELxblcHhz3 FJ1QKGT6/ZtzZcbsGK3nhuo2vyHKayFWsWaiPNXuxsNze6LTL1zw= X-Received: by 2002:a05:6214:519d:b0:908:4249:337f with SMTP id 6a1803df08f44-91061f8ebebmr51385516d6.5.1788830392826; Mon, 07 Sep 2026 18:19:52 -0700 (PDT) X-Received: by 2002:a05:6214:519d:b0:908:4249:337f with SMTP id 6a1803df08f44-91061f8ebebmr51385076d6.5.1788830392285; Mon, 07 Sep 2026 18:19:52 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:51 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:18 -0400 Subject: [PATCH 03/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-3-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=5247; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=WHBgYoAZXTwZCTC+uPtMCS1zTe/PB6K8lKFf7fwynMI=; b=KfvF3H0DYALECmAJ7Lr2+u9y8nClqhPe3e9RldNbYCRcSDdoukRBdB+7H5Q1RETwfxaK/+zcT cGVGMzx25lCD86yoZMV02JeZIFe14CNXEucc1CcPG6poR/P2kZGj7nk X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX2IbQrnfRpKfj 1UdKwTmBs6ja4idQw5lyoWKUFyP6dnsG4XP5OkIq+/xnvgCh1oeqhI4wakd49Gw/XOgm5VlDvlg 9IZ4N1k2nh04yWcPYc+RiwGNfh72KG8TPP79skAIwh5q3oAQPTQ4+goMA2u8wUToMozH8L89eb/ dROYgJfd5jSXJZ97530D9L45odmRaNammukZRsEMF0YL21qWVKLEmGVldNXpeCaY+Yr1eu9KE0K 3E1jLTIs4Vxmzr/28yUDqRvM9KjRDV+e+iRAtSV3HPvyMpvJjuC75xeVKN0V80MgwF70FOtlF2a DpVXo8cE8pnEdcjOV3O7uYSDfXpu1RidRaME9V/Nycis4S1byaETPsZxv+bJunb1hkw3hl5pWkI nmA9+JEkpcMHSSHfq5KxYPPmDNKDPwSPD+J6kf2lHNaBRxSVRMDnG19aZXVfvgPWb+c59gLCqli hLcR9DGP5EsJzBi0pKw== X-Proofpoint-ORIG-GUID: Occ6xp-h6sWUr-aQztY4koSdDRT4Pu7T X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX/81e3uhz0AQP yk/8TRS7eW4CWl6idms91M+TBc2DRO/55d342upLbBMgNuq88gktLl9Z7seGhxl4mYJQzExjt03 TjSbtOwV8UfZwcvlQYtirig/Ko4CG0ui31vZMz7/4xCJz7S5ZP4D X-Proofpoint-GUID: Occ6xp-h6sWUr-aQztY4koSdDRT4Pu7T X-Authority-Analysis: v=2.4 cv=BqCtB4X5 c=1 sm=1 tr=0 ts=6a9f62b9 cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=79PYxaXUQd1wl-QFWJnA:22 a=MjXS7SgsmouH5g4WD6EA:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 adultscore=0 spamscore=0 impostorscore=10 lowpriorityscore=10 priorityscore=1501 clxscore=1015 bulkscore=10 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080011 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 28c0a4a8d008..1cd44a5c193f 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1782,7 +1782,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); @@ -1993,9 +1992,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); @@ -2008,8 +2004,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)) { @@ -4455,9 +4450,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); @@ -4483,8 +4477,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 3eba8438593c..441b315e8a98 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 22:21:06 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 D93032D0C8F for ; Tue, 8 Sep 2026 01:19:59 +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=1788830407; cv=none; b=ZU409Dk5hkLKrPdVbvNQKdRXzqiio6dp6hkRUEaEIWewymxHBu/vBrf2TK68z44I3PadRpwH1Rpb88CccFOiG2m60ZOiIlsgc6+59p4Pmr+GHkbwE3T3Sdne2XbAr0eo8A6GRrq9UmYe+6NczsnyVtKukguiKeDWjdzuNPJY8KM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830407; c=relaxed/simple; bh=l+qRmtoWH08Nf/yuXuwEKefhbbRse5eOa8pIFOvzEHE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hS4T+YVjCmxgUEMdRT2LIkYySgt4OEyAI3sTDg9RIRh1I9GB3Sultm3LRSdemZAYbHJTBMkh1BIlh2sEpR5y+nidS0dkWugEx6pu20ngfDiRhCnVaCskktMnO4QUYbj50NFNjRxyZ4/llJOq4A1WqJRVmmcT7L2zO+dgW+glQks= 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=bOHaOLDG; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=ZQ9+w09h; 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="bOHaOLDG"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="ZQ9+w09h" 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 6880ufVi3738749 for ; Mon, 7 Sep 2026 21:19:55 -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=dlcs fEt58CNLv67Xrst4N29LNVll5o0/b8PaJQzjdhs=; b=bOHaOLDGKqxG0eQ3tUw9 ADcswVKoP6ts/G0v9ZyhqIxBeEvgXdmzmr36uF1/oQm5neY64lpOfE1fse24t0YN WD3C/BXC2a4w+I45/IMdxTh/5gQtM7SGqQnNx9ompcIhpJ57Q1YM0OY46kW8w5VX 55fHjQZgjMJA7Sc9xYOjHJycmbprecrv8cgDq3MimgVWIi7OVZf4+inPJ+4sQ9Ar d4KkktURnsPHnZAKbWh8u0ysHLM6A4B+IyqCpCR9Z0meTQ0wmIapA6Dc8d8F0k+w dLHGr+I+iWTyX/bQNEZAWIFxMdyf2P1UmmHMplhp2eEgya7dnBxgroJ1dUEOQXwS 6A== 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 4gj4y98xxe-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:19:54 -0400 (EDT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-90cdc69a7b5so73732496d6.2 for ; Mon, 07 Sep 2026 18:19:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830394; x=1789435194; 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=dlcsfEt58CNLv67Xrst4N29LNVll5o0/b8PaJQzjdhs=; b=ZQ9+w09hbroHD8FOGZQ5u4xRr/vCHy7q1rsV8vTJW4/ZHl7egLYL6gS45j4TA7Y9d0 BMclvlJ1t8n5owPlxOv7pCbp/HkWQOTvaJeJw8hij3cAZ6Xa2mhKL3ltnRQ0z9WNG1Ao qumTAvMoV1EciiLrH5FC3nYuESfhzDDVKqKD/1oCFSWqgR2nb7JsPdh0JY3MPdTusud8 YlO4MB6JYYM/Jgb6DdckJhttgUbAhJOXYUS4D7/SCX9i4ceb64btqDm2qODX1lMY/pOk p0afuanOugzB5ZB14yIq/m48CkVgCEvub94lltmE/68jgXzlHOD3XkkTrnzWptaFZ4AD J5Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830394; x=1789435194; 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=dlcsfEt58CNLv67Xrst4N29LNVll5o0/b8PaJQzjdhs=; b=F6DBxleFqRyVpcchgHfXvbFW2tftHJHTUnCBSOjJnlFSfAxwY+9OJwGvcsGerJ5DAf 0x81a2vr306MhpXnZf74nPMaTXxsX3bLBOUZsXZYZHK6n7m7Fh9tTeyoupGdkypm+tz2 yjl1/PgR4XzHzB+h4cikF1UnmBIFNDMbQOgfSQ5px/6rhXttCTgPdLGWBSg5zlmVPArN dpLfyvcwpqxrP2teM6YIuowZa3RsaBCPmE/nq77uLiu6dZIlzhbJOp2m02LlDjZ4VyBZ Ta3OerOAJ8QwvCWQ1A6q3w8zJKIIozWjD1gke9PrH9L2S/idaWDfyrcEIOJidLxRGCRN sS7Q== X-Forwarded-Encrypted: i=1; AKwUvBzu8y5CiNYEb02+C7rI8EZB198b7tVQiqVJz8ABEbkB7NGXkfDu9XCi8oGEeQyxbYjeUXOdSwJTWbu5U3o=@vger.kernel.org X-Gm-Message-State: AFuF++nNwAcrFMWS33hJnUlseAO0AHv1wylBvwiYDnTcvA7BKZDNfr5R wfM2qcvwxIUXbsnOsliu1XiI1+hNdMoKW8Sbz9dfk/ssXKgS00bsd+y8L2F0xa5BMCtR8d4cVIW yPXdOEsuv3+DTiGMJfSXr24Dz6qhMvFuu844T0RSxnJhPfg1mh+yEhsO7vzO5RA== X-Gm-Gg: AYBFou1yG84ZGn8yI/gGf9qOTQr+FCcCKGHABLwYnPsnJ44voAYnKnKx0Fi5v1vqFSO i//GnU68RTygvWfOdrxxr2j3DJcyOyzs1jBMWb1XTGjUDAiZS6FwAgCfXx8qOHvKy7GdiB1hu0G mNSRryfcFoPpiBQi/w67C/h+61emVvIzkuFZWfcOZOwfpDNBP0TlOOxCIyz3BBTowrpkhDkkWWa E0DxGzWOyNDKqAus1TSTcAelYGgY94rYx3b5DS3cpfWUCmGxlrV0VDn06qDsSKaMQcX+Egz7XlM Md93R/kXNrJdh8eOMGQB7GZzM/2eY5c8g7Rjo4Eqa5wQEB25+lXIQC/6fWMwtOlFSdAhM78QDOt Yn/yOi1JAOo2DGinVGBRvO697Jb9/br5GQqGIvA539+sr7Pl9m0E= X-Received: by 2002:a05:6214:1251:b0:910:633a:499a with SMTP id 6a1803df08f44-910633a4a0fmr47895186d6.19.1788830393744; Mon, 07 Sep 2026 18:19:53 -0700 (PDT) X-Received: by 2002:a05:6214:1251:b0:910:633a:499a with SMTP id 6a1803df08f44-910633a4a0fmr47894596d6.19.1788830392981; Mon, 07 Sep 2026 18:19:52 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:52 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:19 -0400 Subject: [PATCH 04/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-4-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=29653; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=l+qRmtoWH08Nf/yuXuwEKefhbbRse5eOa8pIFOvzEHE=; b=Q+ZowpPwvmWSRmrDdR/CRfb8HUER3VZMBp5+jdY65mwQwFLmmBxpMPCJiQ96ufJF5osJV3o1H Q4GpPDXui5XBkVNF+RtINlz8vzYUno8Mug1kIEJuaeW95t6VIX5PTVq X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX5lXEFgQtGAYI ogMEOcvhehrsXLs5FzJPRPau7aUXbPYiRFHPf4p1W1eTv/3kXtvdGOIkvifFrcL3XS18eWKAKc9 2JcmIL5kw/Mq8x0ZvgSHev387qNMW6gp3RlseA8KsRb9mlmAqe6MRJjPCNQSI26qUFBYmKLmV+M +A/YtZmgcdx7hlyXKkwYqQWsTcX0FNtZ+PT+K/CoXo/TamOq0FdWmcp83rmJ+UTNvTe1oENNY5e Gy9/Ol4pO0hAb4zIDGwNezFu2tadyIRASfqFNXKSbA7fPVG/bi776bAVQHkipHmW6UdcQNJ4/tB i7fCXAyzPQaYVlGG8qfmcsySKn1JUt07HDEtAVQyHj+5Affs0R+iZ7cRatjD+BVOuGWxeFf6rm/ EjlVwBl5SZUNOJVE8Oi56XvU0miOkrYaN8CXkHX3u1NSuzqu84efBHMhMffrl3mujdlHobR6utg mlGFICdg32ijvmxCniA== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfXzQ4wJ2fH6XVo Dnyxh3tJLj2p8nSjh6xnR9+CH5GEu29THICOozHjzQ0ldUuVGTM5FlMF6PzzznRmWW8YfGZhiyF 5HH8T57jthVQyfqIlJR+oJ1+Hhw9jZ6Mrart/e/n+UvqhmCtfeP1 X-Proofpoint-GUID: lB2PpFzyZCMGAdVrp8Dn0vEU2t3gFS4X X-Proofpoint-ORIG-GUID: lB2PpFzyZCMGAdVrp8Dn0vEU2t3gFS4X X-Authority-Analysis: v=2.4 cv=J66aKgnS c=1 sm=1 tr=0 ts=6a9f62ba cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=QOCMdifcju39GKoXhKua:22 a=8VahGqg1PXxmH9HWCi0A:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 bulkscore=10 suspectscore=0 impostorscore=10 adultscore=0 lowpriorityscore=10 malwarescore=0 spamscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080011 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 d69432b236ec..f7346a0170fc 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 46c62f980c24..389eadc5c28f 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h @@ -592,10 +592,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 1917325d15b1..0d890d04d854 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -9369,15 +9369,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 a5097714578b..1230da51fdfb 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 24b9be1833af..889babc76b68 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 22:21:06 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 D62D32C15AB for ; Tue, 8 Sep 2026 01:19:57 +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=1788830404; cv=none; b=gbQkCNqKZCQogdE+nok4qmma8Rtt1Vd8fYQv5TnpfuQyvaAP4VV2gjd3rzByvgcNa+blr3hEtLRUmZCqhrf1XU48eNN0u9jkLxUUT66yz7GN2oxzD/I7CbX+YhwhnMWNxiccLEVLJr+hbUc9bR86OSPb6ehYoKAZektwBKnSLXw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830404; c=relaxed/simple; bh=kFUTxFDqlauqnOuGBmlMcLxmkO5BLLT9VUQ1YBQ9R2E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q65b9UYXrtg/EKBTdaWB9eMzPosxYcvFFuubWdvybVuKtTuDIxYyAkHo0xe9J6YQrLw87vT3+em9IVh4Iz/Vdb4mtAjuo6Zi6aDoAoaQP/hUUVDPIjm6A0HLeabORbvMG7y4UiPXPd2tgdfjzkCZ8S4dyzILDj2mCdyNFIaeELs= 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=TK22kqC7; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=MQyD9x4V; 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="TK22kqC7"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="MQyD9x4V" Received: from pps.filterd (m0167076.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880ukO13905435 for ; Mon, 7 Sep 2026 21:19:55 -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=/O5J vOcml7Z5nuc8BFyxCL/aEuEOTcA4yiAQqS48lHQ=; b=TK22kqC7GHrzoqdswG0l ptflbLZBy5jQRN90818lZhB+n8+LfuxHKanBi+0awQ6F/6zDTvXgcjfE7wdZfM03 2YAH+FGnt5Vydd2JB6q8UjvJx87o+tNaWLXFjZcaj+GCo92BF+OlZVDekQrYUXKF Z2LBYlJiqx7BzI77yhspSDjyEKIGiN2pUZEoxqgwFeku8sVZFwzKgUYxwUQ6KWul KV1cNHljKK2L2k6geHFi/wA+g/oK8UIXcEiTo75VHEP5UCtyxnjLjVL3JGNex5Zm f8nrTB4CG3L/DDtltQwhLXaXBCKpKf9Ywe2ISbpfXRNnPo4rqzy6XmZY2WFLtLFJ eQ== 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 4gj4yjryev-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:19:55 -0400 (EDT) Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-92ec3146553so970546085a.1 for ; Mon, 07 Sep 2026 18:19:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830394; x=1789435194; 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=/O5JvOcml7Z5nuc8BFyxCL/aEuEOTcA4yiAQqS48lHQ=; b=MQyD9x4VLJ0BIOtzxGdk34rb+DsaTTL/YVrr3dE836qe2wVboSfva3u6W93sjj3G1F OkwhUXSD4PRyq6L+mzv5UUuSUqMrltk+fkfruQm6FyBOPCU3CNijsZNvyAuEP0HVpqu3 zycLaUj8PSuC80OVqpymM58J+wrOjJgiUWij5c4MR/6bs0caSjv5Wo2lx/TOe6/VmEey trkBLQRaUnmZr0oJYQ5mzah9o34orv1hilK1GT23G0DGaQFRX5KFzbAJaAZSa1KsbVCR ub0IRYdugXmfQIpdXO/0th1RT0vzzCfOxVMnt/8dxwklGg9Pf7BEGWvmSatvKZnLfPsQ 7cWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830394; x=1789435194; 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=/O5JvOcml7Z5nuc8BFyxCL/aEuEOTcA4yiAQqS48lHQ=; b=oX0TLy6kNyJo0oXCg+LmdkdycapCewNklojUm/hd4YhuckKfNlBDqS39vZyba9CPyO IfnMHJsOU9LeC3jSUym0gjSL0GAD8Qm0M3uLLM1QtiUNqUm/B/CK/4kDYb6+/goe+CrW fpKRVX2F/+up/FEFUEJWkVVEF/99Qz+jn3Fmd44dtyTH5474V2eB1JpIATvo1r0x28Mg YWiH8WXnE7kZ2ZqgZeKP6OG5RqcjrvWVYcWLV16/P8rUBeT6tmGHV3RaVHsCk25aVrR7 Jc5Vpkq3xf1GXNr6ozcyWFgRvTWNFE8vYRe4aI/AWs8p/6sTd1YVAudvWC/4S2gC1eg/ iVRw== X-Forwarded-Encrypted: i=1; AKwUvBzDTNCJJFMyOUT1IwQexJHDJzq32AOexlAlLr98VyZDnTrS/O2V+gkUHFDLOic+fp+hOM9X8ADTMzlLCrc=@vger.kernel.org X-Gm-Message-State: AFuF++kJ+QvjHrYb+p+R8YUBu3oWZiP/t5ql3uxyE/C0Z/zaJwGD3vGM 3miGyZeOZ3oZZ6JezSGDnwtnc+cV7onGOjMP7sUdmb+839i37W9FLiXbvXMYrs57Cm18CXaKo6M JL7HlwxvbDdibrm/1V5wWjK/9YztgrFsWGZmLRexH8sSBPJTqe5fgKlxNLI8IWzjS/rtMPGip X-Gm-Gg: AYBFou3kZfT/Wlv//kRa+jGDRwGI0og/dN6CEIIov9uNkMHkdS4jjnbzfJOeEKQuM6z zU6QeW5DqyGhtJvsdtnt9JvTTNRaghB4TBzA0WeHrMuGzufMEGrS7dl3uP/ObZbfVmnF46qBs2z 0Lj9AfvtNkRAJxfruPzpcfTsWVjcIFq8aTT7BJ0oYNaVfiIiHGcEtK/IdaHe1MybxIDwMhrDx9z lQiExEKRgRWU313rk96HcmPsBkgwDPeUK+jpAQ/KAXf8nmKMvMxYMVz5gzxodWHXR4dCdMT6/1w iklHGjVgkekJFcW/YjUJsLH2nYwIsyPFcxZI+5vQp99lMCDscOp5NcO/jKBqFAxtXBYbf1q5fLS QYIGIFzObKIDCPGkVOvhzuslgtm8ip0V6CdposjvQ6YJ50e9lkYg= X-Received: by 2002:a05:620a:172c:b0:936:77d7:55a4 with SMTP id af79cd13be357-939805edadbmr2698403785a.19.1788830394599; Mon, 07 Sep 2026 18:19:54 -0700 (PDT) X-Received: by 2002:a05:620a:172c:b0:936:77d7:55a4 with SMTP id af79cd13be357-939805edadbmr2698400185a.19.1788830394197; Mon, 07 Sep 2026 18:19:54 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:53 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:20 -0400 Subject: [PATCH 05/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-5-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=4704; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=kFUTxFDqlauqnOuGBmlMcLxmkO5BLLT9VUQ1YBQ9R2E=; b=R0TMQB1UvIb0hVP+YS4BV1sCIG3y5ILFNwzAz7BUChVgdvPg0IIqjuoW5JzEs5lYwTNdiZMOz fIWqIhJhB4DA/6W/D8AQV3Rxx5+nHvlPHD/O1/V5QvDeJZV3asnZljZ X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX4QSQFQdzNKsD P7LkEsrrpzaSkFAKTi41iXoeTbHw5QqZN1q+7v6BCAew3Lp/SsZhrgvn0rMPG/RaeECY+DkYfG1 EJNlxxni+HBw/PUlUBE666wOrYbkGWLew14eb+e0HHBKbbKtkdgR940XZQt1aRE9XzOMpTs1rA6 O0Fpie0Hwoo1v2mRytGv/mFu2cup2pf8R/WiwjQf4Umvk3G59td1aff+hI/SsenvF5IE49rKQdA DS4R1igicyR12VumhHiEV8Cv9QI/Zhyc5xjsNcXaOL7bo48igXCd/rPh0gvl71s+8+sJjGHypJp tygXMEd4/+GtDQo5b58LMEGnepm9dPoZmdz90ZZ5n3l5J1fWYrpx1QFMOl9tEcc/LnmeJ3prQ7M vGpixR9jPV24xmMlKefGxrH3h2Vz+eg6U0/rtARmnMKBwjk76QQuBJZ92N1HSHFEohDDDLGVkR9 TC6wjkNRD+t+1eptY9A== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX4FG47vaMdjRs Re8p/az7jSmO/tqBsSx4AjJQBVOkcMN8hdpS6zxSG4DAELCH1tHCe/9K45KL87yf16C2vydXS68 SU96b9+n94H+BBBill6RbVKhwvtKfor+//g2Hwd/ZGHjG2J+HeyV X-Proofpoint-GUID: qhCXYsgfpdTJXXzV-CseTpNemZbv58VG X-Proofpoint-ORIG-GUID: qhCXYsgfpdTJXXzV-CseTpNemZbv58VG X-Authority-Analysis: v=2.4 cv=K/QS2SWI c=1 sm=1 tr=0 ts=6a9f62bb cx=c_pps a=qKBjSQ1v91RyAK45QCPf5w==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=Qm0qsxP7aFY2tkT6R2MF:22 a=u1qPvHribVpbYRjuRIMA:9 a=QEXdDO2ut3YA:10 a=NFOGd7dJGGMPyQGDc5-O:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=10 adultscore=0 suspectscore=0 spamscore=0 malwarescore=0 phishscore=0 clxscore=1015 priorityscore=1501 impostorscore=10 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080011 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 0d890d04d854..699a321fc43b 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -9137,14 +9137,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; @@ -9165,15 +9164,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; @@ -9213,12 +9203,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; @@ -9228,11 +9218,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); @@ -9258,8 +9245,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. @@ -9331,8 +9318,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 @@ -9344,15 +9330,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, @@ -9360,15 +9342,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 22:21:06 2026 Received: from mx0a-00364e01.pphosted.com (mx0a-00364e01.pphosted.com [148.163.135.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 B72632DC32E for ; Tue, 8 Sep 2026 01:19:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830406; cv=none; b=AGm7ws6pc09GTY76LlmAMfVJSs5N0QmWdPzfdyoHLyNbJMJGSzaLBrJWbzDU+nZ+I14CbT+pD33ui146sohmDj0X0FyyhxdofV24qjwYVsCIJfs49A7TFlaiBDjtxC1DMKlhXFJ3t4jiKx0cutJ5fcCMNW9XJDWwFdy/eL68oKQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830406; c=relaxed/simple; bh=KFOg608BjpkD7O/zHWODlTzl6r5l91mwicQv0vSkL48=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=T4rZDOZGqEB0t4cuV2rlfoXLC+ewoy5DgJlSCLDvic9jvRxQdViOkQ6zjhP0NDqYLH3FWOZfXmFgbUQtyhtVubb2Gakba4GX8s+Jb4SBERVzllp8dM3EZ2jnl6obACHFPsFb+YdDIfzkbVNxhal9Z0IIwF83u0Rq/HwSGWF0OYA= 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=C7GxzJTX; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=AMeQKwIM; arc=none smtp.client-ip=148.163.135.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="C7GxzJTX"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="AMeQKwIM" Received: from pps.filterd (m0499199.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880uWXG3578385 for ; Mon, 7 Sep 2026 21:19:57 -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=C7GxzJTXFyA6K3OxtiUS oykVdDRzKtApDKmaqLZeiBOYpJ/TBi/ZPO128UVpPQFoQw0K5OUQZrYkiI6m9AMm kZ6fGhTO2bjSgYZq4nu9Ivsf8SqoyVo+LREVuoGToFsmDhFXb/caDnx6p7u+j4Ke gGdPYNkz+tqfHa1UFLR0BOf3+xQGPQqK7rP6b7XU/agsFlyfoX7MtSeMkq3ZZhg7 XvJG1+CNkn/8eMqW/OVegMFatRAb8xEmGJBKKBSEtyp4jXDFSu3fIxk7qBNuHouR uj26XGQdm7aCA/LN0csJOuBty05Y97tmzkTsdy82+UOV3rAJzqeDip1fe99BJTGy zA== Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4ghwvrbqh6-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:19:56 -0400 (EDT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-90e8472ee1eso67802736d6.0 for ; Mon, 07 Sep 2026 18:19:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830396; x=1789435196; 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=AMeQKwIM/wbL9hllBfltVgzdV2CaNZEgaUcw9l/J2lL+lvmlwXSi46Xx8cAzFEKPZ8 ADm7CvDxP/aBIGL1YmbD+IfxSV0GeMNgDCxdX4DzL653nEJDu6gmipdhxT5mRrdUV+tU L2Fhc0jYClPs1LZSEP1xLYqoiKJsI5npA8IafiZ8gPaTfUHMg6fGScf7T1sHiUa/1+d+ 4eBL4ueWLQ9KgG6Dq12RJZKe4cDXSHjW4ckzE8pl1CXtQzY5UiUdVSKez7e1B6tGM/38 tJGUNUb8PjELwfq0alwq66TH+pvn7VcUeT9tAjd12W0s4pUVQh0diSOfnjWJP6SSDid0 GzlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830396; x=1789435196; 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=N0PJICbq1z8cb7pCfE/y6eZtYCp27oHHAnIqYhW78rtriA++2h/MzpIKuWUQKXSpPD qtDm5bAUxVZ5KVehFK9V6hPuvZ+Fm4lbj+W8nDCkU1RGDAn4RNKZ38wpAnrCgva15QhB 8DzfwQ9ajAWQP/WqFDt2SJ0kqMRQ5PAvRFXBCcviOoOosFo4DaKfF0Arz4QNBWCXcay+ SAjzgcVEsL44OIJ50/kRPV8Et6OBn2SQdkE20Ia1MWESLdV8rwpjo8YOK3U9M/d6BbGM 5epFuWZXdmNwzlaF7NI/Rc/B18Ty/3jgy/f2mHQDrzEaV3pITFseg6//vUV06kuu9eLX nThw== X-Forwarded-Encrypted: i=1; AKwUvBx99VVeaIcpiLiNpJtBaoAUdoZhkVthd8gxymcNA2pWXXBdVtJoz+AhwMbPlir18UReKywW3KSITnJkw+o=@vger.kernel.org X-Gm-Message-State: AFuF++mvxcTbKgZJQ7HwQ4s1GSMtOPXZ966sSM68gfZcMtBhemVr2J5a e+Zxzp9WXxK38xWRWi9N+1YNfQ6cARCu9w8EIbfiBcOLlYl3oSLF13nQmcqjO6CryX0NsS1cDiY sh/s9tGih0c9bntJ3KBShgnUHE/MtqRmaWF/zv2KnogM9V8P7LuwLALlcGcKElMgl4j2Exlky X-Gm-Gg: AYBFou3DwhwclhBB3ymJeQqZ3XkSaogzEysxIbYw4AG7IErM42st/VCme4S5FeaRacO PBxGZXtbauMsE4eo23OKT7Rz9f7lJJ5cZ2qwmCou6g5aO9eHEAFIv3vBzoqOEo1ZG62i2C+c0ps 44FJFoj6w3fVx+BPR0IlBOGj2VKbe7hg+t/DaUJQH7qDJl87sGKdqXJygWXir8at86SWvT8z91O VGuUVHDWzZB5FaosryVpXDKIta/dN7Lfyld2Hc+p9FMU497E+5DmLxwrgiHfgOVFWPUOmAHXGXQ hy57oQtQVdnVMoutKxywfrfPzt5glDHAtQWXTcDTNzbuY/oDqurBLNSCg5h3UHcLQ6N65HrfAN4 hAheM0T2gmXUDrjrB1SFNZ01uyLg/v+TmLX8Y6rBta/CVTn7pMkQ= X-Received: by 2002:a05:6214:1d2e:b0:90d:a536:1e33 with SMTP id 6a1803df08f44-9103eeb1cc4mr309717276d6.0.1788830395547; Mon, 07 Sep 2026 18:19:55 -0700 (PDT) X-Received: by 2002:a05:6214:1d2e:b0:90d:a536:1e33 with SMTP id 6a1803df08f44-9103eeb1cc4mr309717006d6.0.1788830395004; Mon, 07 Sep 2026 18:19:55 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:54 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:21 -0400 Subject: [PATCH 06/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-6-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=20021; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=KFOg608BjpkD7O/zHWODlTzl6r5l91mwicQv0vSkL48=; b=JjYt194IJ+o9YzNSz//VBp07xMIDqewUx7XymDejDStHRHUxoe/v0ejkEN3J7Ocp2nt9AkO30 Cr336AAXBwKB4e91kAMda6Z02lUQ4Ls8pTCouma3VbWWWKC1AVRecF0 X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-ORIG-GUID: bTkOwkgxGfKUm7W2Bpj8c__vO2K3_B4k X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfXwtibuoey9ppI DFVmm0xwKkP4FdMekp4MoBvAgWJ2MGoqnSp60CeuSFvXfzW8bWn3HamPEOYSr6TZ2kHfuW+pj5q BHRB7dzMQ6E4WVJaMtDA8r0jZU0qAkDxlm9G64L6o/HQ9Jtb7Houzrnx5W+Nm8Q53TUj7yHq1yH +MqW5ZNccPVaBtzLvYrTd8lw0mPB1FFHXW11pebf39ly/ehvLJ/axG7wM9spB1c13ya2wJ51DeH /5f4Eyzpk+9doVYsaKZTGjqcvRQgiHUHTLP9idz6cx+yt5FGYLHYHfdHvksqXGlE3te+uN8E1QN AoJK9T3YV5/Cp5r94h8ZKjBXihcI/8Y2LUZ4RIPunobxynRBPXo7sh7z+uMD+7ThffsM855g/Uk NKh/+3vzaUu4EB5tS/iXAv4Ku8TEoCRYyc9fGUliNZQch+JvQ4CndvWsGEeODnR/9F06OXAk24z VVgymh8QzoFJyyON1Bg== X-Authority-Analysis: v=2.4 cv=RP2D2Yi+ c=1 sm=1 tr=0 ts=6a9f62bc cx=c_pps a=oc9J++0uMp73DTRD5QyR2A==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=G--0XuH5328wxK7v7Suf:22 a=P5Dk6VCOSKDVTHAqsQAA:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-GUID: bTkOwkgxGfKUm7W2Bpj8c__vO2K3_B4k X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX1jdmOOLsEhe2 Tq83w8kp/cqQDJ4Bm9aEEW50BFeU5SxP2TP5XztOmuSFgEaA5j3+hwFbJtrBvDGiHdlWLNImazu gEmbW9U7Dmg+p9IzawRJMTT1CBF7/wYaHDBhhef1baCaIbdZbIzA X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 clxscore=1015 adultscore=0 malwarescore=0 impostorscore=10 bulkscore=10 spamscore=0 priorityscore=1501 phishscore=0 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080011 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 22:21:06 2026 Received: from mx0a-00364e01.pphosted.com (mx0a-00364e01.pphosted.com [148.163.135.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 BE1722E888A for ; Tue, 8 Sep 2026 01:20:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830412; cv=none; b=rk++6rSCpDV4GKb9VgM5AhwlOOi7GkdVIl0uyKD8Q6j1OZTBr/Gt6/+7ZsvhGNakE81FUMBj0vWjVcTIsM+zQ806EJVsRscrDfGIt/AA/7W0q0Z5fqKLMmKSK29OAys6vdeK/3tNHh0SJ4lJRHeqjR2aP+zmfta5h89h8aPw2WQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830412; c=relaxed/simple; bh=cE1MY+QR9iC20Pf8qIeMitWSw7Yh6AG3T3QMGQ9WnS4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Fs5uOR9DU15EPtHMYwLkIiSLv74OU2NgRohAaJ/DaaN1PNaGktk7GMBkcA1C/5Il6HyuZOONWYGXGNfOunGXfFJ8bqxe2gER6EdMOn6+d0QilOA7Vu+dFDKck3DnwtCDqyVqjiakNeGh/DicJEu9btrsua2ER8nyPw4YJ8TkLIY= 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=oKFfsaXV; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=vgzFNgZ6; arc=none smtp.client-ip=148.163.135.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="oKFfsaXV"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="vgzFNgZ6" Received: from pps.filterd (m0167072.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880uao63474081 for ; Mon, 7 Sep 2026 21:19:57 -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=VhNn j1S4XIsI2rJ3RnkMhf4wAu+3j+XovVvQFH44tpQ=; b=oKFfsaXVFMoPvGbzn+b3 0iZfS/ggTaIud2+GHtcP50eJRaihVui+Npt8rV2/D9S/pLvgFKZJx5pydkDLbU3M nIRHKCCnZD/p+pnw/06gLGIUgwRAyrNecTN6RZ+4Uu8mTIblai8IVopbvowFtzVK 0SKPy3FqL6lTEKoI6yqi8QT/3fnZGtfxaNLg78uqFaopl8OfGwzyFX+uLEcyNvLy NCPBpn+rXKeZ65KYMw74lMJlTTRwt9BF9BuN7BJv2jW+u0S1wrW5uC1JwmPDJgfd 0Ni0Blb7IAyanlsrmrmY/hhOzUKju7ftQl6IzypDL9pfcUbRJRrLi59cvkV9ipB9 VQ== Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gj50j10qn-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:19:57 -0400 (EDT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-91049eac948so33743086d6.1 for ; Mon, 07 Sep 2026 18:19:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830397; x=1789435197; 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=VhNnj1S4XIsI2rJ3RnkMhf4wAu+3j+XovVvQFH44tpQ=; b=vgzFNgZ6g/ikOMWx+RiAicAxPHlYYo4D6zspJNeTp1KDcjyIHCKHfq49iWbR00cgCw yZGCxPvnqxOX4JfUWV7L/g0YszfBpqqlp7QMiJiXl3/xIV0yfSOt1C08+c66mjetvlZZ NYmc2A5aACOUUC/8Oyraru8cNYf1VioJTKgM8lag0gI/xyg2ripJVm2Jfc1wX8QU24zB DEAuo1InTrLCg8nh0CxlOQzsJQdhIbe4ygbQSKvYIW3ZuPwvu4NLVX8wXVYToUuftP57 VDF8JMoXdf18nexEeZxQHYxbK/kw80W/+Dm4PGEtYd9T5noxfq+Kuiyo6nKcTmYjnpK0 IP0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830397; x=1789435197; 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=VhNnj1S4XIsI2rJ3RnkMhf4wAu+3j+XovVvQFH44tpQ=; b=BK12crMD9G01ZCKpYW/Tg2+eUr8nBrBcXeiSUhV0fRvv9kxsf3Vo7exq6+i9i4bBDt kyJGBbSZlbmv21kvXBbNcVcOjpd+NnIksoiZ/98Rpq9qfhnWdMMvW3pt6Rm8odN2E/M3 Pf/wu3r/v5ioYbjL9PnsFYgEUo3bxm0CNtvIXZ8N9LJDIqzSlMmsiZM8eFuQlYBs/aPk NQMTpQsJ5lY/HFks+fo5CZwv89YbOaffU7wJPVV+a001HkVbNC4DA6km13urn40IeQAf ZZQklUMW6lar+bxjb1TO4dL1Gi+U8VDbpCNhMxXsanjmB0YIfG5iDf7Cr/99+rHXPkC2 TzPQ== X-Forwarded-Encrypted: i=1; AKwUvBz7ipFrRakI/eYq41KVwPU+WJpVNoOQ137Wkmdb+avBmYL8vlllRIUhjgxY5cDSGqNnSsA57XeeKPkR9us=@vger.kernel.org X-Gm-Message-State: AFuF++mDlt40m4cmA9P+yMLJ68YC/JoGX+ZoN/cn49bJlsWwtyTiSDWl KJbeDkEfNJwVS7Pd90HMD+Jvr6yZP/oYibiFF2zSgIFRJ/MnNlPfYSJnEqsD25t+Cfhtdx6QxjO KURCluwpa+s+hBhb5NGnFfF2OzApR24jDns1Ke2u30u3NRUFq6xDIE0V1vtnQkw== X-Gm-Gg: AYBFou1sRP+QJIY0wgm6x9faqoXTzeU+FOUnqPHy0A3YYEcmATCXILNEdy4yNbUWaoE +1hhnAf5goGgzqMQni1FsrSIj6MfS8tguzl4mWm6mZLvucWftwrI3aJwZejJIhinBi8miPTfCYW S7Ra1WdxN2hWt4+pmAifTEnDhdAY6TzZr6rr3E6kCjX3OsNL1jLUM3p65blIkuD1JvoSNDBAln2 K76sC2VkvsEcpEJ5JueyUJ9FXquYDYGf2OZYQNExM9vMrTNjIFlzzF2kdVqC90FY4lfUESt1ZvM MjK43IFKWK24hrNw+xoL0+bzvyVrA0YMvKPFvU3T2J+eAtpNLVHAZNuEIIJu1tLbC+0mboceV2w +lxvFCXrkeLIJMjaLI0RvCqC+2ltlt6Fp3QZNcpsmeCUAx6ZrxR0= X-Received: by 2002:ad4:5dc8:0:b0:910:49d1:3a8a with SMTP id 6a1803df08f44-91049d1469fmr218429616d6.21.1788830396612; Mon, 07 Sep 2026 18:19:56 -0700 (PDT) X-Received: by 2002:ad4:5dc8:0:b0:910:49d1:3a8a with SMTP id 6a1803df08f44-91049d1469fmr218429116d6.21.1788830396139; Mon, 07 Sep 2026 18:19:56 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:55 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:22 -0400 Subject: [PATCH 07/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-7-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=5421; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=cE1MY+QR9iC20Pf8qIeMitWSw7Yh6AG3T3QMGQ9WnS4=; b=wsrjBGTuntL7ewV8VRDr7/YUlMTyX6fxajnU0T1dEgF/7uUMV7LOd1Yx3RE+bIsQ94Gt8BWm0 bs876ymPH40D6A9/YIAig8t0QBdNeh9D40nwAjm/3wb7Svkx56ZIDBO X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfXwLMn8/raaVFA MRfaveLT5yv6fr1ySayl+fqtZ9R4fdeHHy2SGl6VDafmw7L+BaMDCweWXCglZcLGDCH8iVr1Zql G3ofbj+OK3UiekUOPOcZKPuacJPvFZzKnV0XKBd842e1PjQPGeNwrbNm7deGEUBTO7M+lVPLf82 H5Q049FiO6XKbK79MZh65+gv6rpRuI58aYQzzGgyVu69zhT189WtwrNoH7rpLZt7BWfxgQQZIof Cs60xQn3cSZqFcZDO2iVhc1Nml3FyD0FbWzxpw7jssAjAVq0f3+oQXzcTnsp5sFMGVzfoOD7ASi kMXH5KY12avKO0rqcMoaXuIw/w5JXZD/jIp6z11bLEWlqoNsJM2PkuqRtKfrebtj1326j6E/Q6L GFUifwbruxswDy9fYsK9+SJed0AP0pjgEk+m/g5KiIFwJb0O/rkDANPTxdbEM0cV4CH9PNdzeNM Wrarad1tqvGSEGHE9cA== X-Proofpoint-ORIG-GUID: GD74PZpROQAubFsCqgHB43I0q4l8c9BI X-Proofpoint-GUID: GD74PZpROQAubFsCqgHB43I0q4l8c9BI X-Authority-Analysis: v=2.4 cv=O7gJeh9W c=1 sm=1 tr=0 ts=6a9f62bd cx=c_pps a=oc9J++0uMp73DTRD5QyR2A==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=SsB-OO3BMngHh3ZO9fOt:22 a=CrexS6knh-isOgJd2j4A:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX3sMv5WMY668V n70Jq24U9q5s78y9H6xc2bjVQp/sfqTwcMxvRtDNLj8bIxCCvECdsgItOjTznEvGIkFRSaxUGU/ aQPgq31ixJQV8Qt8klLmIdTuAN4B8NjQkZrxlpAscFEiR8dnbeWr X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 suspectscore=0 clxscore=1015 malwarescore=0 bulkscore=10 adultscore=0 priorityscore=1501 spamscore=0 impostorscore=10 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080011 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 f7346a0170fc..d567ed822e55 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 1cd44a5c193f..4ce07657d2ab 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4877,10 +4877,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 22:21:06 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 92B7F2EEE6E for ; Tue, 8 Sep 2026 01:20:01 +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=1788830416; cv=none; b=ky/M3RBBauJ7WnTebin49MFeQwqkBpHIlQaxMb+5mECKJioDtCX0QwmXJFv1cGMaZenw9YzsDx//cjvHtc+ZcXE73fWJNQMMuSBK2VaU1tXVk/TnLDp9te2SjhdZbr4aIDSnNvTgQxhu0MhTA28WKRQgcYSnfxNwjXEky1+d3BI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830416; c=relaxed/simple; bh=7nh4biHdKafOppeHUfXQJVAnPGIK2T15pqeSqDobbTc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Kv8jjsbCV9qQVIkBHYCA4Acy6iCWdBXt+vtauJSuDyWLyiErtFxnuSjjMP+h84wY1udaxBCdVEPsBH7VzYkDxTWOecvPKD0j9IA/xSkUeEjnzJgqbjJFgNheJEuQ1wl+fUfRhtM0jWQwMXVaSOXqO/OeJN5MpW0ZwMnJ4h/ZFbY= 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=b5oAAz0G; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=sP5nkJUH; 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="b5oAAz0G"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="sP5nkJUH" Received: from pps.filterd (m0167076.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880uUAQ3904585 for ; Mon, 7 Sep 2026 21:19:58 -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=3oj5 ANPCnZj1InlzPWs8KGdUp1fdiscPMzbj0TS8iyw=; b=b5oAAz0GVDTRpz1lbHx2 V2Pgr/Oyh7DLFCNhXx07ueoLJP72iXze9QzcH03JSfR/sR8CwTo3g07F/yEmpKmM ss6wEn1vdSjWbnn5N9kRMJuDDo3p9pwoopjm4USYYSUmQkz+wtKyM666g+F9vwXz LHhCucX95G3oO7ZPuYUlvDp8rI7SDIHFuhExqyh0sppwDvQOZnb5sFiq0rvizoxC fazuT0HLR2ALN/2xOE5zyaUxb+PZIQkdy44sEuIV7hrCapkUKgoCZG+nvZVUWuei OmT/1ZVxgbi9OYkqdSULfcDYBHwLO/czKYwds6N3EgU5Hk/4nwQw4mmO20zDMvs5 0Q== 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 4gj4yjryf4-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:19:58 -0400 (EDT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-90cdc69a7b5so73733006d6.2 for ; Mon, 07 Sep 2026 18:19:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830398; x=1789435198; 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=3oj5ANPCnZj1InlzPWs8KGdUp1fdiscPMzbj0TS8iyw=; b=sP5nkJUHhqkqV+WF8u3xTKEw0pfc6RPZk00xUlgTcHzZYqKjFWc+oLQ7cYyWiOQsJI QZNmhJN4gxqvI60lQQmMdjvGTLjY17jndIUi41KQc1tVwvb/+sFur6WXHHFQaT/6xYtA JRDsH/oRdYJKT1XiBo5oliMUJlbReFOcTpPmmlV3+RwMyPkFucPCEaDi3u2bA564zmjD fv+kGl1NosZdZ/7pwNoA4mw89ZTSxrAPQzOt4k4RsUH5eul7EnSdmy2gp5kZqAPwfiYo 7172Aj3XqTfl5zQijCbf4r7BQJJZtQ4REHc8pAQqeep80UWgsvyUk3Hvhw+nNL+gFXB4 FR6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830398; x=1789435198; 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=3oj5ANPCnZj1InlzPWs8KGdUp1fdiscPMzbj0TS8iyw=; b=nnzd9cMQFymHm/r+vtn47tBBmCVG0Our+jZ1LXgMyiJiirnHUENAB5GjmhbsncLZr/ F0sAdzQVZ6QBqjGe+SHg+bQjeIen7U/izhgaoR/tQzrJOtt4pVnqJnXRhF2C5R/m1ehB vKlFOuuv4I1jJhQuvHS1ZJvbJOQ0+Su436WXRlo/By+og8zY0kdjoCRnDJiQk+m4f0yj GV3OGZ0yKvnOw9r3WZtxFYiWb+f0tA6EomAKqbm3aW+39eKe949j6psgZ40jan9yyQAJ tbHcQ44F5PNDPpKS0OXlj2bDkyzsfzaOnyZ+pm0/giMwTvGzz6FFWZ+I82sVW0eWNh4D Pw/w== X-Forwarded-Encrypted: i=1; AKwUvBwKF8dKbw9sTu9QUCGho3/z4Ft7IOmQMfwe1SdNF5mUM0qcT7DgPgJIjaomaMKV2+U9t8Jp1uDsjqYSrvY=@vger.kernel.org X-Gm-Message-State: AFuF++n/ngjKjgh5JmGnXHX6JVEM5NKzTIgjWeTjijnJjU4TuUV7sIoR tQsCVnChrmmrD1rJl+Cdp6mu5l+lPjonFdAmQn0TksiweOiZpAovDfyFqI8NFXMH0dK4qR2vYct MXAI75KD+C5WFp6NmYN31KZ0To3SDylYth/r7CQg+ecTdhGC8nxTuZm1TFQUtEQ== X-Gm-Gg: AYBFou02mdAcRwyTkhUgVqZh7Yg6pyO1fbsWvqskw3uypGcPZHpZJEEhwCk0Af6aHvm Z7U4vJwZLgvx65kkhWPpu59cnAp4OpOQynAqm4BEdgJ37zd9QLk7f1h36EYTKHOVKrIsMXMlzE+ iIhpgye8QuC4gABYotsupzsBnV5AiTPl8kApNBF+zSX3ATpC9AKyIZFcUtzM0+xRdl14PIZ/aij cKtu4dA+LnntbOXOM04nlwTDUTjl7bulNOsvWflrklAsdCR1gadrilbKaQe6rsc1Fx6837nAw64 z70GUYOBlzcOSD7uF36BMTKr5CogQpKk88SwTvd1uHTK09y5quOejQK04rxo8V9SbthpCfQsW4Q opJa/T+05arQkN43W+6kZo0R5WCbQCjwmiTTNE4ac1aR0NUwu/ng= X-Received: by 2002:ad4:5dcd:0:b0:910:4080:dc4f with SMTP id 6a1803df08f44-9104080f964mr326648316d6.4.1788830397579; Mon, 07 Sep 2026 18:19:57 -0700 (PDT) X-Received: by 2002:ad4:5dcd:0:b0:910:4080:dc4f with SMTP id 6a1803df08f44-9104080f964mr326647856d6.4.1788830397059; Mon, 07 Sep 2026 18:19:57 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:56 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:23 -0400 Subject: [PATCH 08/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-8-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=8891; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=7nh4biHdKafOppeHUfXQJVAnPGIK2T15pqeSqDobbTc=; b=qAkvAWnOheCP815pnhf9wcdUMFupSBg8pQwF8uwlnkQkLITNhLI5LBKdoJmi/F7e+kYJsGVwc aD4KeHYzaiKDEjhz0KhGrNBelOOWkmCkwHx5FwhdBS5rRvfNT/N3Ck5 X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMiBTYWx0ZWRfX/Whmxj/flNLC L7d60OnVUHYZBWmSC2B3GblCD1DwXC6Y2MwYTnvKR0gl95AtPkuywBG7pAj4zv6pj6Vq40S9pyK NC3VB99KxsO3s6api1TBrSkw11JhWeAuk3COBP7DHIVMUveVBP/o3675dM8K/Bf0k+mdcAJAm7o v6nvTURyJi9Lq9AXjm7q1UhxJ5bUf4Mi10SQsFxtnpWrKCpGLCILX5WyhsJEDcB3sHB8jMvHE/M NdPYs9yNMAiL4HqnMGStT1W+J/E12trAEGyMXR+QbS8xpawHthNgiOeFuNClNJm7p6UER5cG6T8 ZAQwHLWZJYijwy/7SIC8PsdOOZnh2cUwC9QtfRXsOclLrfOQ1BMdi4h684UhXHUFRoKRlXYQNx2 WuGizpX766pHax351HzomR02g5hX5kE1bWMhqSMiZmOCubdclfKjIRb30rOCV9suAutIy+7wbWo vumzx1He4cC6HEmJ2cQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMiBTYWx0ZWRfX17d5e+MWv960 Rwx/HtUv3hEaHhMwpl2q4yuOs8lv7Cp2YezZvfkhFk1+ko70FFkddcKqvbF0IXsIXCkT2wC8R0U LhaApgCNuCklWZSAwvAsGtXb0unIJIbQU43A8r53RX48Q9TiHWPa X-Proofpoint-GUID: 5P_AFZpoRWRc-sarf-SR_UjKI30WBnA1 X-Proofpoint-ORIG-GUID: 5P_AFZpoRWRc-sarf-SR_UjKI30WBnA1 X-Authority-Analysis: v=2.4 cv=K/QS2SWI c=1 sm=1 tr=0 ts=6a9f62be cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=Qm0qsxP7aFY2tkT6R2MF:22 a=iLG6Hs8F1K9pulr5F7gA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=10 adultscore=0 suspectscore=0 spamscore=0 malwarescore=0 phishscore=0 clxscore=1015 priorityscore=1501 impostorscore=10 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080012 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 4ce07657d2ab..99824a25057c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3067,7 +3067,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) && @@ -3162,8 +3161,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; } @@ -3279,20 +3278,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 441b315e8a98..79d0828c51c7 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 1230da51fdfb..d2ff3b568eed 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -1982,9 +1982,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 08a15465a087..c2100e6e267b 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 22:21:06 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 18F632BFC8F for ; Tue, 8 Sep 2026 01:20:03 +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=1788830413; cv=none; b=ji8gZPIL7M3X80QTHnpJLgjM5EoOlMN+XS0u9/t/taS00BGomEibNFmsfzd1xsEE+yKcgfPqhGR2LT7Ucu7R9PUKs04wm5UZSa468NPAV3NcLCCslmO1WbN8O55fNnHXnhdTUnXcLx+ZJ8hY9H/HDLM/Mt/u6j8LN/SqpHKsJPs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830413; c=relaxed/simple; bh=uRXhIq8JuDc7ZnZybb1E+rJV/7I+xejnLysvOyYl/2k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NuMBYnoI3XcQTHmOdmtz0TWpmqe/3/u7bmT6vBDO2GlyBdWhyQcGxgKDF10SZOdzkzILZgbUAqNeu4Zll/au5sZ3klqGt/4y3KxrYODMv4VBiT/AOycEpqys+Uue8065lywropFWIMMWDWjQUp5lSC7g3ahlFMILz2VIIaLItls= 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=vDMhrSXY; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=1eQc/NTZ; 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="vDMhrSXY"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="1eQc/NTZ" Received: from pps.filterd (m0167076.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880vPSE3906634 for ; Mon, 7 Sep 2026 21:19:59 -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=go07 a57UCk9Pq2FzfkEchcYzQG78Zi7m+LRKf7xN4yU=; b=vDMhrSXYOdl58U+gwRWT yplTBj/XR8uZFn0G3hjZoJl2V2E33sPgLT68y8mkxOx8ofKA5ymQ7X+MitAskDFX FaaXe9UicFqI5KtjZKCTC7l7cj2Ff7ab6M20fkJOYGxbEdTpdGx7vZHAl3ARL4Vq dfRrXMSP1KnVxYkgXwjM84lWcJkWmZuLFF/DPu+VC6qoKd6bokjO3q3u1qlhuSsy 3DS7z1rtah0BB6nW0LrGm1ENcO7HdyTKdKDfHxpqv9ywAoDtJqqVeK8NrIUoMY5R 3B+X935IgMcwqjK+dNVpLLJbYinFdzKX6B8zwlMJiDIjRQSj6DNxmMJUHmMFT2RT eA== 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 4gj4yjryf5-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:19:58 -0400 (EDT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-90f8b463ea3so44127746d6.2 for ; Mon, 07 Sep 2026 18:19:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830398; x=1789435198; 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=go07a57UCk9Pq2FzfkEchcYzQG78Zi7m+LRKf7xN4yU=; b=1eQc/NTZAEGqOiKQN5kOf2nwpBU4mWCeVSmXFbbOoe9sggJHpLXtgqZaiRiL9QPY+N 1+ah3PJewtrGBo6u9O8aPtQPoGHP+kMe7MN2JU5gvqrxxmbT9JR/GPUNoquc1KOZmKd/ m+iIAkQPjK+qff/aWl4z/zbETyGFLLEGn5t1LJgkdtKo76cMy+9Y2Q07WlERaA0vaoD9 7ZafNFTAJQSjun7l1F7WJHlBVeXttvMlzBSGFEBzUCgEche3usT8lRojR1OlHrLe9ByI zZ3egna/Xy9GmbBxzbguFdEFk2nPMJpNcarhXVtyzJOusxIFY3Zwgw2ncN/ZwvKHz3/N 2C8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830398; x=1789435198; 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=go07a57UCk9Pq2FzfkEchcYzQG78Zi7m+LRKf7xN4yU=; b=Glt760PYUDyb8FLUwiSmV3rlfCG6Z7I2QZNqUzIZKQPiblnPYf46QWgpYO6CT7dIei gQYHbeQ5YYfRZ1rcgZM6qHToKTxJZBgxcViypMpHN0u/nKX3jfZbsBpjzJu/VG5TOu4v ZMXEea8pmHsEXRV2kECa20nPpVC4kFOUeK1JNFoer7QtqzmkbRNRngorDZ339TFRTz+z fVoRtS1l7I1z89lAfcgRrmOyWbhuNNnCX7uVa9ZsW5rNT3MH8AC0X3fvkJ38VnY1vbOG 6Ip8hR/0KikSiZHzBSyAXOxGhhD7kCPH9Lb+vZh0HgygTjdXDZrYcShRne7kNmK/d/Sx B6Fw== X-Forwarded-Encrypted: i=1; AKwUvBzjukQy6EDlGFU6QVf8x5rsFcnrjMwj5ZfVhIy3uOR5NlABaAzNHJGurTWxASnPTMZO4itsVl1Jn0TmWBw=@vger.kernel.org X-Gm-Message-State: AFuF++kIV+2DlXmZHPBCGrT+7+oq5Az3ZkIQ0fLGmfb23t0asA9Wvcfe wlRCgKqF7FmMtibWjs6Q02hmAQl3tdBQquFJNKPUbmtyssKlIBs5beuskzC4z6qUGzo+vS9KQtw /xlQT8XjnpSb6fPR2WT3XYVOaDgJaY4+lqu8PRe7djEWkRbwa+j0bpsR6RyLaUw== X-Gm-Gg: AYBFou2ydi2F8AGnavFepQ7zwnvTJe4xQKUt41ByQ9xW/3rxyoc0FCMo7/8+HTPpTkS yGhYEfuaG18vdnebS2ZRPXDVz39XD+3zuBv5PSlQJsLhtJHy2jO/77VAcKKXIF6OvOYWJRPsbdf Mzac+H5sNr2RJqjaIqBaB3v0nlPtl7cSrNuSgCJlLHwBNz8rTj3b2zPFXqf8HaG0mNkqofgypPE VDHX+ozE8v7S/RRSVNmnrHWdTwlUsn6VJy0lhcCJtKAxphUBFmB7h+mADjiyBBHl6QfSMi2gvYU Nan2eDLdUx9ACKIat6jFWavl6zKCPIin4IDmqpLvsAzaJgB/c2hCYhjhuXc3057+mY7G4AJInmL Lqht7+90K7wY2+VqcZLrcAENBpNcSBPBHN+fxOzMdQ+UrSRn7SPI= X-Received: by 2002:a05:6214:1c09:b0:908:23fd:813f with SMTP id 6a1803df08f44-9103ef9fa90mr353340736d6.15.1788830398243; Mon, 07 Sep 2026 18:19:58 -0700 (PDT) X-Received: by 2002:a05:6214:1c09:b0:908:23fd:813f with SMTP id 6a1803df08f44-9103ef9fa90mr353340186d6.15.1788830397796; Mon, 07 Sep 2026 18:19:57 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:57 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:24 -0400 Subject: [PATCH 09/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-9-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=4011; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=uRXhIq8JuDc7ZnZybb1E+rJV/7I+xejnLysvOyYl/2k=; b=YODK7yZhL0cLUSPhiNY+Dz6+ZXmm2SbO1tTVO4HGUKvrKSzeX7/45JzgbqGlqk8X2DXMcHtjF co/jilrKuRrBAGYiHqblaKYsaZmwwOOixMiiOQZEA88GVUtuOeZy+su X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMiBTYWx0ZWRfX8SXTmExyeU7y RoqpBh6jD9AWgBj3iw9ORiuFnkvGyqLgy8TXEtBfoix2nTiDJGYK3cYD7k1c3K0Cabc2VnMd7oc nNCndwUEQr8IAyK/zp4kP4JP5sczQYpyDAB86PxqV3Y7xlbopHThKQrEF1AYW7u7mtZzgFfULGe xPwldPvCAR2r1SZq9YKPsHYi64YpaeVBipc3p/iKVgKCtNTofQXCE/3sroNekRHdz+U1MnyNaJp XQM9Ho6kM0SYacrW7xPCIAd7WHjk2+GCAPN4BYXX55G/HfAtCQ0yiEfa7a/Yn4GNRTHw+bhA+WV MwPS28AHSIv3w33dTdK51SET+foqZielIA3sm5joS+RTcRh5Bxf0KgOYHvZlOUC0GQ8kX5g5rF0 WnrBLLlkXkACfSRpSKBA0A7BLZJUmiVyKjVA+2iDIBbOYmC7EgKVWOijLbS+Pogqxww7rBWB47V ZjYWvpnHmzP1teWMydw== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMiBTYWx0ZWRfX3U0Vf7KJtnom dstdSrHabFTOenS3r9hMasBM7kX8JmwUY13oF1at1oLOmYxSzKCaOiwtNsOtO7rGKimdZvv5UhG 6dYZJIVPpIt0kjgGSrmNFvOrzSUoO9rLPYv3ii7IWyBaQrzMdrZH X-Proofpoint-GUID: tVSfNDfuMJEimVydS1YdY9AtjNebB143 X-Proofpoint-ORIG-GUID: tVSfNDfuMJEimVydS1YdY9AtjNebB143 X-Authority-Analysis: v=2.4 cv=K/QS2SWI c=1 sm=1 tr=0 ts=6a9f62be cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=Qm0qsxP7aFY2tkT6R2MF:22 a=UPWLJQKup_2xIvwY5mAA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=10 adultscore=0 suspectscore=0 spamscore=0 malwarescore=0 phishscore=0 clxscore=1015 priorityscore=1501 impostorscore=10 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080012 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 99824a25057c..bfd7815a461e 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3162,7 +3162,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 22:21:06 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 3AA4B2C21C5 for ; Tue, 8 Sep 2026 01:20:05 +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=1788830416; cv=none; b=t+BdhbieamcufkLKMKR88zJRruuxxdDPiuQtZJCc1LmSWi0V78BJfL32USsEgyH4sWF3iFwh//EiGA5LBvmMH0vbjkn4NIX9zSV54gVPovETgYpnc05U/37qGah3bqRzL5w+ETelHt1igoiJ+oTKb7eRKrTyZjkXK27TMYdXnkY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830416; c=relaxed/simple; bh=f7QP8rjkTL/hFBjwJZZfAUG7xOyxTCYpKox4iSRIc30=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b6sQ2roI3gLgevotQmBThBnenKnxU6Yk8tnTUQrsULwRP1xbr9GyRFkN/bau0V9Uk93t+UStg6pA+spUqddg60zVTrPpfTrxvjBkSkWhHFWXYe6R1nND5pRvx2IJRrzYXwKHrIn1C5U0sDkxyo6IephfuGNpGdHWkozT1HxH0ig= 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=GvDd1bKv; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=w36lcRMK; 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="GvDd1bKv"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="w36lcRMK" 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 6880vC3C3797994 for ; Mon, 7 Sep 2026 21:20:00 -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=GvDd1bKv3XPuSkgEJv7x +URXaElAVLWfnGpVrQnmRGgHjMqWvd1eu3GF2B+1RbKfkRUuwdTlRAU1D8Ghmjdx McBfWuJnAq6LXfXTQyiKePsHGKHAF4OalcpuPj8Cepob5Br8jFwHWiMmJ6QeGWVx 5gILUTi2zTlbxokjc1DGrY3J13btTHN5HDlhbkr4kNsf4zqhr2BKSrZZ4bhEiBJx flHCIQQnRvL88ZjqQhCIER9JVAIV6AQFXnZtbYYqIWXbe+3YZNqrFDQV5DZGDwOY yu5Zp8hZyZkk94zxdyEswJ1CuymFLzVO40yIzmP7YIjhMoHZVRbRUt3xDe7L48qU kg== Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gj52xgxxw-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:19:59 -0400 (EDT) Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-938153538caso624100785a.1 for ; Mon, 07 Sep 2026 18:19:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830399; x=1789435199; 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=w36lcRMKuL1c9KNSSgNZcIa7CpdhvtVKaH6Jv0Fh7E/hrggq8kY2e3uo9PmRB/JrFK yKXv/7dPcJQjt7mNbrN/0w+iyqmceij0I60dF7hXT6FcgWKWv4fU6FnCPMw8XY+LIWRM T8gat6TFXaf39ONYlHL1Xhnrfn0K+EbzOk0ZA8J6qykL9oyFA/v+HL1L9DwOGqYFS8gF tQoP4wEOsdCyioOaVYYkyii3IvYdueKza+16ywhkb2jQuXKwsCtnSIjgopyJC1OMmuOy Lge/BcFtzy2sRXYJOfSW8vF6/wI3cOJsD8Jeo4Q4wWuREkKlaomTD2+8j+JJFDvqjCcv T6TQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830399; x=1789435199; 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=B/Iu9tgtQIYanG2E1jSqYAETUnrQJqFt7oZ/nT+SohTNqI1kyptz9XM7930DfpAAFy Zk4gP4U/vG8zo0Di1aotg5PvVr1n9EKQ8NXFja1gq0s1DjI8AWCR/0bOIpDN1BKW+Lds C7Xsfva5/j3Q3XL3zR7P3f18Ks9eRTrZrGVcAp2wVZxkajHnM0oiSVGlPgvcg1t5wv+p c5QWHCNeZLgukBBLxrv3maF3m5L5wbS6eHzFxuJw6HqbzK9Zb533PkkzZneCakxm2KOC 1G2pQY/+4CrTzFvvJ6lz66yC5UIBYRZwAZityS234QFp+msfzBae15cGBwS8h6ZqsIWr qgig== X-Forwarded-Encrypted: i=1; AKwUvByOhLkPdPOXT58jGIHwTzu427/BdGYMRA2bLEOspTgBNs2XNdQE9Vos07sVsLUAb/tRMxTft8T7uHRzc6A=@vger.kernel.org X-Gm-Message-State: AFuF++nNIpRGbgHFbipPE8Gz2zdQkndFFi6NcQA8irZRNcv2letXhxyp WVI/Dfj49vCGT4rStlEti0IpvvETXgoSixMMwiSDQtt8j9WLol8HAhsH5C/G4batl9xYo27r0Md zpgBaPAxvtwiZ9S73fMm38/MNDGwjxPOioQiRJfgQilClYRfmS1Li4LqLY+16Kw== X-Gm-Gg: AYBFou2JHp6VncQkhtLpJ48igHcwG2WVtfL4PDG6W9jfNwkO4knFPAhhv0bBHn83YCe DbZoazxHslL7wKhLxX4S4TORqQ+RG3lBIYk732dJ2IGIlAAYawP2hAnY9g5RhcgEudL9FG9+vCi inhOQ9uE0Q0C6Aq8GHDR5QXHpRSDwDI6WYiUBP737ARI6sC8M3jc/XKcmDIOA2SDWn/gMpbUtev jS5jnfRw4IuwZSu5XJ95znglCJLMXZFm1vKvo6qWCbnuOzSmFCrr7W302abLZtCMMTvz/bLSA1x a2Bwjt5wwpVTJJgYWFk0G0zBYNdHAvgntFpwbpv+tAfFDSxec6kBx8wTPqPBuBNgfCUa4vYR/EO ovhTcfDwLUrGADOM9Sv6OoF1H4mKTrgFlkXt0PmlBtZ/Hc1mT01E= X-Received: by 2002:a05:620a:6ccc:b0:939:4b0a:f0fe with SMTP id af79cd13be357-9398036c003mr2792715585a.14.1788830399061; Mon, 07 Sep 2026 18:19:59 -0700 (PDT) X-Received: by 2002:a05:620a:6ccc:b0:939:4b0a:f0fe with SMTP id af79cd13be357-9398036c003mr2792711785a.14.1788830398634; Mon, 07 Sep 2026 18:19:58 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:58 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:25 -0400 Subject: [PATCH 10/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-10-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=7181; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=f7QP8rjkTL/hFBjwJZZfAUG7xOyxTCYpKox4iSRIc30=; b=XXUVBKijr5ekZZbm8bqFdYOgsegz6kZIRkynI4v1R02zi7Uj3ZNmOk5Eqv6ezJCPCJ8cYg1Kl xsFnj7Ggxm8CrcWMBN7gKvosal7mVx0CJ4VOAsXZoO4ZZ+mf3bLCRIW X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=MLRQXsZl c=1 sm=1 tr=0 ts=6a9f62bf cx=c_pps a=HLyN3IcIa5EE8TELMZ618Q==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=azVShVRs0zEubeQ0wG0L:22 a=qCNzSPQ7UVaF4CatvjwA:9 a=QEXdDO2ut3YA:10 a=bTQJ7kPSJx9SKPbeHEYW:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfXwxER/d2xRtu4 Wa2DsRrFmCqsMbpmsUn7uapWxSlE7/xLMeNJt7KU3FTL7PTFGSnMxgLpMQSsQSb2vs+TQI/7g/t pH3SglwiUTGNUz3ky162Mu/DEmr/zL//c4L+H21AcMpFKze6QCv0 X-Proofpoint-GUID: uizmoLrRi0VsSdek7VIuixZDZ5wzdFPJ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX2EkS1FgyJ9p0 uTKMjgja+OzxLohemN7CIL6HuVQFjoLP9s9KEN9bT6G1oARiuwcrcN75pY+FtjohN0MZFLMzhBo rK9qHW64WbGuEhpJGCHBHEkQsXe/WMS85zEtofYMXMBWT3upPyIw55AVMiUlDMfBi/tkUjnI4SP VaRG4lnP6NOC2/pQLWdbDSOgdfxZHdEOfXaCNJ0CpiZ6Ils81CuI+ECeetErIzvd2IS/dAzf8/K HWYg0WkgZ38E/eJ4ZwW58LtPqWolef+UMz0MvQEBdfD68awp9NC0EZO5ttmZywK7z/aVmJo4l3n q0ulGs1XT/aN32W9/bwo8DwjZ0RbGOvIOMOBazoodih0y1iwZU5e7Ka9R1Mk3TOL9dzGWNb7ybU MQOf/HPt/shMZAXo0Yo/eFDDmM7IgGUarRDABHtX7MS391i+7mCqQLkWbLg/fKxrBZltubKnSNV uzqNI50vBZ60zEwwPxg== X-Proofpoint-ORIG-GUID: uizmoLrRi0VsSdek7VIuixZDZ5wzdFPJ X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 bulkscore=10 impostorscore=10 phishscore=0 malwarescore=0 adultscore=0 spamscore=0 suspectscore=0 lowpriorityscore=10 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080011 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 22:21:06 2026 Received: from mx0a-00364e01.pphosted.com (mx0a-00364e01.pphosted.com [148.163.135.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 416C92D8762 for ; Tue, 8 Sep 2026 01:20:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830415; cv=none; b=dwoK2lnEdDG2Rw9YXdBFbBlC9Y9/CEyhqWRkWpyVaBnuRu/o5U0kIXVZuJoLbltHYK/OAU0msXx2Cm1pY0NBTz7Ym9SWlsRmSZI+iLGn4ksoF1lJfDC4MsuP2p+0dT3mgBIoCYav130hPvJe72ubLlnMmSypXjavt+KwYovHXR4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830415; 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=c5E2sXkygCnzUdGnvN51gwvhmW3lLwm3TE1UjBN9kjvo20Bm3VCyADHAnDaHS4DDMVg5McsbNkHSyi2BmUBfNJWe74zUvAJznXKdYUWkEo+hR20aMqgCjo3PrRJpO1aRLk3Mkc8y2kQDJZ4rb7qEcfq+v67oG7r0dclr7pAw9Ew= 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=F7n8Ve79; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=DU4iwVod; arc=none smtp.client-ip=148.163.135.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="F7n8Ve79"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="DU4iwVod" Received: from pps.filterd (m0167071.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880vdka728471 for ; Mon, 7 Sep 2026 21:20:01 -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=F7n8Ve79uCInyhpgZzFQ bnrcyOL8DNKFOCZfnuvfIceYivutmT8GhkYDKbmHw/mudxbsfWnrblVjwI6gWqRv bxnYch57eW+cC92baY077AjlaC8NXyMYmdm1/uDJAk/uTGtedSspwcWFMBcDbWxX ImDTnTyIV1UGBB4/c2DEv6cd2EqkfwVjS8tJGxV1a34/SFqGMpGRhd4VGu9PPmUa Tfv9fbMp4Lamb5QavYikj/4JPkGIqKdh99SQW3G+jXEIEKKtQ68coUKYrUVnuH7+ vzKz+kqDeajk3QKR5y5CEoDIv+l0sZniKYbtccE5Lxj0vx89aghnVLCFXeKflnWw xQ== Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gj4d596mq-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:20:01 -0400 (EDT) Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-93917f4ccb4so483257985a.0 for ; Mon, 07 Sep 2026 18:20:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830400; x=1789435200; 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=DU4iwVods0UcDIji+HsxRc/yl5kzuiykmwsPhVRcScmhM6/b5kZUI5z8MDVjxTYmD+ wE9V2+PoKsgHg60MeVWCNTODDOt4T+8RXcONJxqrXiCtNP7pNNOpojGOD3h1oLJlz4u2 1sWA5Aow//KMYX8MdjQ81CqfQ4xc1aOobCgkCWZCEDlEhzDr2FqvdYkCNDDyaBmTvvUV zEglw+CwsRtg1RddxxK1c31VzEmLnqQZEA1Y6osFc0nf5Nhi20MSNqpn9kZL+e7s+ULd tTqCbLAOQmC1g5Gzsox9qjgDqakvRwUQt/PsLciwkGyINYoeNWDCpOPneN4FwmYY/1AX hxHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830400; x=1789435200; 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=E/T+an4ME9WrEOKcjq1ofuGvMRFJPmwgzd+54jGUqtHLG5LX+xOTxV0XnZZnGEi22y xcul8H95NVj6Wgjka3/fi+/rc/1XJH4DE2JHLSmJCdbKb6LtR4c1zaz4efqGJkbQ/Ef0 VQrH+4PHEJQqI0eRiCLdEAJI331MtK2qnItw8Cpj9VoYy7y5d9Y4KzIEABbTbYvUBf4P Ci8CEr0x4qrrfWkqk++0vTr9XLHPiqVEKuOjGmPPgBpT9iMy4sAwLac+RaI9XElLpXlf lr0fzx493GmBpg2id2XsGa8x+KkIrhhWQ4i6neSbFQFh7WHrE71f1+bL4t/9zFfYMr6w 5klA== X-Forwarded-Encrypted: i=1; AKwUvBxk7N4bNUdr31bBqgiV2kI0HkfaK+MXrIfqLF/Wi1Ttp2njjZvvHQ6KX16lGLj34PAiI1aJPF4i72XdGOI=@vger.kernel.org X-Gm-Message-State: AFuF++mNEAsfVUXci3x8cDZzjGFE4biOqQeCQiIBmhuQgTIIMrnLxLiu G59zMzunH6cU7imUhI1616aC+xj+VN74675zwXx9zVoQpSOW5VKdN6Ngl/VH6JtvAgn51n+GRvQ u3pb3MFX65Dfc2TEbnhr+PL16m7hdc4L/RzmQ8Yn6+mgq0WwsVEuW2cfzlZlS/A== X-Gm-Gg: AYBFou3LqrC9lS1JqGI8jcDGQfNK02aqC3VMSMpj1VIRi4kyj1FzI39rqwwfXHUCJIC BaAD5iPqVCtmnStYe4KL5Z7uwnzY4wak4JLQnDBu4C0vuuQ6Lo/mAId218s2MC0o3LarVbzm1jc 3kwY/4R4k5jd4iX6tvHNwTNfhdtPvOBzbMEwZ5eznHEjy1YdlmKdwRchrmZ55BMG9obleLsO4aL 9kFOEMdYh96jRqrogt0ccNCwqiDKyTR7YvufKhih66rzAyGjpuC2SLR0qT/Ym4YDqCo98flMu8Z nxwQy2tTCJWSeuI85x19/B6r2QTOxjr6JuxPJF23hOztVgok04tS0PwR0KGXnnPqvlX/EM1i44g 1dQ41ui7CcIMLQzF9dZNaUIDGCiSb7fe3CkoTMQmUBcOHF22VONY= X-Received: by 2002:a05:620a:bcb:b0:939:ad19:c5a4 with SMTP id af79cd13be357-939ad19deadmr994370185a.39.1788830400055; Mon, 07 Sep 2026 18:20:00 -0700 (PDT) X-Received: by 2002:a05:620a:bcb:b0:939:ad19:c5a4 with SMTP id af79cd13be357-939ad19deadmr994366585a.39.1788830399605; Mon, 07 Sep 2026 18:19:59 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:59 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:26 -0400 Subject: [PATCH 11/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-11-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=3841; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=rTEatSh2afYJTS/R+S9oth9gqbiO3TcMxRS2cWJg+9I=; b=vyHSY9/TnUHDP9/BFrGyZaLEpHlN5VMmjY8Ad8G3nuY6mRdG8nF1FaffM2qYKd/uCWqJtnXMl V0z8FsHIzLECXsQ3Lm4inVw8kf6RLOP5i6SAjrF6RfPSIRAsZXJxrAi X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX5B+VrXjCjmGY /Qp9REy1EZz4gIR3CB7m2oBEcWYZOx2wnbv6dYJBdY5Vkg0VqoZagbS+vMbjQ3IyaUve3g+oKfF nNnwY/4fXAHyRuZDH/dAaLV9SPf5hsN1LvTzdQ1hjluPJW7+9CiAJr7Tv/cuHPwEjKdEln4BIb3 u59q7TMfjiZal1iPnWa1jziVRooUhH4y1aONzjMuWtoElpHfnIkFQwS7RxCMIS6UgKVQLvts7BY xgQrh/YOm57RlJvnQiLp/VDepH2p9Y67ioeCdAFaFwyplbMzBaEvkO6xcTC3HUuzqgp2fabAT22 Ca9ZFFiOP9T2l1ox85F26WicwUC6JCBkTdVoioyXWJLvsCALWnavIYZ0c27LNdOWgMfX/x48jG9 OHpg3pyqtm+ui1dugse7eACFD5kxVAuzCAPXUz/BWOjwIjVmC+rXmJvasp/pf1xfW7gdCsTcMll on+dZtLIvhGcXIcCGlA== X-Proofpoint-ORIG-GUID: GMHIMa7sX-Bu5zSveuO0dy-GIOFC5L1p X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX1ZpMbGcuh6Fd lOnAhDAR0g7Kg+NGRbKqetAfFNyDahu5CmZp36gL7ZlhZ4kvB5Dg1SDiX/VhXjAfx83lxkwdmhG /0J74HaksHqAGeuYbRjmOw3LjHN5P+vnGVFCt9Rt4XVvZHkJUaQA X-Proofpoint-GUID: GMHIMa7sX-Bu5zSveuO0dy-GIOFC5L1p X-Authority-Analysis: v=2.4 cv=BqCtB4X5 c=1 sm=1 tr=0 ts=6a9f62c1 cx=c_pps a=qKBjSQ1v91RyAK45QCPf5w==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=79PYxaXUQd1wl-QFWJnA:22 a=BlyEiQbNVX7t3OJdSnkA:9 a=QEXdDO2ut3YA:10 a=NFOGd7dJGGMPyQGDc5-O:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 adultscore=0 spamscore=0 impostorscore=10 lowpriorityscore=10 priorityscore=1501 clxscore=1015 bulkscore=10 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080011 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 22:21:06 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 40BFF2DA749 for ; Tue, 8 Sep 2026 01:20:03 +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=1788830412; cv=none; b=ca+X5ni5NvKLLC/OvMp1DP68ssAWXYfMqyD4tJcvrV/hz27Q3CFu/FIOItcZ1DcRVuYcgWQasvhfMUDozy9V2n0nfuZrytIXsfXACvOvpzHVV3RDVT+D9sIrNyu5Upw/VA5/1eR5nEydbSxUC/mh22od/97/8f/1nhmhugUTpY0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830412; c=relaxed/simple; bh=s/LxtVbEHOVYU4ldcfT6uxuIsoUevA4AeoG9wWw8HQM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=vD257oHHGN0S98O+oVcD41ERbBY4jlmKBu7tVCk632Fz7LtWtREXynN02jYERZfcPLkWGKcBmFK5kBwIqiT1dDF4D5bidbvFKLMtAh0ZmFBMVVfaTXdDnTA+/Hi5SlzGhtIYHKr/wR4vrABZfVhU7rJVLgAR/rIuaG+9ctJhtM4= 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=pYD6c9Et; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=PRoK9h44; 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="pYD6c9Et"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="PRoK9h44" 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 6880uTs0096006 for ; Mon, 7 Sep 2026 21:20:02 -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=l/YP Y/lrskj2rohGcIbRXYzqjPjjZ5iVqxwDPnvnGKU=; b=pYD6c9EtKYnTj9nXe0Na 9YZJZnyW24qrY6yC5DjwNbjHBl9RTd24VeGfItcnxdoaUnnAtv/Peb4tBrns8gUf cr42QCf+CGABkjOAAuveh+w5DcBxh49ikCdVWB2NcZl8i9G30V4d4G2loGvIKcO0 MuGg7XtodF4UMedboRUiZl2+2AfzsQdjXnaER1tTEoV0r+VUFn9Tx1ldZFn4Z5LE U7c+GtjSz4Ioj//sCvE8FYBeeZCzaSplpFAi140tTNgC8KFyRC1T1SHEinzxV7vV PIYDRodBfwBZ5BraG+4DEdIDlqKOWb4clEgNtckOIgmj9LvFnAqEhP9JEtBERHXu 8Q== 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 4ghxx236y2-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:20:01 -0400 (EDT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-91051512080so29056906d6.3 for ; Mon, 07 Sep 2026 18:20:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830401; x=1789435201; 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=l/YPY/lrskj2rohGcIbRXYzqjPjjZ5iVqxwDPnvnGKU=; b=PRoK9h44pIKiPivj8TPWwjneVR+ILgDHOycEE3lW4S3EMR0VEuSnuXL1oBIqFOU3a8 h/hki7xqStY1tMYDBXZkHW0mSYPWtO/4UEv1ztEGSg77ePZRBTVm2tb16O1/AZrQHmL5 XSgpnUsgSj7TSmKIelLNnwD34nmR+EhDvxarQRCKssq3mwnoABBG7KNfm+YIyiROth5q QqpHpmUMtLCZ8afx5+l60lLtniUyYdFr+J2u0HdfAD+IVEHjdlccZFjxRGrdobvMR5Ic l2Yov6t1MSm5dfk7Pon+AKAIpQ6rXPv+CIDISoNC9u8vAHp7N9kn6X6VbN2uPAS6NnDU FYyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830401; x=1789435201; 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=l/YPY/lrskj2rohGcIbRXYzqjPjjZ5iVqxwDPnvnGKU=; b=X/UzAlTuSXXzawARgciB6hrSzmxody+evb/h3t2qHOs0NFAHzj4Htys4+IA9NCE0/9 VfU0xw5xRadCc23o4OdBqz9xoIMViBFT3BfTpklDqaorYQ49xz8F9h1VFbgRFIg/qPCH hlaiWrohRFyO5X63Lwvi1j+CBddaxlQNU8PcT2zk/7eN1dCgsRKhG1zXVuC0t+dcpz91 Q0SyI3DWEqP/ctuUMZTcseo21i3FbZ6C4f5yC19j7RW27ZQYO8E75FFMlts1+qfn2XSK 1i8RxjUlsaSUrmgCUE2xzxADoem8TRFGpczzZgzkaeuvk9ivCClAPG9I/xCPRhNExaqL HPjw== X-Forwarded-Encrypted: i=1; AKwUvBzu8cXs6EUY8bcazeFzLS8kmJ/C4ckvFWgDpkFZvcWO5BXODl1TTPJKkTcensVcgHMPzKZMDlXWh/JGpXc=@vger.kernel.org X-Gm-Message-State: AFuF++mlnt1wumYmMA7sBSostTlF3kGbix4P0rP/2cwTfHW+SQ8qjs0L OjGQBgFN/Bi3zDNPJvbIDy8zvnucIbeQQA//w+z9fJbdt8UKRyovGrqGPeyPoTc7Xh/mvvnKGTS NR0YASSLEddtCoyUp3sVvd+XiIz88Hw0dslCMbHT3e29iE/8vPBuZNgH96N0d+A== X-Gm-Gg: AYBFou2I+4nwJ2GYo+clV+6j1om8/PlsROIRMWUjrp18yUzyivJGz5fTnBbKyVGOdjr asMFHR+jX/8eYeL7Cy2oEkEsi+ECrNNj3gmM9ciG5J8fp5Rt/wtcymxCaAmsoBKnq7YmmHICZ9Z 4JGT9wLqhv4HWt27qJf+QkX0ZwvlZ/eIwvA8h+634vuFUPgU2MZMGNk54vKW7gEc9d+tBofh4Aw UYoL3EMiY1/E1RGi9kMd4GlQtrh5hKz3pAv+G8Xjy1nuuj6wElti+/mLYvgwk3xKf9z1PKYiu+f env9zrFkZlT8pOv6Ezl7WtDp4lanuCm79A/blF8HWPec2HoFSnlN7WHMfmnRoNcBCvJCqQUeMTT pvjM+if2u9UUsuwCnQoLQrUOuTI+Z28A43pjaBMFip1Z8nKCVN9g= X-Received: by 2002:a05:6214:2d44:b0:910:3179:733d with SMTP id 6a1803df08f44-9103efa0f2dmr347751616d6.25.1788830400985; Mon, 07 Sep 2026 18:20:00 -0700 (PDT) X-Received: by 2002:a05:6214:2d44:b0:910:3179:733d with SMTP id 6a1803df08f44-9103efa0f2dmr347751096d6.25.1788830400465; Mon, 07 Sep 2026 18:20:00 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.19.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:19:59 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:27 -0400 Subject: [PATCH 12/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-12-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=8736; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=s/LxtVbEHOVYU4ldcfT6uxuIsoUevA4AeoG9wWw8HQM=; b=kFlzncNEXuP05FmgxaKPgQZYgjbI2ohfym11arl5rQVpOk7ZvF2RKvdixZKmKJkVWAlWbjb8R QzP2rF1uk0cCxPjOUXmhIduFSpH1Xl6EPC2n8Tdoaz70PB5JRXLjJBB X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=YcyNIQRf c=1 sm=1 tr=0 ts=6a9f62c1 cx=c_pps a=oc9J++0uMp73DTRD5QyR2A==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=BpGzv1V74M3SfeTrGa8v:22 a=m-LKR5TgjiErI9wjomMA:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-ORIG-GUID: pv1n3KJVT_1vPsH7hvgkM69ZTQKUkGkf X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMiBTYWx0ZWRfX52EblHephRnL ut1FI9jS3vROXRWF1ZIII2omm0x0EtqiQu5+68iMxl7OjsWDHDG/XsCY/2u4MtbJTlREtX3nUx8 XtIDj8DR2z5sGYtQDBlrC8RCOhhByAK8+lX98JbojHOMvnX/14Qn X-Proofpoint-GUID: pv1n3KJVT_1vPsH7hvgkM69ZTQKUkGkf X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMiBTYWx0ZWRfX37ZokLUkp1Zd CkKpNffwNiWg6ExT6qrdsnOI9zkbA3qm3ocuiSCqoEVoC32CRPZiz5FARoyMD1RuuOUQWUnn9gm gtxviFjsHjK2936skKORUIGfEwjocMzbYHaq/R2WnLa9/w17EyLFrcmIMZw632OKMQGn1dDHdQo ASsnD3emrYdizQGyunVPx8T9akk5E8D8ypHxhUCgHy7xiYv2YSDQ/ePBT4cwAOcsjD15HoSlX0O QKC1KmWxRe723kwREaSvodTgqg+M+hSZ5L7Xoum4JCfli9n/Dyvnu8G2fr42xgbYIc5DVo7eCE2 gv/eJIKxzKQ/tqxidpYdUBbBpbFSpYk9Hp3gUcIi3iCWna591NbFvBcK9ZounwUCzqWwoOseHni SzXk+Q8fpUycuWCa1z8RFeqNuxL0pN9GXSqxKEWuBAHNWhhqDpmBDi6DkdUEjiXvEqtK69Ls8H6 DuQKH2fO8ddnKK817sw== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 clxscore=1015 lowpriorityscore=10 bulkscore=10 malwarescore=0 impostorscore=10 suspectscore=0 spamscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080012 Free space inodes never have ordered extents any more. Drop the lockdep exceptions for them and btrfs_join_transaction_spacecache(), which was only used to finish their ordered extents during a commit, along with TRANS_JOIN_NOLOCK. 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 | 23 +---------------------- fs/btrfs/transaction.h | 3 --- 4 files changed, 6 insertions(+), 60 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 699a321fc43b..5e4ecd1fe194 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; @@ -8116,7 +8110,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); @@ -8139,12 +8132,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) @@ -8154,8 +8141,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 d2ff3b568eed..232cfa37d2d8 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); @@ -853,12 +838,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 889babc76b68..51633af27894 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) @@ -288,7 +286,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 22:21:06 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 534D12F619D for ; Tue, 8 Sep 2026 01:20:08 +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=1788830416; cv=none; b=kgx675GYt6zOEypV8Vzs7YwLq7gFgs0nvxF8XeKSFCvkFz92nsJLWnIqPxQYZ7s53c7WqMIK+/aRSEdmMyVhHFalhotJZ79eaRXD2ni4yhBCjuVkwUWkZGnBiiPfB27lAMYni9DRmBO8FAjvg5g8yYePnwqU5yntKfqEsLqVULg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830416; c=relaxed/simple; bh=5BX7b0Fn4lrAd8IzUqTtxpVtKEO9oMmcmNEguv7W6EA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qsxlgqVj4jgjfDN+QxbvXO6meEM08m3VH4luN6K8RyYWJLDD09nr0op5qwry+g0iGzl7YCQ9PJWxkanO6lOZxCsALqRGiZHQQEVi6yC4XQE7ILibsB2DHaGOab1O2W+QxVHJ0pSeWkMSH8GmTLKmfP19ljdjHGSInrPIbhhYTaY= 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=tx3d9fPp; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=qgtcN+uq; 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="tx3d9fPp"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="qgtcN+uq" Received: from pps.filterd (m0167075.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880ueGA3744237 for ; Mon, 7 Sep 2026 21:20:02 -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=UA6N JYZg/aPbQbH6BdIy9bC46w35+B3geZZbPXF04I4=; b=tx3d9fPpP9MyTAJ8o/DN 9j8cQ8R9SOWgA+s0xZUaYIdrvTF67MiCjsLKdyQFRGrfzxomupjtZzF0sWVj3PsQ 4NhZ7CaVI9aoNQfJ527RZRR9l0q6Q41a731/2apeIqtdTz8chQGLnPpwN+c+XneD 5i8CH+nrh0f7ytnUJUi1V996enL+sQ01TgxHPnc2MVtb29tX5BPBNMdM3B4LcQCz kip83siWg8c+JOohV8LeYDeejTYV3BrRZHcM9cuBLKrGS0kNtqmwLquIYNl50uFg 7GSVR5MjSUJCPUoQFNtvnh7rZQhHQ5o1DE80W65TAIC5kg5pMf3nAGxqgLe7w47f 2Q== Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gj4b995a5-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:20:02 -0400 (EDT) Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-5308af39ab3so14692901cf.2 for ; Mon, 07 Sep 2026 18:20:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830402; x=1789435202; 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=UA6NJYZg/aPbQbH6BdIy9bC46w35+B3geZZbPXF04I4=; b=qgtcN+uqzGCzBvtDZreq8vm/tvEEe3NdNSxv+aULtWCpJ1hl6B7Xn8F08DO0DX3nsh X0EIcUVF16rvS0mIT0p4voCXMY78bpZk8Law0x5rjVN38NZDpVMVGwfEeMRP4zGGTw7G ge3TwJTAwGIqGDrL9Zil5HJ4drh4F6T9beC1TOMGsizA6G1UESDkl5c22eoiygrzkahf NA7M91daDMvf0pkG9SP7KLrALhHZj1csRWgc8cpwoUaAuTADlMQYuERG8aTXpTZ6WF7U EYrde21nKFlsf3RubkNPep0HZBfp9tO9Fqw/xsaADSHCbbZh77TEd7m8yO4f+RQu1n3o i4aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830402; x=1789435202; 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=UA6NJYZg/aPbQbH6BdIy9bC46w35+B3geZZbPXF04I4=; b=Qh3yxNuhIuZyyFdpOb9g+ADvfDl7lLKmUEmqQ6Od4uxgFIuWRC5ifeTBNJwCfaT7qT BZfpx++WOisO69JQ7ke1EzZtGznl54aK5ZLHSQPtdWqQZ+TtWGKYu+Z7o1caEuTnQWdX jl93bDp+cD0qapmC393SheDrXkzwuNoSkWkz2MY81XiixgyKAopUoeOXa+6ms8qLLjgv EkxiGqsFG5bCff+jP9Y+Uj9csu0EwSFEYMOtpUlHiBWrBFfTQ28gXUFfymfCUeAEgZm1 Jsbymw4z0OTP7i/xEAIjygEHlddilJSTRLa3EEEa83Ir80+wHzdpR3hJj1SEPtxDeB/j SRsg== X-Forwarded-Encrypted: i=1; AKwUvBxXFOy3Q2OmVljAlnmW5bNIs5M9jg15Sv5JeJKQllzD0iPYgLzNGf2p2tU/nWJgNlg95Tj8TknuR+k0QYg=@vger.kernel.org X-Gm-Message-State: AFuF++nePHQ5Gk5XbkEeiIbVelC3HODk/BerlsBELqlh78bIZXiGbqQD hCr1EGFUyy0wkKMMGZQZDij2DK3rRqJ3pb1zE2oqViVDveEE9Krm8EqEOoO124U/GFKdmiXDygZ Myu2EMV0nhrKr4g3nzptysP3w1pB6ZEoyYtIcLqiUR9IS16VHUmoubZnZSmzrQhYu6NRppb2Q X-Gm-Gg: AYBFou0D2zfI++Ho/pnWvqFowwjXFObRumVAXooalEwpcMSsNwQT/prFiq1DhDQpuXS R0Wa+72rG8oNUjKN+MLU6AYTicaI9QzLI6VUOOsYbPTGavlz7iLdi4Qrc6kk9y5rzZ0Ru2mn0DU bFFuMIMIuX5NWWnVkwt+ngGu3JOl+wMuD+K9pQXg9pCg5UmWJnLb2nK3e6iQJpIec8sbavhfQvr cI0/BjMvzXLatbM3uXr/RO7O220iBJetsxUYnFowdoGe7RqjQbHftI6oswL38KwR9q6VcHPEXO/ p1m60uwsnE8V6cnq7k85u1Wv3EPXyDU66lb7Ors9fDCeKtti8VcYOU27dUoznhBglUu9BtVMxzH DPSn+jybQ36XqQIqmrsTq2d+hau0+GwvxhQtBA3bz8e2wkJleVig= X-Received: by 2002:a05:622a:2509:b0:530:50d7:e5b7 with SMTP id d75a77b69052e-530546bdd01mr355760861cf.9.1788830401799; Mon, 07 Sep 2026 18:20:01 -0700 (PDT) X-Received: by 2002:a05:622a:2509:b0:530:50d7:e5b7 with SMTP id d75a77b69052e-530546bdd01mr355760281cf.9.1788830401335; Mon, 07 Sep 2026 18:20:01 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.20.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:20:00 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:28 -0400 Subject: [PATCH 13/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-13-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=5995; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=5BX7b0Fn4lrAd8IzUqTtxpVtKEO9oMmcmNEguv7W6EA=; b=pV5+cJu0SIlo7XQ51kCvxqXHXnQZygQaRxMBYy9ISJDYOhpHtYQY3Lm9Mx90ymliJmAI9SzE+ nexBfs+A68JCp+0qf9pvHjOwOj0vjHvaMjatZ0YIJeyAigThjldphJd X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMiBTYWx0ZWRfX4l/fdxHHiIIG tOK5kMVaCFG7yM3Wp5Qqfx4a9RJylgQ788S+NCreFYU2vbDyOZ684ltsFDdZOERwTUST8+qbF8k AI7jHtdD4umCT6nZUoQb+GZKeT6nqLjbNtEUqSeAP8hxpqjxDZHarCT51VMiUezfMGJw+SC+cnT TEbriEu54otdGO/j6Ye8vUQrQKJYgPNUcmI6SSmJIlb440b86FJrNy2at7v0pTRBl+lRMmbBGEa BqWhzbH37Uu2bCtftPhn10knddT1jeils8lAOipPrLfi/M2nWmOAGjzn4+WbyeUsJSEPurM2HFS yRwXC0pPYdRzyTYlIvWkhI3NjRDaFFQyQfMj6TXdu6+fSXjKVuyKeUAJfct34mVRFk/eFLMZvao MTtt1aJbzCyRC16gW/FtM0IulCiQZWu/kFAviIMbpX/Y1R2a2nchkvKM4OQVJ1ffZZPQ+CWNtLT YhsDer9Zg/IWZXe6oIg== X-Proofpoint-GUID: NhvmSHG42q3IOT4D3gyPygIHt8RY9Zvm X-Proofpoint-ORIG-GUID: NhvmSHG42q3IOT4D3gyPygIHt8RY9Zvm X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMiBTYWx0ZWRfX+U2JfoHPsefn oZQYSeHAoK837CcSqyBrec3PGNWtpcfKuUFY10weGIrkQIeejuq8OwlpsiVmNNMYdsBmO7E5eYR OC2xn8tFhcRu5mSlZipw+QGRRqExI0XBeqSs/qI6yeUOZgmOw5JB X-Authority-Analysis: v=2.4 cv=Yos/gYYX c=1 sm=1 tr=0 ts=6a9f62c2 cx=c_pps a=WeENfcodrlLV9YRTxbY/uA==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=HpS3TJQ9O3Ob1ozEcmik:22 a=2oXXyLKhFp2WroVMdz4A:9 a=QEXdDO2ut3YA:10 a=kacYvNCVWA4VmyqE58fU:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=10 spamscore=0 phishscore=0 bulkscore=10 lowpriorityscore=10 malwarescore=0 clxscore=1015 priorityscore=1501 suspectscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080012 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 5e4ecd1fe194..137d2c1d9c97 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 22:21:06 2026 Received: from mx0a-00364e01.pphosted.com (mx0a-00364e01.pphosted.com [148.163.135.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 82986294A10 for ; Tue, 8 Sep 2026 01:20:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830417; cv=none; b=UFAPp83J4KxMr+37qsDBXNTP+5xNnYBdrEHFMvWfxLEfZgJ4CUQAZd+8RshaLDk7gWXOIeQ3lWzDgD96aJMGt6F6SgdPCztk4XFNAyHtb4tgjmrxdq+Fq/FAG4p75Kj5/25VSj3v6LJwP0/Qw52jLhhJhFrsKsmhQEpSrA+0zDA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830417; c=relaxed/simple; bh=s0Ur7xTjy0MIOogA8x9okj5s/rWZB+OdHIcqrKhE0cI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=u7HND0NnJ3b7CW9rHRoOKVyOW9ydnUjDUa0bVFTzqkdCMcPFjSxwq5O0mvJV/wBwrmzIfJrvgSzWZ3jdhVe9yT3w7xv0TdTDiSymm02MxMPQLk111obKU0MqL1BwsESd35NjNVl3hJ4/hDQ1/e2wfJ4QBcgp17E77jmp0B1K7+Y= 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=Kep4N3/1; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=BIV23BOm; arc=none smtp.client-ip=148.163.135.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="Kep4N3/1"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="BIV23BOm" Received: from pps.filterd (m0167070.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880uf8d3396654 for ; Mon, 7 Sep 2026 21:20:05 -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=2M9D 4jxfFcsmtV2iS1rQuymkdk6W31/RYk8FxRcByY0=; b=Kep4N3/1tOLaluOXMW1D kuw9Rk3Ya8HYQmyYytY1yu97wMKRg2JnvxU4feK8ZD8V56Miu8T0XuCy/VxDHiRu gbNZspFvz7tbcGeQhfJWnKJZBMEBaX0OsxIEbspz1R8aC/acsg2v93Uqq/CkfFQS HeUAItuYT2euhFFuPGx71hsXXNq5zpWmz1TBD6j+AadPWqojPHvw6IZ9KcLhctYf Z81YvOIQDHOrul/gw+G4Ayg6cQTG73dZQ8WOTVvUeTJPGwOfJetguy9p9SdTJl6i LoSOPI+rZppjuczRwswVAaWLk1AfXvAOvBb03SnAvVaba5ruNh/P6OUw2Kg3u/Xc dQ== Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gj4yks08e-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:20:04 -0400 (EDT) Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-52fc3bff8bdso72078791cf.3 for ; Mon, 07 Sep 2026 18:20:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830404; x=1789435204; 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=2M9D4jxfFcsmtV2iS1rQuymkdk6W31/RYk8FxRcByY0=; b=BIV23BOmrIkqmunmbcjkp244KXHtjuR+CewijOFN+rUBACyKUxMrMnsuyaLWIOgFTV +JBFS7Y2UmFrMss+pk1VkBNWO+5RAb2OQ9wQpg8A1eTYJ1UoKVfPjXFWaBZEZRRbcEXC iaSokfj2DdI9jsc5x8QZESD0Zecvaa7diaL10dGlZ3Lc9sleLyOaLJA/t+3IVtlzICr0 679D/2Gmtw5FEt896WhSSCoIsQqK+qZwvIM8guGbR784UhaGL9jHJpz8DKJ2YCG0rYD3 x0OKEyRWohX+AJhKAduWRO6WaLxLuh/nwM+8u+6k0bTIzGjnhc5e/mKJuhnV/MMdAEK7 DlgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830404; x=1789435204; 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=2M9D4jxfFcsmtV2iS1rQuymkdk6W31/RYk8FxRcByY0=; b=GeoM+iunGGRPjIDVmyXGqbnjiltFwY08z9Sqkz92KQiP0PSCkDwGhYamDMBd4DZTn6 MGYg7+tE8ITVRnhQKATwv4F9llkTAtkH3MHXxc0uACj9Qmk5WCKBWqTKQM6L6ptGZ3oR A59vVnJKCbRYZYEciEDcaQ8ihlExSCbh0yTbc/n/oD03/wVBbqURkr/OHPFUjFUZcBUP 9J3BCVU98eDG9hpE0/9bICSByF+DtaH9+QPaS8da/s5cpLX40MKZEPKcLV+Cq/zIFnM+ 9/Kvxw6/p3YQgUaNEWfloM/V79gy3HliXhCuFY194r3DKErPKwhtx4XQKoDBSyrgWVvn aB8w== X-Forwarded-Encrypted: i=1; AKwUvBxaBitavSysPfzQmZh0xfzT3/jU0o/uKaErRFCagFwiiTCiSiIt6Xb4dbs/xxkAxe7YNDcwFYNQV4tKBfU=@vger.kernel.org X-Gm-Message-State: AFuF++nLwaGo46s7KEPJWoGJpUhsataiXx0qF04h/jvsVv/f7FRkmy0v Fs+3d9F40Q1mOlIsW1FgpumO8VEvzezJ6iuntrOyjdNGMsG7U4vIgX5yvnWhfUFE1kQU6axjXTT YiTI9HOtSsetiE01EDIVLaBbrkTAhk7FkCsBz0LDPGsXAJHCLSHoWQho8y0S2bw== X-Gm-Gg: AYBFou3YuFPgR9bm6vWyZ/0LxbqSqIvdod+KdEmN0noq05kTqOQl6iyzT9QpzJtZEnM OZuWnhwfTGCtR0OpabcPOcD211PsECKPA94IQlzXSzHKR8jEAb9UE66d6ma3TTYCX1EK6bQcOPu cA3ahT2nIOMGDh55H71ywwfgxgwiw1dRjaKcqF36EqPi+xn/Gil2ydcK5w+pVpQLQpR/vVDq/ZG nvOS54nD+0Q1rNbY/hjZV/qzeMk+GfP/Ocmn9LzbC6McrnuBER4bYnmaL4D3tia1WAGBct1axKu CkcGDbmWGM92ONMgejjcQIDW/O4gjUejfACcTrO42JVbE6k5DCChCPICgdWge0avXAbwpimqzeo Qz3iWneCSj/e859MVJ+wj02SkDCbOz+IN77sxIaxsLXT8MG6W5jI= X-Received: by 2002:a05:622a:134d:b0:52f:f072:a1d1 with SMTP id d75a77b69052e-53054819272mr304914581cf.11.1788830403541; Mon, 07 Sep 2026 18:20:03 -0700 (PDT) X-Received: by 2002:a05:622a:134d:b0:52f:f072:a1d1 with SMTP id d75a77b69052e-53054819272mr304914111cf.11.1788830403044; Mon, 07 Sep 2026 18:20:03 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.20.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:20:01 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:29 -0400 Subject: [PATCH 14/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-14-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=2215; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=s0Ur7xTjy0MIOogA8x9okj5s/rWZB+OdHIcqrKhE0cI=; b=3NrwPqQr9ySlL7xE7GbnNqdtaMAJdSbZM3lZSMMw6Lqhxs3+Yw/iI8CL9N3bYX4lps0y3+y51 7oe9i1IMDBQAbguWG1sUr/Qrq+m6GNR6+HMOcJIninNv7QdtSU4edqX X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=bJQm5v+Z c=1 sm=1 tr=0 ts=6a9f62c4 cx=c_pps a=mPf7EqFMSY9/WdsSgAYMbA==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=svvvyxlR1OQQkelhaPoB:22 a=bn-TaVTt-omw3cABb-QA:9 a=QEXdDO2ut3YA:10 a=dawVfQjAaf238kedN5IG:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX7gIA3awsfmxq iUd5Xh4WcYS4UYjIpCS9NgCZiibDNNpPOAgTkZ8IL2io9GPs/vKTgL3OvBfWmUZ2G3lr28AJh7S W3O28NgIxP0wDkW70F2U4wJBTtrcr++oSkCl1Z2Z69ZKEK0orHsW X-Proofpoint-ORIG-GUID: Bj-L1R302G1Fa_-1vjjV70MvQlszKDX8 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMSBTYWx0ZWRfX7plVCGtCFyft Ky5DZQi1Mk07ZPX6O0Q0jtgFKUcZvVgpaEBJTGoSl8jhzt2GRfYiAaU5fZ4WuT3LGOnw1zxBWGq 9/KluBNt3awak8bs5laKsoT//DdATDZs0AsQxvv3B9oLPfL4ToNHXlNn0vMMEum/6SkuDDy/MHD BratRRayl1T2dqL57ViH9UuDCX7duJMnXfMq8nft8356CuLfDKQxZUu7YPgEDc4WcVYo8NvZVtf YmgFMm0whc/BLk4y7mGOc2iUFRSwCtFyxr/6CsSKaVdxKrsw6m0XnjhNf+63RGZA6BrHdk2NsZd SwRvWsQnz/0NnF16S2sAfIRPR4gNL12S1gvmaC9D9JYqCxJctNeBdBW8JCPWELZ8K3QBpsjIXsi nBljAFbAyad3wMBNiEU6/KSX0PIRcsq3oUm48vekrLxdkcNsABG9/bQMa1ZKENVbuzFyPaNYIt+ RTm1Kzxk3awcWllEvAA== X-Proofpoint-GUID: Bj-L1R302G1Fa_-1vjjV70MvQlszKDX8 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=10 impostorscore=10 bulkscore=10 priorityscore=1501 spamscore=0 adultscore=0 suspectscore=0 clxscore=1015 malwarescore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080011 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 389eadc5c28f..114a5c38afd3 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h @@ -403,8 +403,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 137d2c1d9c97..3a1230b777e9 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 22:21:06 2026 Received: from mx0a-00364e01.pphosted.com (mx0a-00364e01.pphosted.com [148.163.135.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 B15DC2F90E0 for ; Tue, 8 Sep 2026 01:20:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830418; cv=none; b=ovmVMzs19aoKCggvVbbBnBW77ExaJd7UNhiHonGWfENiEmJG2/PudIEuOYSYqghCQ5aHhtj1eTIWIkwUdhe2zpC0zQwvwTufLse6ImO4CDQ5ZyxReC/5dPmT+qqYs+0k6ui6Kt3LAXxJO5Yls4xo4jPQn8yKu3Bq1+hkQEc4Twc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788830418; c=relaxed/simple; bh=zFxwTdYCThz/pj4rRJQzgRssc/yjoLDS6oQG1BqOgds=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pK82SiYsLOi3IVuvRBD5N13i4NcaVM44ou5gL/zqZLIFt3DFVh6AfFXMzCNqkRex0LT+mN1j1XjKBwDQVmDHvJKLbFSdgUaMTFPFOkMw2RrkFekG4FciZqo66+1/0Mml9KdTb13UgcskVhjxB+ya0D7E1aI7xsC/TlgLYorY9jE= 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=SWx6llIR; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=kY33UHcR; arc=none smtp.client-ip=148.163.135.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="SWx6llIR"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="kY33UHcR" Received: from pps.filterd (m0167071.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6880upEQ726802 for ; Mon, 7 Sep 2026 21:20:05 -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=07fe Mxoum7S5Ym2PiVCScGldmIwxg5T94sGONJXUkrc=; b=SWx6llIRK4edzFA1nNHz Si6bjHFv74o41wQLBUYaGKWIdm7jkSl8DSflVrixwq4Rc+MzrA3+NdKnyLuM/uTw 4TnHeQ8c0W2/0btJdbfXXdyXduSmdvLY4xUNlzcfUdP5d3Tl+cLfQGP8ugDwpK97 etz7Ab2Z0qvAculvlbVjDV4aQDzLt7EiOnp73UDNCWwVJZQrUL/uktjbB1U524JA 4n0mPYXHRtaqWLN8eYJmNLNtNBH1/tLDZYx/K30VyvWCCKPkRdEaRPFwYqSVwfuE 9uQaHZq9fgLZS7r7m27RjNSkwbFydk53+qBD/zNNhz0WYeat6JT5mdOIKWhF5kfq Mg== Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gj4d596n7-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 21:20:05 -0400 (EDT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-90e7de22fddso89714496d6.3 for ; Mon, 07 Sep 2026 18:20:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1788830404; x=1789435204; 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=07feMxoum7S5Ym2PiVCScGldmIwxg5T94sGONJXUkrc=; b=kY33UHcRBm1ykn178KuDXCDKkXr5KjOg5tWPRcPKJ+0zKktbA7CeDolK4USHDkkzUc 2Q8hzSt/9yTB5NpN+aKWfgvk+3zs9Nkgp+Nl43TeCxHvSyEgh08BomCko4Em6RemZ2cB 9bK5tQGVWZ1Q4mgyM1MfvIIiqNY6ixtB39veLQQ7Ly+WwCsPbB6rsvES5+4VJaGrKTwy IGlsCakqJKDC/d2qjdFOuF6VbaHqro6kVqHA/3Gh4pU1el06ARB5SxKT6wpApbbVwhkY Xj3A/MHT0Ta4MtW+jQk8gUIeRxSHDTAs9wnMWkHFMD7/9g3OeHPCv3IZft0H6FEcsIGg /XpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788830404; x=1789435204; 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=07feMxoum7S5Ym2PiVCScGldmIwxg5T94sGONJXUkrc=; b=FT6h0iPoDKujj1o86bT413iUDx3ZRrCNZj4d751ysfU6Oy89lcFS+Xv0iGcaGy+XNF TdkrRRV1kh5UMFRVkXxEV54Tsuke3cDm62iam2M7ZM0vkDp9dk7NjQnXOpzIcOX9nu2C mRR14STUdlki6+/ob+UVf/ixIAfWefQxGOeTVJ3/Rap/2Azk94gwt+ygmPzYvYjkhzYM /4tdUpgP7gl1OIvc/K26vKkaX4ZQpE5cSuoB8i9dhfj3DV5o+wTSJ/vZgjiAy2WfZg5j iFfUReiHtOo7UeocBb/T2253fMxBonijiwSk/eU2cE7/UOwItIR0OdPKIVP4SoI9xLo8 66Ng== X-Forwarded-Encrypted: i=1; AKwUvByRo4GqHAqEBHniwCxpEtEmDqZNcIY1Lnq5VpS/f9m4rfoFOoUVxJj8BytF2DsFwcSMDzXqB74IxaufrqI=@vger.kernel.org X-Gm-Message-State: AFuF++kJoYD6r/bxwk8UpWi4+F8ynV3Sq8e3wHEVvRm/en3AuYiT5UiM D2WD3l5+BGlCw3wpTV4C9F5dJx0hZ9+tgw4CroevEfMsp7PYzdeB0aXWJv0Eja/jOJLYfX36mYU pRd/cWv67+a7CO+FyP6Utc2BwiQU5X4Z6jhS/doo+5VmwySy8IJBl/UWJzpTqlQ== X-Gm-Gg: AYBFou22rqAqMrsXpPeicIj7kUPczAnILUo3FjOMIrqfNUCUgBKLeAhpWCq/MopN0BB FK9CCUtrnvYGIEuju2nREBA9KGMrp8hwQfcJDQ4A8X/UTMMJ4F79VmylwPGqB2PjhRa+AnmvzXl mPzmrIkayZPJqgmoyThcDdiqxOESAIgt+wJ3dAKOxFxh3hy/4sbvy/2h3YeprLG0IKepF9YxeIO iX1jSFH8LeGFJISLO4L4f5SkMGtsiO8h/2dpQaqWuVAivk/o+0pK+xMWs/1gfdTEjZCpdXynMnR oouVt0awL6vdfqAZqpdNIbrypHmy5V2g12pw2uiV6aM3zK7bksX5fWzoSCd1C/EywwtK9vZh6em uqiQCe2IWfHGPJXrJH+jQUhKkjYjdzs8vmrkF2sXr2Tuun6o+emY= X-Received: by 2002:a05:6214:6005:b0:907:dd19:fcb3 with SMTP id 6a1803df08f44-9103ef703d2mr286489716d6.24.1788830404422; Mon, 07 Sep 2026 18:20:04 -0700 (PDT) X-Received: by 2002:a05:6214:6005:b0:907:dd19:fcb3 with SMTP id 6a1803df08f44-9103ef703d2mr286489416d6.24.1788830404052; Mon, 07 Sep 2026 18:20:04 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91040694543sm104322656d6.33.2026.09.07.18.20.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 18:20:03 -0700 (PDT) From: Tal Zussman Date: Mon, 07 Sep 2026 21:19:30 -0400 Subject: [PATCH 15/15] 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: <20260907-btrfs-remove-v1-space-cache-v1-15-5f9a5ba352a7@columbia.edu> References: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@columbia.edu> In-Reply-To: <20260907-btrfs-remove-v1-space-cache-v1-0-5f9a5ba352a7@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=1788830387; l=1999; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=zFxwTdYCThz/pj4rRJQzgRssc/yjoLDS6oQG1BqOgds=; b=wPWNzByVne0lc0sbeWWmpxkE22+H9rq3HTAyhtftQA1WXlPMbQcO5iaLkEunryOkJQwXyOB2S tflMgvDGgPVA0XtFuyc3HEVthT3tT5XpcAjxH9vsGUFk+HqQ2IbhTMk X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA4MDAxMiBTYWx0ZWRfX6GkmbTL+Rlsb rmGTZB10eLQNaH1XwuUE6OcZU7YqJQVO54SK62cppnSsw4tkFU0B4JLx8ZyVTpqTvHni248DYlG vhv1MNb8ju9EoJq32/JW7ANbUOExlmpruy5E96gmnkP7nWf3ohDy/r9drtbhXUkGSJA3a1TnCri fWnHrfIJKBmO49uWAiUExHPBWHhTe6PxuNF9QtP6FgwGsiSFQqneFZAXVI6IcBy7AROGQ6PUUEi aBFvHMXv5zoryg5o/z0yAEX+m3jEq6Y8vkEN56CtVAAPmCKowO/U2bfpB1ll+bMjD+6v3xOy6Zq nRnymZMvudamMwAB2+Jnf4F+XZ5BMX1OCnUs1cJINRI/AFM01zMwc0h8l23VbvEc199xJ0iWbcV 1qR2cVxR0kIH8pn8jNktSnlpJSAM+0lQJbAgYqy5nkFV3XeKZ7DmB1s2anZOn2vgadcNONV131u 6/0mYulkBkmde+0qixQ== X-Proofpoint-ORIG-GUID: Sxc2fn34nsht297qIhfKUN0FdkIF6ro_ X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA4MDAxMiBTYWx0ZWRfX79Ldu0Pguhf7 QRRKDQGMQ7R03iV0qoGp8ivQY5diiRkex7wA6KmeegXVO82R72o0LLPTIRjpXiPSD7aN9Jeo9mB SxXAV2xV/KFxkpqdSG8RItLof3h9kRg5lhKQDXLfubfxC9atXZXh X-Proofpoint-GUID: Sxc2fn34nsht297qIhfKUN0FdkIF6ro_ X-Authority-Analysis: v=2.4 cv=BqCtB4X5 c=1 sm=1 tr=0 ts=6a9f62c5 cx=c_pps a=wEM5vcRIz55oU/E2lInRtA==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=79PYxaXUQd1wl-QFWJnA:22 a=F-rX_8kjA07mH5tGMmcA:9 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11899 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 adultscore=0 spamscore=0 impostorscore=10 lowpriorityscore=10 priorityscore=1501 clxscore=1015 bulkscore=10 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609080012 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 ae1fd4da38d3..ff8f8cad00fc 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 3a1230b777e9..cdac30f574d3 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -7215,16 +7215,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