From nobody Fri Sep 25 03:20:30 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 6C6013A1E96 for ; Thu, 17 Sep 2026 04:00:33 +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=1789617637; cv=none; b=ocwOwwt/pUo6sVtnkNXlcE9XymX18QFy7+8UASYRHs6y+ZUo82qtC08wNcBvuLZiD1AJTInO+vXUGPotOS0ddrOYzQbnK0P+FXFuHN0vqHIuOX++kwnfZwMhAU6BLlxSEuSnCOUz5wdyxHb4bavCipDL5vCuwjqdjGPnWlf61A8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617637; c=relaxed/simple; bh=l6XWpALI72VvymMl9mmC4aOj3XPdEV6iIH3qiK4vIFo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rv2vYXrUQEgLNcuiE67krEvPyYabmDW30vY64mEyUqQKOnj9Qlw2CICBww205gC3DE92yHLxAlcAgziz5XnYYTR07jNg7L1ApSqFrpA4HLIzYOfMZrwchO/qWtKkvR6Gjvg4cB6DR4zG52jCEz/ZjAr92pkwI6tK9aynbOrnVoM= 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=djo6c2Qm; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=XXme4IAs; 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="djo6c2Qm"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="XXme4IAs" Received: from pps.filterd (m0167069.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68H2Z1cV203537 for ; Thu, 17 Sep 2026 00:00:27 -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=Lm40 yi3MdWTcg2CcVssTHoFmZQKZWN5OucQ+h5hij5E=; b=djo6c2QmjviYTojjf2fH uZNjm49IUibUm3ec/lDh8HbeVbI2H7Pz31sHAzYK8esK+3c1kfvIPD8/f3T8ec5T Xi9ysRfQv5ZdOkppauCporCl5Jgg3qnxJRHmb3QaS4srPykeAro7AtLa75RDXQzP Fzyp1G1tXao5eIpq2//6wF+KRJYviHMehPHOT2EH4sq4CA0B3zuQV2cqKUEvc+Ip n6sKJvOtw9GH8ShKpMe0v1iecohplPDm1wXlry+5Ot1hINKio5XOB4RISO+He0IF VdRndB49Mm7tgP75bry4hwkEjrmLRc6vfHDPkoKpTeShKpedYhim+czzK86oEkC0 hg== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gr1x6adne-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:26 -0400 (EDT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-93a1b824e84so89920485a.2 for ; Wed, 16 Sep 2026 21:00:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617626; x=1790222426; 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=Lm40yi3MdWTcg2CcVssTHoFmZQKZWN5OucQ+h5hij5E=; b=XXme4IAsRGBQauWuBRmXH1s0qq9PPNLnNl3+rw/4TVZDLw4w0x8DDwePjHSPUWNDak UQgypgkkFmQK4wTZ39Mf4BCUbZrO1w8Dz2mWdeKkCAroLQKkxSVpPHTCj/rr6V07Wsuh fwC7tE6t/mfPUIufRpgb3cIiVodUzLBJ2MtN2KVm22n6itsh1rzznFb2oD99nmTiaMSt GdFhgppn30IV4gCwC30imaT1eClSrSiOfgHTu8nS9YGbtBE+JIYWbE1gDwYb10LF+Knc cnch3aRovAomW5oANEMRxbMCais2ACXTgh+ZZg6tPpa9Ml9MdM6eP1CR+OW76N9omtS/ hwAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617626; x=1790222426; 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=Lm40yi3MdWTcg2CcVssTHoFmZQKZWN5OucQ+h5hij5E=; b=tqMB/xibXXYRgkDiQQyMNRUlFNT2+UkPfMOOgg3yE938NGpR7ogfXta+u4b8UERcXh XOIqoCRoe01Q8sJw9D6Mekf64l6A71YphT/LyGmh7RD/LJSpWRPquMqArAk2vPwfJx9x DxrB5pnORRUkCPKQc7Buo/dH48yTfFTikn4N2KZWDYZZSXlBsgDwVjROHmsft0ZmjT+Z EFbzNm+XLS8pv0/jSKswJMLmEUmW2rbDDHpB/4NckqPZV9krlLFXX6CQbTJRqoLBWcP6 OwM6zePJxgoj7cZenRCs/DyTZcuRlMapJ+D3r9C0qG9UNCzo+d+Dryg5gBEh85x+HaO+ lLNg== X-Forwarded-Encrypted: i=1; AKwUvBx8zOf9F//hcygLh7dd63z/YD36Qsv8fxc3Z6tYOupPcqEVJFtFmdS/54w7zkGaCVaA+K21KuaNPss69io=@vger.kernel.org X-Gm-Message-State: AFuF++nuSRKg+XGDMLayWXJKZ5L6g3GVPbayBZwU7CxaOd4aUZxyD0zm T3Z0ZYs0EjvQgkWYBGIdBpI5bqUE3BPmKO6m2tVLcEVkBQfIAdtTXkF5MGutNlWUPpNjZqwuqb9 9AVYu9uxjBp5ltNeQmuae9o+cqkuSxkRm6HIAgpJFUnG8ShNIuFFRxk571jHg5URgCdwl8Q== X-Gm-Gg: AYBFou1ueKOjdOSjbjAGkaatbdOENWvTmxZY53viUEE7HAluR0sC3fZV5htd4/XGak0 WkT9Upo5EFY1NIEzQrowrSPXmzufJ1IdEuHtLfuud6+Mme6U2qFE8FVZ4hxRCzXcXBgLqu0QhJp ItseWazCbWjrxmynBNRvnrZgnLwGOLxJ3VljxlN0LQG94jKF4s2AIDxKp8YTuET6Zmi7/czR0i6 fZH/ye4TsFf3Mqem6vJMAjhrQMKRzSre0KklG2Nj+T/zC8w8thHfoMgewkxKaOqVICZagLgqgG5 224C8SAhadPw3eqR2fuhn4e123PpIN8xu31iWhkdwaazzpnfmdIaYKUAQbYAPhznYtSFcYfax+B GFMu1ktsUU/arKLWkEzhpXs8Qk0j4T4Ltp6crnaDHys701w== X-Received: by 2002:a05:620a:4808:b0:939:b559:1e82 with SMTP id af79cd13be357-93bb7952a4amr883431285a.41.1789617625876; Wed, 16 Sep 2026 21:00:25 -0700 (PDT) X-Received: by 2002:a05:620a:4808:b0:939:b559:1e82 with SMTP id af79cd13be357-93bb7952a4amr883425685a.41.1789617625373; Wed, 16 Sep 2026 21:00:25 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:24 -0700 (PDT) From: Tal Zussman Date: Wed, 16 Sep 2026 23:59:57 -0400 Subject: [PATCH v3 01/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-1-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=3304; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=l6XWpALI72VvymMl9mmC4aOj3XPdEV6iIH3qiK4vIFo=; b=+gZz8ji3CO1LENYqTcqk5swb7OcivxHRRxtMbC5ZvcAtoeGscN6erXJJ4Kt7MCY8l1Pn6xAaD GfCg9+fjxMSCMCb8p0GCafas3l6XWzWJoa6dBVFjC+zHCmMVtinDRY/ X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX6TpkQqWR4lbc aIqExdZ/CryQqWao6CP7hXXbF4KPF0dBC7nJG0upgck5o0LJNb2H8cS/oGCr1I2ucvzmjEwBJqo GxwsYggCjGRVHHvizXEOteBJQiNwpj64MyPQQPePb6a5kbbTjKjX X-Proofpoint-ORIG-GUID: M4lg4pYfViOt00V0-yKgZlCzLReTbJ7p X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX8SKdegt0DQxK D4/P5JtHZBxN03QNXlcFLJ/XjUjpy/I2XTePhGXdV2I/1RkXQfO72Zf8u1cKo1V15HaNtiwJcEf BopJU0cg+GMoB5dE3pPex6cOqLKvMubWSB/ttUIt1VBgKruy7NeZCvHeVSznmA4zoyudMkhLczQ BfgHNQbXMPVdHxkW1RExxk+ePquV9bn0PGrM4JzFEPzVZo3ZmghtoKkEgonJlCb3H7c7392WOhp mQ02DwOO0Kx/jSRdRWluKlroFwk3pgFhI9zIEVsIo2tAawIgpb8BLUUyYKWdgRdHeS5oHh3vbF8 HL3wOaxGb7H/iRQwbiFlKJjurzg4SoEEuc+XKyicacMpfT3UXkzsxA6/x3hwDxkigjm016KDnLb ccGSOMxX59vTdpSIkCUb+EAguK3rQkw+4Pk7Mu1K1m9jekU426+oiSvvBZhCXrbwnK+2YWXottJ qW4V8PX9YdPWRqaaukw== X-Proofpoint-GUID: M4lg4pYfViOt00V0-yKgZlCzLReTbJ7p X-Authority-Analysis: v=2.4 cv=CLS/zhrD c=1 sm=1 tr=0 ts=6aab65da cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=x7bEGLp0ZPQA:10 a=A0y_DWxS2BwA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=JR4YdQiviy7OQf72WyZ1:22 a=iox4zFpeAAAA:8 a=6xji9QrKO1GPOBtlZsEA:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 a=WzC6qhA0u3u7Ye7llzcV:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=10 malwarescore=0 impostorscore=10 spamscore=0 suspectscore=0 lowpriorityscore=10 clxscore=1015 priorityscore=1501 adultscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 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 Reviewed-by: Qu Wenruo 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 03:20:30 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 9039A3BB12C for ; Thu, 17 Sep 2026 04:00:35 +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=1789617639; cv=none; b=l53TAjwNlY27hV22XMrt2YfcJgCP+MVgfWNwQ++3EK5fzjqx6LesXTaxU36NW2oUwyHF1AcIxTOAG2mqNNr3ORiisH+Rg0v2hPCdUsG1fPCB3TC8SfBx2Tdvp89PnCePYZUVenPfo+uiS+IYmDqCjTJiX17gg8jckjCRC+u3yM0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617639; c=relaxed/simple; bh=Kc+pPOO+o45EY/reQItthWni5iJK8i4fD0SmuVgpNQA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=myinO+6eChFOLaAbkfs+IGBmq/2nU6P6nyKj2veCG5N/KH6yyqb0emBtT083FsBBQfFrXI1i46KEibhVsifqIoO3mNVZZLUyuDcsaqSSAZj31UVAuVBEt284zkV84L/CNS1UC5Tk4CFhQox6/QhFBxroYX0pLmMvoISrhtC7lts= 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=Ayn8EpXi; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=ToXBIoJW; 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="Ayn8EpXi"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="ToXBIoJW" 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 68H2YHck1938567 for ; Thu, 17 Sep 2026 00:00:29 -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=QNBz 7qZVwp5RcNzkvihb5aYS3nlxHpqrFJbc7CTs71E=; b=Ayn8EpXiN13uhCI3549w uCFdINqqM1OO1/feV88+vFGDOLIwIcXTbMdttsBvdkFYtlAAk0Fcd6rkWKvPOm0Q 15tZJ2TnN6C1A4K0rJzMQEC1ozWR/GOKIOgS4qu/brD5sPJ6C3KEPEnnzHOYI2VW U9ScKZtdKLQMiWcnaf/dONR8+f9gG/N9gupJ7M41S0jDM58+jzoiS707i/jwpiPa HIDEeXTFbGgSNq5cYjIf8DJmhP9q8CIJTWYl0VkfiuosjdO0lCpj9zTyCuNJXFVO pv6pTrXFF/5g0T4aE7Q4GG8n5n00efg79W0r/izwROZAhACS0ySxKxS31Kgdai/K lg== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gr33qssbt-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:28 -0400 (EDT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-91049eac948so6778736d6.1 for ; Wed, 16 Sep 2026 21:00:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617628; x=1790222428; 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=QNBz7qZVwp5RcNzkvihb5aYS3nlxHpqrFJbc7CTs71E=; b=ToXBIoJWFbV9E9cv+5TAuzlgN0w1XOU+5wYsDxsgTlSpzNLXAJwq96BnOWZrck5Yrz O3rrDWsO/Qs+RWQxHV7NoV8tgytcFf6vRyVfWEbOE7hPYazXS/3RdMou1JLREEjILtHa NxkRNptBvvA9GUTjKnwVUK7rAvVci9JNI/ZvoOZKJh+N/t8F2vGGu498jfxg5aco6jDr vnP3SLsgNdt6D3akF1sF3DlDqoaD++OykaAMCzCgANaA3tX4h27OlqYo7tV+/3+3d12Y /0yenYhyw/2kcjk7sqRJZhaVxDtzssQdcDUBiioVFBLhNrloRcWYEoYlI0bKMOPRLApZ VneQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617628; x=1790222428; 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=QNBz7qZVwp5RcNzkvihb5aYS3nlxHpqrFJbc7CTs71E=; b=W8novyQqWjSuJCXqrT5kTbql8uECCgAVNW9Mum4ptdTdI39VMH5P71xy3Ko4U3VLxQ XizxA6rZPFw+HNrloDDP1u6lH3c2pmFC+UHjI3Cg77ddlGRbCK4iQYR9p0x+MdKq5iIr Bm4rJG1+r5lIUVfbiYAUsCWY3R+3UDxqL4dD8IabfSPqTn6BzvSNqNFCsLlPn/Mf3GHf HaF6025jVB4YEQaXWev1qyXgM74gRSdTp1q1QiHI2qkysVat+gNbWaNzvhl4TvLZ6P+B IHQOm0G7nI/lNxXa6my8KTurl0flNn7W9VSlXLh6AvqzSVCHHFXD+aop3Gmm3uQ9BeLA +Y3g== X-Forwarded-Encrypted: i=1; AKwUvBwuD47rwMpmexWgqdc+pOfCo2BjoYOU7hnbvWBOljZ7ag34tKtrAsCU6Cc4HSkUsOmJUb4fC9EYTIcxG+4=@vger.kernel.org X-Gm-Message-State: AFuF++neGjDMKMRLxbMkLrcxDOHyMjlTqfJbsQl6NHV6GdV1dsWyqWe5 8nTy12ZvZ5qgw2jQJJkMXdNFJXcK2n6RqkZ59D4ZDfOQgIdtORi6BGhZhTRvP9HOM2uc7phKXWa GAiJwpTBHCGlrW/wKafB35H3y+s0ygXjbCgBrIUlPE3wzgAW0azZJ4puYc20s142e2eybzA== X-Gm-Gg: AYBFou2k2lHcSWgY4m9/IrQKLe6ZMoVYChtkEWbKCpcgRWiQmsAYTqrBafwqTUBC9ZY 6S4qSrBBI4LrZtLgY/4zamU0TtmxtIzfVpNDrgLMC6qmdJoBcL9UcwBcWsym8cNQEPIAJmuZaKH ki40yVF3ErSWtqzC6vemVPpBqlmp0PDhCfMpUAhaYCQc6EaZetWQPGlYquwCDOGorVCiCyvOd/m nYCdlQGuDGI3KpBU6Xq2AD5BI4hXOVlVagoH6csh0s0obpDVBYidBbSqT79MKCjLC2vQQ7SOUn7 yemCRKg7svH27q7/yZgJONZZSKt51k59X/Zv8/GcEm81mi7kU5zPnHWaa47DiXYsokKpK2Lw06S EV0xuF/6zEP3A8nO7x8VQJ6ayT/pg61MRj75fo0oJhqOPXQ== X-Received: by 2002:a05:6214:529c:b0:910:2f02:8c33 with SMTP id 6a1803df08f44-9123d64e570mr88687746d6.0.1789617627613; Wed, 16 Sep 2026 21:00:27 -0700 (PDT) X-Received: by 2002:a05:6214:529c:b0:910:2f02:8c33 with SMTP id 6a1803df08f44-9123d64e570mr88687356d6.0.1789617627009; Wed, 16 Sep 2026 21:00:27 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:25 -0700 (PDT) From: Tal Zussman Date: Wed, 16 Sep 2026 23:59:58 -0400 Subject: [PATCH v3 02/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-2-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=23045; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=Kc+pPOO+o45EY/reQItthWni5iJK8i4fD0SmuVgpNQA=; b=6thvdeyAyah/XUX6WoJk4eF8ZOMnu1n/nVBa2min5Zva771BlLBhBwPjn8+g51B72FA2tI5Ca m3dNnGaso7cAWW9phEhAC7cx4iIpFOpFG7HIjRs6UdeI4Aw7bVHhG7S X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-GUID: W_e3sucz5xPx0_W01G0oqmjlN7ea9MJd X-Proofpoint-ORIG-GUID: W_e3sucz5xPx0_W01G0oqmjlN7ea9MJd X-Authority-Analysis: v=2.4 cv=O72sLx9W c=1 sm=1 tr=0 ts=6aab65dd 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=SsB-OO3BMngHh3ZO9fOt:22 a=YSsY4-ms6ieMqBkSp-MA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX8ZAyocZ54GWU 4KCZqnjzinD53gvn/rS3bZUNjPvkaZHa9rSVFmRc4UK0rb9ZXBjLYiQ2yVrkZhjdumfhH0h2Be3 bIU9JwpyAwuj71du8GZDoCMM7qUeiE+CJQUJNQVhxtqINvEf8JfZx+XJvGAkp0cAWAkKbt8KvD7 Lk1zXlzpMUTePwI2jsKyv6P72D8PcGI2t862vUAlcbQg9s967FPxhZyZXUpH5qRd2HNj8lz9VPx wumUO6I+w68kwQOpWRtAoLspropKXS6GoKQrOVD7Ma4Ki0o/M508hWPFKyeofDNHWdow4wtB1cK 4zLbNDkDRiO49VG9h/a7tofsbEBe/v/XNIyB5vdwCKkAA7oHJ+7h44Bd/AZItFRVHb7iHzA36xn +oqX9UnxJL/zwuvA423kXwftLsJzqZjcavWCrtICs8sXGLxee3wdrqYXJXObDd9hbnqaQoruuIn EPmgbqa9wjtqQCBrs1g== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX8cLl3//stkVy TQq3yczFmCz+iRUTrn0l0mVuLiUFrhzlFcfSUV9V6KiTDgZ2wBzqE5BjSkvk4ACVS03WFxzrd1i 69RHpOeBFjuQpHWo5NpInkVeqnxw7mpbw+2AFFaUhVEGrFU3r5Jn X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=10 spamscore=0 suspectscore=0 lowpriorityscore=10 priorityscore=1501 bulkscore=10 adultscore=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-2609040000 definitions=main-2609170047 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 | 397 ++++-----------------------------------------= ---- 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, 26 insertions(+), 443 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index ee182369254c..857da5564cf8 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1194,29 +1194,10 @@ 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; @@ -3373,197 +3354,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 +3372,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); @@ -3611,7 +3399,7 @@ int btrfs_start_dirty_block_groups(struct btrfs_trans= _handle *trans) /* * 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 + * updating its item */ mutex_lock(&trans->transaction->cache_write_mutex); while (!list_empty(&dirty)) { @@ -3619,23 +3407,8 @@ int btrfs_start_dirty_block_groups(struct btrfs_tran= s_handle *trans) =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,66 +3416,33 @@ 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. - */ + /* Avoid blocking other tasks for too long. */ mutex_unlock(&trans->transaction->cache_write_mutex); if (ret) goto out; @@ -3747,121 +3487,34 @@ int btrfs_write_dirty_block_groups(struct btrfs_tr= ans_handle *trans) struct btrfs_block_group *cache; struct btrfs_transaction *cur_trans =3D trans->transaction; int ret =3D 0; - int should_put; BTRFS_PATH_AUTO_FREE(path); - struct list_head *io =3D &cur_trans->io_bgs; =20 path =3D btrfs_alloc_path(); if (!path) return -ENOMEM; =20 - /* - * Even though we are in the critical section of the transaction commit, - * we can still have concurrent tasks adding elements to this - * transaction's list of dirty block groups. These tasks correspond to - * endio free space workers started when writeback finishes for a - * space cache, which run inode.c:btrfs_finish_ordered_io(), and can - * allocate new block groups as a result of COWing nodes of the root - * tree when updating the free space inode. The writeback for the space - * caches is triggered by an earlier call to - * btrfs_start_dirty_block_groups() and iterations of the following - * loop. - * Also we want to do the cache_save_setup first and then run the - * delayed refs to make sure we have the best chance at doing this all - * in one shot. - */ spin_lock(&cur_trans->dirty_bgs_lock); while (!list_empty(&cur_trans->dirty_bgs)) { cache =3D list_first_entry(&cur_trans->dirty_bgs, struct btrfs_block_group, dirty_list); - - /* - * This can happen if cache_save_setup re-dirties a block group - * that is already under IO. Just wait for it to finish and - * then do it all again - */ - if (!list_empty(&cache->io_list)) { - spin_unlock(&cur_trans->dirty_bgs_lock); - list_del_init(&cache->io_list); - btrfs_wait_cache_io(trans, cache, path); - btrfs_put_block_group(cache); - spin_lock(&cur_trans->dirty_bgs_lock); - } - - /* - * Don't remove from the dirty list until after we've waited on - * any pending IO - */ list_del_init(&cache->dirty_list); spin_unlock(&cur_trans->dirty_bgs_lock); - should_put =3D 1; - - cache_save_setup(cache, trans, path); =20 if (!ret) ret =3D btrfs_run_delayed_refs(trans, U64_MAX); - - if (!ret && cache->disk_cache_state =3D=3D BTRFS_DC_SETUP) { - cache->io_ctl.inode =3D NULL; - ret =3D btrfs_write_out_cache(trans, cache, path); - if (ret =3D=3D 0 && cache->io_ctl.inode) { - should_put =3D 0; - list_add_tail(&cache->io_list, io); - } else { - /* - * If we failed to write the cache, the - * generation will be bad and life goes on - */ - ret =3D 0; - } - } if (!ret) { ret =3D update_block_group_item(trans, path, cache); - /* - * One of the free space endio workers might have - * created a new block group while updating a free space - * cache's inode (at inode.c:btrfs_finish_ordered_io()) - * and hasn't released its transaction handle yet, in - * which case the new block group is still attached to - * its transaction handle and its creation has not - * finished yet (no block group item in the extent tree - * yet, etc). If this is the case, wait for all free - * space endio workers to finish and retry. This is a - * very rare case so no need for a more efficient and - * complex approach. - */ - if (ret =3D=3D -ENOENT) { - wait_event(cur_trans->writer_wait, - atomic_read(&cur_trans->num_writers) =3D=3D 1); - ret =3D update_block_group_item(trans, path, cache); - if (ret) - btrfs_abort_transaction(trans, ret); - } else if (ret) { + if (ret) btrfs_abort_transaction(trans, ret); - } } =20 - /* If its not on the io list, we need to put the block group */ - if (should_put) - btrfs_put_block_group(cache); + btrfs_put_block_group(cache); btrfs_dec_delayed_refs_rsv_bg_updates(fs_info); spin_lock(&cur_trans->dirty_bgs_lock); } spin_unlock(&cur_trans->dirty_bgs_lock); =20 - /* - * Refer to the definition of io_bgs member for details why it's safe - * to use it without any locking - */ - while (!list_empty(io)) { - cache =3D list_first_entry(io, struct btrfs_block_group, - io_list); - list_del_init(&cache->io_list); - btrfs_wait_cache_io(trans, cache, path); - btrfs_put_block_group(cache); - } - return ret; } =20 diff --git a/fs/btrfs/block-group.h b/fs/btrfs/block-group.h index 69d56864d4ba..97c8565ae4fc 100644 --- a/fs/btrfs/block-group.h +++ b/fs/btrfs/block-group.h @@ -368,7 +368,6 @@ int btrfs_inc_block_group_ro(struct btrfs_block_group *= cache, void btrfs_dec_block_group_ro(struct btrfs_block_group *cache); int btrfs_start_dirty_block_groups(struct btrfs_trans_handle *trans); int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans); -int btrfs_setup_space_cache(struct btrfs_trans_handle *trans); int btrfs_update_block_group(struct btrfs_trans_handle *trans, u64 bytenr, u64 num_bytes, bool alloc); int btrfs_add_reserved_bytes(struct btrfs_block_group *cache, diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 819727460bcf..f544c457d4ab 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4860,26 +4860,6 @@ static void btrfs_destroy_pinned_extent(struct btrfs= _fs_info *fs_info, } } =20 -static void btrfs_cleanup_bg_io(struct btrfs_block_group *cache) -{ - struct inode *inode; - - inode =3D cache->io_ctl.inode; - if (inode) { - unsigned int nofs_flag; - - nofs_flag =3D memalloc_nofs_save(); - invalidate_inode_pages2(inode->i_mapping); - memalloc_nofs_restore(nofs_flag); - - BTRFS_I(inode)->generation =3D 0; - cache->io_ctl.inode =3D NULL; - iput(inode); - } - ASSERT(cache->io_ctl.pages =3D=3D NULL); - btrfs_put_block_group(cache); -} - void btrfs_cleanup_dirty_bgs(struct btrfs_transaction *cur_trans, struct btrfs_fs_info *fs_info) { @@ -4891,13 +4871,6 @@ void btrfs_cleanup_dirty_bgs(struct btrfs_transactio= n *cur_trans, struct btrfs_block_group, dirty_list); =20 - if (!list_empty(&cache->io_list)) { - spin_unlock(&cur_trans->dirty_bgs_lock); - list_del_init(&cache->io_list); - btrfs_cleanup_bg_io(cache); - spin_lock(&cur_trans->dirty_bgs_lock); - } - list_del_init(&cache->dirty_list); spin_lock(&cache->lock); cache->disk_cache_state =3D BTRFS_DC_ERROR; @@ -4909,22 +4882,6 @@ void btrfs_cleanup_dirty_bgs(struct btrfs_transactio= n *cur_trans, spin_lock(&cur_trans->dirty_bgs_lock); } spin_unlock(&cur_trans->dirty_bgs_lock); - - /* - * Refer to the definition of io_bgs member for details why it's safe - * to use it without any locking - */ - while (!list_empty(&cur_trans->io_bgs)) { - cache =3D list_first_entry(&cur_trans->io_bgs, - struct btrfs_block_group, - io_list); - - list_del_init(&cache->io_list); - spin_lock(&cache->lock); - cache->disk_cache_state =3D BTRFS_DC_ERROR; - spin_unlock(&cache->lock); - btrfs_cleanup_bg_io(cache); - } } =20 static void btrfs_free_all_qgroup_pertrans(struct btrfs_fs_info *fs_info) @@ -4960,7 +4917,6 @@ void btrfs_cleanup_one_transaction(struct btrfs_trans= action *cur_trans) =20 btrfs_cleanup_dirty_bgs(cur_trans, fs_info); ASSERT(list_empty(&cur_trans->dirty_bgs)); - ASSERT(list_empty(&cur_trans->io_bgs)); =20 list_for_each_entry_safe(dev, tmp, &cur_trans->dev_update_list, post_commit_list) { diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 6802b94ed76f..6a36d29406c3 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -379,7 +379,6 @@ static noinline int join_transaction(struct btrfs_fs_in= fo *fs_info, INIT_LIST_HEAD(&cur_trans->dev_update_list); INIT_LIST_HEAD(&cur_trans->switch_commits); INIT_LIST_HEAD(&cur_trans->dirty_bgs); - INIT_LIST_HEAD(&cur_trans->io_bgs); INIT_LIST_HEAD(&cur_trans->dropped_roots); mutex_init(&cur_trans->cache_write_mutex); spin_lock_init(&cur_trans->dirty_bgs_lock); @@ -1363,7 +1362,6 @@ static noinline int commit_cowonly_roots(struct btrfs= _trans_handle *trans) { struct btrfs_fs_info *fs_info =3D trans->fs_info; struct list_head *dirty_bgs =3D &trans->transaction->dirty_bgs; - struct list_head *io_bgs =3D &trans->transaction->io_bgs; struct extent_buffer *eb; int ret; =20 @@ -1393,10 +1391,6 @@ static noinline int commit_cowonly_roots(struct btrf= s_trans_handle *trans) if (ret) return ret; =20 - ret =3D btrfs_setup_space_cache(trans); - if (ret) - return ret; - again: while (!list_empty(&fs_info->dirty_cowonly_roots)) { struct btrfs_root *root; @@ -1417,7 +1411,7 @@ static noinline int commit_cowonly_roots(struct btrfs= _trans_handle *trans) if (ret) return ret; =20 - while (!list_empty(dirty_bgs) || !list_empty(io_bgs)) { + while (!list_empty(dirty_bgs)) { ret =3D btrfs_write_dirty_block_groups(trans); if (ret) return ret; @@ -2543,7 +2537,6 @@ int btrfs_commit_transaction(struct btrfs_trans_handl= e *trans) switch_commit_roots(trans); =20 ASSERT(list_empty(&cur_trans->dirty_bgs)); - ASSERT(list_empty(&cur_trans->io_bgs)); update_super_roots(fs_info); =20 btrfs_set_super_log_root(fs_info->super_copy, 0); diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 3a57f227b5ed..8245a58587c0 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -47,7 +47,6 @@ enum btrfs_trans_state { =20 #define BTRFS_TRANS_HAVE_FREE_BGS 0 #define BTRFS_TRANS_DIRTY_BG_RUN 1 -#define BTRFS_TRANS_CACHE_ENOSPC 2 =20 struct btrfs_transaction { u64 transid; @@ -78,23 +77,6 @@ struct btrfs_transaction { struct list_head dev_update_list; struct list_head switch_commits; struct list_head dirty_bgs; - - /* - * There is no explicit lock which protects io_bgs, rather its - * consistency is implied by the fact that all the sites which modify - * it do so under some form of transaction critical section, namely: - * - * - btrfs_start_dirty_block_groups - This function can only ever be - * run by one of the transaction committers. Refer to - * BTRFS_TRANS_DIRTY_BG_RUN usage in btrfs_commit_transaction - * - * - btrfs_write_dirty_blockgroups - this is called by - * commit_cowonly_roots from transaction critical section - * (TRANS_STATE_COMMIT_DOING) - * - * - btrfs_cleanup_dirty_bgs - called on transaction abort - */ - struct list_head io_bgs; struct list_head dropped_roots; struct extent_io_tree pinned_extents; =20 --=20 2.39.5 From nobody Fri Sep 25 03:20:30 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 A36F23BA225 for ; Thu, 17 Sep 2026 04:00:36 +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=1789617639; cv=none; b=ZOt8ASKG1AQAGWeRsOlFUedODMJYcv2K0Ia6exGtdngbEqicyalHn/fpaZor67ePovshvjtv46SrrdxMr9Xk3pS32CXgop0IQZYIwBH6SnW1AONlUCoXY+HXh1RUSW3tJMCzztzN5hEQruuZOiG53jl9Z5l0DefhZZrBu8E/wAQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617639; c=relaxed/simple; bh=Qw6xRMsVJw4t9/S/x7rsDKrF7fU3/zyJMoJYbzy1IwE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=g6pNepJaPZKpx/p6lkQKSUIzDctfl4e4bsZNVBcCyyCDFysb790H4PoBH/bVwKJ91B3MtJPJIUDRYp8+22EjLptlkd1PYVs+OymW1BpzqnXNGAFL9uCuR6Jd5Sf7oCpOJ9OvSa+L+a6JS421IXBflf2g7gNdkrLkDxC64AySdms= 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=apSsgkXl; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=hIj4kS3l; 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="apSsgkXl"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="hIj4kS3l" Received: from pps.filterd (m0167069.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68H2ZK7F204163 for ; Thu, 17 Sep 2026 00:00:30 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=8Wyh q5ssihSK9up1ann73uoMasXeNXwKo64Ka9RS2oA=; b=apSsgkXlAh9X2JgCR4ww 6HmnkALubGLmamzLpdJT/eL679VPyYBV8CbXv+UlWzoKLLaKx3Pw8ov0w2EmEYnT 3OuarzE+rR2a8zzok66F1sZdZ7dHRF/VkIv1mPdeauxkJd8QJZSA0rh9Mgys2Hv2 kH5cHsc0WjiDPfiB8AJI0wN3ZCuPXOJP7f231X2VGTwQM85ytw70QN74kR27Xz1/ agWorIZiWLVRpC/bN3DpkdeGvKHduXRk7CDQWnImvZ94xme5gIKxrb7vVTAhp6+c xZUmOO0XFvRdFKZN8MNXvZKbFfpXZNb90YUSvLmtJ2kDGoeDJ5kceZ05T3isTO4o qg== 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 4gr1x6adnp-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:29 -0400 (EDT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-90e8135d7eeso6520026d6.1 for ; Wed, 16 Sep 2026 21:00:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617629; x=1790222429; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=8Wyhq5ssihSK9up1ann73uoMasXeNXwKo64Ka9RS2oA=; b=hIj4kS3lj9CC20xc2cgPaqTbhMMkdIkx0m3yOrtLDos0o3AoILbIPgGvFisi5nlMwv nSUKtwH3LIMMuYjgGTStMzL446Dlld6IOJhsxnOWpxqoKTOGmtPfkk69Nm5aoilTbeCg p3tBksSJZqL+7h5eGQYet64CNGwddLZS5bG3azgwa5+qfFLymDe4GTbJ3e2UfWc3ebJ1 00EDkB6B2WVWiAxJx9SO6eUGQZDU7j0MiI2aQSY9q64dg2jJ54hd2kPWCn/Tv188q7BL FVTn3bpal1zSS/YLaVxcrDB5ltbVYV0nCcOhOczb/54MzDEVTWo5kZkgDm7VISJLXxnH LuOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617629; x=1790222429; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=8Wyhq5ssihSK9up1ann73uoMasXeNXwKo64Ka9RS2oA=; b=Qdd5qpsVfw06GT+WrbCG7ab9U8MmofuJlLHzWZq9N8TabISGPeUsEJi1gOfPM8DW/U uzSYLSUWcKHQrx3imj39oNeEIbms9MD+3lisgFhzxiL8JBaneMXuBtfSJ4ndskmhY3La 5fhFXq7LpAuAGh27C+DIYv5R/EG4rc4z/nU8d+hiTvWfCCwTJrvqArf1ax8mqG39PQ4U obo2G9leV2HtSvoif97MyKAtAuVElqWQsvPedAdDHUyKL9H+LAkOLo4MQTHnUPo0saUM iv8jilICH+/Y/g4L4TxiuviwtCv4RycybxFhceZ1/sihczpr3Inj1DCmt/EiLaUwgQFd jrhw== X-Forwarded-Encrypted: i=1; AKwUvBzdPThnjyJqRY6ghpawuZLhYQt53Ob4CMWaV7d0v7YGLwYDEiKxk+yCEu2dCjkbERhtcVUvnM+irei3XmQ=@vger.kernel.org X-Gm-Message-State: AFuF++nbdMp25N+pPCpeeMu1RE5TO5gnyloK1jrY+lUIn+u8IUmTUdaK B2ZZuYu0z0zHxJIHMDcoAfpKy+pyztACemDVKNSn78pMkAoAahIydPZQGNxTYTk6AaewyZjJyu3 rX09DZ+sXEDnXAb21U0J0husU3oHcIu/xj8lv6TB0pzHVPOyIOjvp9jfqR4S/Auy2RGHqgQ== X-Gm-Gg: AYBFou02jLEixdf+uaj1Nyjuh5hE1Qd4iVGqGzag7vEh50W6gQGXup5A2hi1nz1HY2m jxnFct/Rce6XGDA4IOOsA4yVVWWzk7vgPPYfhUz9IYePNd8EHohDrgL/4MD9Ri9tE0OY2/bRIIK rL9kHOZC4ksyN2gxcaF+Fnve1IP+kBR5S+B6nUgvxWLpnpMy9lBCCtUtHxksG8imgUDiTx0Qq5z S4vFk9ztrW+AoDK/9J1YEH9ahTOSqwRZjQ/OdbzK+wR2XWQiwFs+m7C9VMCMSLZs3FJC/6+mnxJ FzIaFr8y9i58g1aBG/p/HwwbXBpWqL/R4eKYWdD18yEuO7QmRjeV0WmB6Lg5sc6oszwY01Ke/MQ LIx5bOOhYs6nEyroFE1UdJgadp6bPLvvH//LGEe1e4hdl8A== X-Received: by 2002:a05:6214:b6b:b0:910:314d:7cbf with SMTP id 6a1803df08f44-9123d7b2e0cmr89801656d6.28.1789617628641; Wed, 16 Sep 2026 21:00:28 -0700 (PDT) X-Received: by 2002:a05:6214:b6b:b0:910:314d:7cbf with SMTP id 6a1803df08f44-9123d7b2e0cmr89801366d6.28.1789617627992; Wed, 16 Sep 2026 21:00:27 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:27 -0700 (PDT) From: Tal Zussman Date: Wed, 16 Sep 2026 23:59:59 -0400 Subject: [PATCH v3 03/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-3-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=5247; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=Qw6xRMsVJw4t9/S/x7rsDKrF7fU3/zyJMoJYbzy1IwE=; b=lEwhxP/guWCrFpcpCXoP7Vk7fZplOhYRwkkIXJ0zPlDOtvHXM5rw17xJbZrlFOePnHaECdYFy WEQ9Qu+5qWyCQBz+ctEDUc5mO+g9vsbxIcih79xm7wsL2pn8UcnJkYn X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX2tBPKDtDbPrG UV1aqgccUhri9g5pSqQ2hKhHN7gnUXf4vR2e51gKhfZ5OV4Fcxi3/KuAmkqGGjE6pRnWrSrwrko rM37114AXEWc+hAs+WSF6uhLgBZoGRORBmFFONn3vVrWT9Q33l+p X-Proofpoint-ORIG-GUID: h2hcI_f6OHclauEYj24gc5IIOTUkmns5 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX9vNAyJOhqRLe zG0HELOcsWaDzZbqF5ouwgAmuo+7FJkEKoMVjBOXwIgVc6z97A+zFrF/iZyprCRQMTPezmgtVkJ 89f80wqlw0uB/S/CBRBR8TRR42ntX87UtJWw5pFDRFWNRQidDICTtc81LSuNqFEa5U4Kb/RXGHt EBiERrxWCZaz4496jmO58PsQNJA+oUUFl+iGOOjQmQnAZj0jxtpdsPo2gbfRBJeehfiNFkVC3wA 9iMe2yg6h2+4NOjvLxpYHStlXMZaY5LewPMSJTZD/yfO2hpvt+QIk0pt55igpXNNYLFmyNZdMXN BJkogTMT8VUdtEELm1C5rWqlZBu7oy1qYxDPhxEqVo/IXt7/1QUxbUtB8hiHQngNg6pi20Nemdf /338mFw9u+z/wiJMZoG3qH34UW+wwhp2maUu+ALHp8o0sIiuEgF0ZzU0WBBB/9Xt1sBvcAoGBOX GNII5j/aJ3NevQDXsoA== X-Proofpoint-GUID: h2hcI_f6OHclauEYj24gc5IIOTUkmns5 X-Authority-Analysis: v=2.4 cv=CLS/zhrD c=1 sm=1 tr=0 ts=6aab65dd 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=JR4YdQiviy7OQf72WyZ1:22 a=MjXS7SgsmouH5g4WD6EA:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=10 malwarescore=0 impostorscore=10 spamscore=0 suspectscore=0 lowpriorityscore=10 clxscore=1015 priorityscore=1501 adultscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 Free space inodes are no longer written to, so nothing queues ordered extent completion on endio_freespace_worker. Remove it and always use endio_write_workers in btrfs_queue_ordered_fn(). Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/disk-io.c | 14 +++----------- fs/btrfs/fs.h | 1 - fs/btrfs/ordered-data.c | 7 ++----- fs/btrfs/super.c | 1 - 4 files changed, 5 insertions(+), 18 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index f544c457d4ab..f256a91f58b4 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1769,7 +1769,6 @@ static void btrfs_stop_all_workers(struct btrfs_fs_in= fo *fs_info) if (fs_info->rmw_workers) destroy_workqueue(fs_info->rmw_workers); btrfs_destroy_workqueue(fs_info->endio_write_workers); - btrfs_destroy_workqueue(fs_info->endio_freespace_worker); btrfs_destroy_workqueue(fs_info->delayed_workers); btrfs_destroy_workqueue(fs_info->caching_workers); btrfs_destroy_workqueue(fs_info->flush_workers); @@ -1980,9 +1979,6 @@ static int btrfs_init_workqueues(struct btrfs_fs_info= *fs_info) fs_info->endio_write_workers =3D btrfs_alloc_workqueue(fs_info, "endio-write", flags, max_active, 2); - fs_info->endio_freespace_worker =3D - btrfs_alloc_workqueue(fs_info, "freespace-write", flags, - max_active, 0); fs_info->delayed_workers =3D btrfs_alloc_workqueue(fs_info, "delayed-meta", flags, max_active, 0); @@ -1995,8 +1991,7 @@ static int btrfs_init_workqueues(struct btrfs_fs_info= *fs_info) if (!(fs_info->workers && fs_info->delalloc_workers && fs_info->flush_workers && fs_info->endio_workers && fs_info->endio_meta_workers && - fs_info->endio_write_workers && - fs_info->endio_freespace_worker && fs_info->rmw_workers && + fs_info->endio_write_workers && fs_info->rmw_workers && fs_info->caching_workers && fs_info->fixup_workers && fs_info->delayed_workers && fs_info->qgroup_rescan_workers && fs_info->discard_ctl.discard_workers)) { @@ -4442,9 +4437,8 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info) * to finish an ordered extent - end_bbio_compressed_write() * calls btrfs_finish_ordered_extent() which in turns does a call to * btrfs_queue_ordered_fn(), and that queues the ordered extent - * completion either in the endio_write_workers work queue or in the - * fs_info->endio_freespace_worker work queue. We flush those queues - * below, so before we flush them we must flush this queue for the + * completion in the endio_write_workers work queue. We flush that + * queue below, so before we flush it we must flush this queue for the * workers of compressed writes. */ flush_workqueue(fs_info->endio_workers); @@ -4470,8 +4464,6 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info) * btrfs_finish_ordered_io() when we are unmounting). */ btrfs_flush_workqueue(fs_info->endio_write_workers); - /* Ordered extents for free space inodes. */ - btrfs_flush_workqueue(fs_info->endio_freespace_worker); /* * Run delayed iputs in case an async reclaim worker is waiting for them * to be run as mentioned above. diff --git a/fs/btrfs/fs.h b/fs/btrfs/fs.h index 10e15a319b93..96cc8c50af82 100644 --- a/fs/btrfs/fs.h +++ b/fs/btrfs/fs.h @@ -712,7 +712,6 @@ struct btrfs_fs_info { struct workqueue_struct *endio_meta_workers; struct workqueue_struct *rmw_workers; struct btrfs_workqueue *endio_write_workers; - struct btrfs_workqueue *endio_freespace_worker; struct btrfs_workqueue *caching_workers; =20 struct workqueue_struct *fixup_workers; diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index b32d4eabe0ab..e9f1cbeb555a 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -417,13 +417,10 @@ static bool can_finish_ordered_extent(struct btrfs_or= dered_extent *ordered, =20 static void btrfs_queue_ordered_fn(struct btrfs_ordered_extent *ordered) { - struct btrfs_inode *inode =3D ordered->inode; - struct btrfs_fs_info *fs_info =3D inode->root->fs_info; - struct btrfs_workqueue *wq =3D btrfs_is_free_space_inode(inode) ? - fs_info->endio_freespace_worker : fs_info->endio_write_workers; + struct btrfs_fs_info *fs_info =3D ordered->inode->root->fs_info; =20 btrfs_init_work(&ordered->work, finish_ordered_fn, NULL); - btrfs_queue_work(wq, &ordered->work); + btrfs_queue_work(fs_info->endio_write_workers, &ordered->work); } =20 void btrfs_finish_ordered_extent(struct btrfs_ordered_extent *ordered, diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 77443ded6db3..b44b16970a62 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -1243,7 +1243,6 @@ static void btrfs_resize_thread_pool(struct btrfs_fs_= info *fs_info, workqueue_set_max_active(fs_info->endio_workers, new_pool_size); workqueue_set_max_active(fs_info->endio_meta_workers, new_pool_size); btrfs_workqueue_set_max(fs_info->endio_write_workers, new_pool_size); - btrfs_workqueue_set_max(fs_info->endio_freespace_worker, new_pool_size); btrfs_workqueue_set_max(fs_info->delayed_workers, new_pool_size); } =20 --=20 2.39.5 From nobody Fri Sep 25 03:20:30 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 87E543B893F for ; Thu, 17 Sep 2026 04:00:38 +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=1789617643; cv=none; b=AcfLo3Qp6grfUZIvlNlRMWUw0XfET9H6xJpbKPcsy28InMIavwCIBh881E34b/QPqLxAmZkFbQQg/4/7YzLhu9o1bvpP1/RqN5F1XqkOXxOmtZMNnSoHpYRGaHeT+UqO2ic9UsLAoVMoG5JTvZ4JdvHWCCxWAnPML6l7DZc6Pv8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617643; c=relaxed/simple; bh=3uFWE4KsDxoLY6uWS8UOPo4gerxSLYDHcrnB7XQk2E0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jKHALbkFtFsFwm3KlH5JPjjrO667OxOTtCAOK9J5MR+C+fmZgFRNPieqWZEECXXgy0+w5WUubWNHizHKQlpSE6nrx9zM75H5hxmw89ARWQ8CCr7cCPTr4f45ukqvf3UKGzPqGxmZURT0Ccd1UkLfuazqDpJS63b1Z+L+RmS+VY4= 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=fZo3vAsa; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=jAuPutI/; 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="fZo3vAsa"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="jAuPutI/" 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 68H2YBrC3508851 for ; Thu, 17 Sep 2026 00:00:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=fjNt osJuo8h74+90X2/DVScI1uqlFKNEUij0jXLAjQg=; b=fZo3vAsaEePN/OgQHlfR Hcke4SYf/nKHTLB7amwjaNGU7rO0+z5IZRhkjHN9q0dd15RWkUzn3KvW6pOat0v8 2eOaY1M0foWVSd5mENYpsb/djE0IjGpJJnizcxAKP+Cj3ySn5WZ1FBMoG6eCxMQe sua174J9kADcjRlbi1PWvKMaGpi+Z9XytOin00UPssTMGmPELLdkBe1RNAFJ9fiO VJvwyj8DvMIJ+UxZDhQGHea2Vnk6hkmEACEWCM092Lv2U1WM2d4NGDxDDCRd+GU6 K2laKnwndOqrVMN2BCWfLy6vIFQi1ZZNTEj42CiiGgBnvgoIf2gK380DV6hPPvFe Fw== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gr3swhcye-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:31 -0400 (EDT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-9105cf082f7so7241696d6.2 for ; Wed, 16 Sep 2026 21:00:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617631; x=1790222431; 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=fjNtosJuo8h74+90X2/DVScI1uqlFKNEUij0jXLAjQg=; b=jAuPutI/X/ygCD23GR2s1gvm0cwymR+BmlbjMEmMDHZjqJVKWd2dYFeW6YmgM97Egq YGTirM2PnbM3tHS3I1KA1TANTDBrfffBJ32HbF8RMW/4I5hePcdh3QaJ79N+mJcnoVYc oeHLqri/QazvxPomMzuUTxcC/PEkiW4E50FVYRLFzTtcrZjmG+xnyssUHfCJgzUaYucf NedwAIkFnDdeye0oUp9ghcyL8rY6FjAzoZsEDEnW832XJP7K9oUHn1Oc7N3FKnZGLW5s VD/w2Q41IWdi+J3iZUkj2Q3aGDmq9xwaZ+sbhN+qmZoC6/l2xgtLEMQOVDCdcweKO+Zv aqyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617631; x=1790222431; 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=fjNtosJuo8h74+90X2/DVScI1uqlFKNEUij0jXLAjQg=; b=wKLwIrclltB+zO5QzFTYe/fFWrSgVFwLlDu/IEEyxwhqhHn0dXeFuUSXLc0jN0hwvv uW1/YpV5WI61jSLdWQvvCnz8l1FeFgrhxnN7zJ6NIp8UjK0Pa1oSzLVezdb8H30QMXEa lq//zCh0pIOp5/mCDkcg7KIydjBbTucuyBGQlZU0GB1R9IESNKpStprNTJc+DPEelhOD OsltmSmoKudROpL8IRpmpHGW1RzIyPzaUNB4/DqR3MJSyv5KvgGapTvogf/UCZlMiz4k 1AtLgWP7xC+dfRf/+g8nS7roSTcl+feKo1eRqY6MNn8xVNUPc/6Nw634psv+F2hQLoVa pDDQ== X-Forwarded-Encrypted: i=1; AKwUvBxFzJ2hjv8HmXr1Gyhp5es3qC+BG8thiyyWbbcowp9I94Tq8EggvEELWVoBi2mvT1LtnINaGizQMsOd0jE=@vger.kernel.org X-Gm-Message-State: AFuF++mOb683ynX44/R5xP1fHEs4qYhA4VNC0lsejQu8ROuQjpBsP3nO vUAD5LT3kdd+kdsupYv0dSwMztIGagAyRv+QnA5n0lnq+F5VbaQVn1oLNyzKh27VbiGerzl/nnK naQDr7H0WnrAgvJAb0hdAi4FNwjzie+rvmjOniC7eScaO9SxG5HZTtNVxNHlNBrXSLE4IKw== X-Gm-Gg: AYBFou1wYRHQPC/6PLyDKmCoA3aJlvTjsP/AmwGYfF3mlAOhjq9CHxTnKOfLlsL1pkA Qg7pFHBZ6H/a4Ryh3/0qtEfhaMMZ0cUfFkuacLGA8Q+OJkimVxIG6pIS3Xe2smw+DP+Owxz/BRS VUboDG4RE7HJV5uJ5bGsrlrvpZ5md7vJP8ZGljOPhg8kNqz+I61QyPnGNJioO7vkGCspQaH6q05 ILTP66XibnTQ+4NouGSbC7bNQb33swH/IEj1oBKgmKIVZIDy0YmDqASMIT1pAngqazOEJ2zedts u4w+Xh8BmLUtBIF5S88jdEHvs8onttSmZKdZogyM+hS2/cV/14AHd+FNaBgFI1PUmGD94TFiwlN 7k/SgLKcPNYKSmVJQST5uKy2HmgbPyfJuWYPTJ38dcT1+1Q== X-Received: by 2002:a05:6214:529b:b0:910:39e7:dbb9 with SMTP id 6a1803df08f44-9123d7c3c5amr90066176d6.33.1789617630198; Wed, 16 Sep 2026 21:00:30 -0700 (PDT) X-Received: by 2002:a05:6214:529b:b0:910:39e7:dbb9 with SMTP id 6a1803df08f44-9123d7c3c5amr90065126d6.33.1789617629172; Wed, 16 Sep 2026 21:00:29 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:28 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:00 -0400 Subject: [PATCH v3 04/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-4-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=28350; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=3uFWE4KsDxoLY6uWS8UOPo4gerxSLYDHcrnB7XQk2E0=; b=STUTfLztoyLMDTRKz9VbukDmvvHEQpZ5Dmdl1bC4cO5IKyZ7Pl1delTQqGPvAVmV1UviePM2Y Oc0XXDFJtlpDe2gpIiHHLySkHD7zkrYOh4vfyPSZv44m46B8vnazBcP X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-GUID: Nn6Enot3a_0q9DfzzDfkwjL8IlnyBROz X-Proofpoint-ORIG-GUID: Nn6Enot3a_0q9DfzzDfkwjL8IlnyBROz X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX3xkPARgGc13E RrXgGxSgTUvw2I+Capk837Wu/owsEONW6ZYsTTO9jg587sYMk6N3ADLSYDyNyOplCMGzCz9TAjz MaPX0RycHIZdNzlGSRRr0BpuskeKk2q3zakanh8j+BQwbHrt6uB1 X-Authority-Analysis: v=2.4 cv=ac30Dhot c=1 sm=1 tr=0 ts=6aab65df 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=79PYxaXUQd1wl-QFWJnA:22 a=bWaUF2WQGDAqRP89i5YA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfXylt6V8Qd2i1C WpA822U+Gn1ayjwoymQsSopQ/efFzmf+wDg/KxZU8ww0ZzKRQmtDuUfQxf3EA43y2SJehTLZNns bFJsxoh4j/xisnEYO7bMH9WjBGB/6YfSBJNqMTBUJWYiqXRRmPb8JtDWqGCDPXkYT6A4HyGolM8 FhYuh7fdhzdfK84rcO7QnlONpoeNTK+Y5AaYrR95IdNhUS2XhiKNzYA6i9jWbAYfxK9ar9TGC5e v+H6O5EW4Z1PAYUMFXHeMRYO6Gg2nQMBKUrmhNfAhts7HY21JcL/7x3pHHH5hKYra83yeSuOT4+ 5jcOgeZjommd7ePDeDY60BWQ6M3AC7sK87bhOp4YOPZxs+tdmaLkvmot3eeF50XTQrlby/CMVf2 N5GXrVQamsR+m+9JEBSZsrnQdxvhzYxMMu+qV9YYK9bp/lbGSm3W8qGx6j5EvAsfP/Ksbe3Uir+ gKQOtnfZyfMFzOJObyw== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 bulkscore=10 clxscore=1015 adultscore=0 lowpriorityscore=10 phishscore=0 impostorscore=10 spamscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 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 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 +- 7 files changed, 1 insertion(+), 719 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 857da5564cf8..5c2a57243de5 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1268,7 +1268,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); @@ -2412,7 +2411,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); @@ -4293,7 +4291,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); @@ -4430,7 +4427,6 @@ int btrfs_free_block_groups(struct btrfs_fs_info *inf= o) btrfs_remove_free_space_cache(block_group); ASSERT(block_group->cached !=3D BTRFS_CACHE_STARTED); ASSERT(list_empty(&block_group->dirty_list)); - ASSERT(list_empty(&block_group->io_list)); ASSERT(list_empty(&block_group->bg_list)); ASSERT(refcount_read(&block_group->refs) =3D=3D 1); ASSERT(block_group->swap_extents =3D=3D 0); diff --git a/fs/btrfs/block-group.h b/fs/btrfs/block-group.h index 97c8565ae4fc..939d4bfbd4b4 100644 --- a/fs/btrfs/block-group.h +++ b/fs/btrfs/block-group.h @@ -228,9 +228,6 @@ struct btrfs_block_group { =20 /* For dirty block groups */ struct list_head dirty_list; - struct list_head io_list; - - struct btrfs_io_ctl io_ctl; =20 /* * Incremented when doing extent allocations and holding a read lock diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index 1082fa92c145..26cc5d1aca4c 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h @@ -594,10 +594,6 @@ int btrfs_wait_on_delayed_iputs(struct btrfs_fs_info *= fs_info); int btrfs_prealloc_file_range(struct inode *inode, int mode, u64 start, u64 num_bytes, u64 min_size, loff_t actual_len, u64 *alloc_hint); -int btrfs_prealloc_file_range_trans(struct inode *inode, - struct btrfs_trans_handle *trans, int mode, - u64 start, u64 num_bytes, u64 min_size, - loff_t actual_len, u64 *alloc_hint); int btrfs_run_delalloc_range(struct btrfs_inode *inode, struct folio *lock= ed_folio, u64 start, u64 end, struct writeback_control *wbc); void btrfs_queue_writepage_fixup(struct btrfs_inode *inode, struct folio *= folio); diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index e2af75a205ea..336b546b0a94 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -164,78 +164,6 @@ struct inode *lookup_free_space_inode(struct btrfs_blo= ck_group *block_group, return inode; } =20 -static int __create_free_space_inode(struct btrfs_root *root, - struct btrfs_trans_handle *trans, - struct btrfs_path *path, - u64 ino, u64 offset) -{ - struct btrfs_key key; - struct btrfs_disk_key disk_key; - struct btrfs_free_space_header *header; - struct btrfs_inode_item *inode_item; - struct extent_buffer *leaf; - /* We inline CRCs for the free disk space cache */ - const u64 flags =3D BTRFS_INODE_NOCOMPRESS | BTRFS_INODE_PREALLOC | - BTRFS_INODE_NODATASUM | BTRFS_INODE_NODATACOW; - int ret; - - ret =3D btrfs_insert_empty_inode(trans, root, path, ino); - if (ret) - return ret; - - leaf =3D path->nodes[0]; - inode_item =3D btrfs_item_ptr(leaf, path->slots[0], - struct btrfs_inode_item); - btrfs_item_key(leaf, &disk_key, path->slots[0]); - memzero_extent_buffer(leaf, (unsigned long)inode_item, - sizeof(*inode_item)); - btrfs_set_inode_generation(leaf, inode_item, trans->transid); - btrfs_set_inode_size(leaf, inode_item, 0); - btrfs_set_inode_nbytes(leaf, inode_item, 0); - btrfs_set_inode_uid(leaf, inode_item, 0); - btrfs_set_inode_gid(leaf, inode_item, 0); - btrfs_set_inode_mode(leaf, inode_item, S_IFREG | 0600); - btrfs_set_inode_flags(leaf, inode_item, flags); - btrfs_set_inode_nlink(leaf, inode_item, 1); - btrfs_set_inode_transid(leaf, inode_item, trans->transid); - btrfs_set_inode_block_group(leaf, inode_item, offset); - btrfs_release_path(path); - - key.objectid =3D BTRFS_FREE_SPACE_OBJECTID; - key.type =3D 0; - key.offset =3D offset; - ret =3D btrfs_insert_empty_item(trans, root, path, &key, - sizeof(struct btrfs_free_space_header)); - if (ret < 0) { - btrfs_release_path(path); - return ret; - } - - leaf =3D path->nodes[0]; - header =3D btrfs_item_ptr(leaf, path->slots[0], - struct btrfs_free_space_header); - memzero_extent_buffer(leaf, (unsigned long)header, sizeof(*header)); - btrfs_set_free_space_key(leaf, header, &disk_key); - btrfs_release_path(path); - - return 0; -} - -int create_free_space_inode(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path) -{ - int ret; - u64 ino; - - ret =3D btrfs_get_free_objectid(trans->fs_info->tree_root, &ino); - if (ret < 0) - return ret; - - return __create_free_space_inode(trans->fs_info->tree_root, trans, path, - ino, block_group->start); -} - /* * inode is an optional sink: if it is NULL, btrfs_remove_free_space_inode * handles lookup, otherwise it takes ownership and iputs the inode. @@ -292,7 +220,6 @@ int btrfs_remove_free_space_inode(struct btrfs_trans_ha= ndle *trans, } =20 int btrfs_truncate_free_space_cache(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, struct inode *vfs_inode) { struct btrfs_truncate_control control =3D { @@ -306,33 +233,6 @@ int btrfs_truncate_free_space_cache(struct btrfs_trans= _handle *trans, struct btrfs_root *root =3D inode->root; struct extent_state *cached_state =3D NULL; int ret =3D 0; - bool locked =3D false; - - if (block_group) { - BTRFS_PATH_AUTO_FREE(path); - - path =3D btrfs_alloc_path(); - if (!path) { - ret =3D -ENOMEM; - goto fail; - } - locked =3D true; - mutex_lock(&trans->transaction->cache_write_mutex); - if (!list_empty(&block_group->io_list)) { - list_del_init(&block_group->io_list); - - btrfs_wait_cache_io(trans, block_group, path); - btrfs_put_block_group(block_group); - } - - /* - * now that we've truncated the cache away, its no longer - * setup or written - */ - spin_lock(&block_group->lock); - block_group->disk_cache_state =3D BTRFS_DC_CLEAR; - spin_unlock(&block_group->lock); - } =20 btrfs_i_size_write(inode, 0); truncate_pagecache(vfs_inode, 0); @@ -356,8 +256,6 @@ int btrfs_truncate_free_space_cache(struct btrfs_trans_= handle *trans, ret =3D btrfs_update_inode(trans, inode); =20 fail: - if (locked) - mutex_unlock(&trans->transaction->cache_write_mutex); if (ret) btrfs_abort_transaction(trans, ret); =20 @@ -490,21 +388,6 @@ static int io_ctl_prepare_pages(struct btrfs_io_ctl *i= o_ctl, bool uptodate) return 0; } =20 -static void io_ctl_set_generation(struct btrfs_io_ctl *io_ctl, u64 generat= ion) -{ - io_ctl_map_page(io_ctl, 1); - - /* - * Skip the csum areas. If we don't check crcs then we just have a - * 64bit chunk at the front of the first page. - */ - io_ctl->cur +=3D (sizeof(u32) * io_ctl->num_pages); - io_ctl->size -=3D sizeof(u64) + (sizeof(u32) * io_ctl->num_pages); - - put_unaligned_le64(generation, io_ctl->cur); - io_ctl->cur +=3D sizeof(u64); -} - static int io_ctl_check_generation(struct btrfs_io_ctl *io_ctl, u64 genera= tion) { u64 cache_gen; @@ -528,23 +411,6 @@ static int io_ctl_check_generation(struct btrfs_io_ctl= *io_ctl, u64 generation) return 0; } =20 -static void io_ctl_set_crc(struct btrfs_io_ctl *io_ctl, int index) -{ - u32 *tmp; - u32 crc =3D ~(u32)0; - unsigned offset =3D 0; - - if (index =3D=3D 0) - offset =3D sizeof(u32) * io_ctl->num_pages; - - crc =3D crc32c(crc, io_ctl->orig + offset, PAGE_SIZE - offset); - btrfs_crc32c_final(crc, (u8 *)&crc); - io_ctl_unmap_page(io_ctl); - tmp =3D page_address(io_ctl->pages[0]); - tmp +=3D index; - *tmp =3D crc; -} - static int io_ctl_check_crc(struct btrfs_io_ctl *io_ctl, int index) { u32 *tmp, val; @@ -574,76 +440,6 @@ static int io_ctl_check_crc(struct btrfs_io_ctl *io_ct= l, int index) return 0; } =20 -static int io_ctl_add_entry(struct btrfs_io_ctl *io_ctl, u64 offset, u64 b= ytes, - void *bitmap) -{ - struct btrfs_free_space_entry *entry; - - if (!io_ctl->cur) - return -ENOSPC; - - entry =3D io_ctl->cur; - put_unaligned_le64(offset, &entry->offset); - put_unaligned_le64(bytes, &entry->bytes); - entry->type =3D (bitmap) ? BTRFS_FREE_SPACE_BITMAP : - BTRFS_FREE_SPACE_EXTENT; - io_ctl->cur +=3D sizeof(struct btrfs_free_space_entry); - io_ctl->size -=3D sizeof(struct btrfs_free_space_entry); - - if (io_ctl->size >=3D sizeof(struct btrfs_free_space_entry)) - return 0; - - io_ctl_set_crc(io_ctl, io_ctl->index - 1); - - /* No more pages to map */ - if (io_ctl->index >=3D io_ctl->num_pages) - return 0; - - /* map the next page */ - io_ctl_map_page(io_ctl, 1); - return 0; -} - -static int io_ctl_add_bitmap(struct btrfs_io_ctl *io_ctl, void *bitmap) -{ - if (!io_ctl->cur) - return -ENOSPC; - - /* - * If we aren't at the start of the current page, unmap this one and - * map the next one if there is any left. - */ - if (io_ctl->cur !=3D io_ctl->orig) { - io_ctl_set_crc(io_ctl, io_ctl->index - 1); - if (io_ctl->index >=3D io_ctl->num_pages) - return -ENOSPC; - io_ctl_map_page(io_ctl, 0); - } - - copy_page(io_ctl->cur, bitmap); - io_ctl_set_crc(io_ctl, io_ctl->index - 1); - if (io_ctl->index < io_ctl->num_pages) - io_ctl_map_page(io_ctl, 0); - return 0; -} - -static void io_ctl_zero_remaining_pages(struct btrfs_io_ctl *io_ctl) -{ - /* - * If we're not on the boundary we know we've modified the page and we - * need to crc the page. - */ - if (io_ctl->cur !=3D io_ctl->orig) - io_ctl_set_crc(io_ctl, io_ctl->index - 1); - else - io_ctl_unmap_page(io_ctl); - - while (io_ctl->index < io_ctl->num_pages) { - io_ctl_map_page(io_ctl, 1); - io_ctl_set_crc(io_ctl, io_ctl->index - 1); - } -} - static int io_ctl_read_entry(struct btrfs_io_ctl *io_ctl, struct btrfs_free_space *entry, u8 *type) { @@ -1065,490 +861,6 @@ int load_free_space_cache(struct btrfs_block_group *= block_group) return ret; } =20 -static noinline_for_stack -int write_cache_extent_entries(struct btrfs_io_ctl *io_ctl, - struct btrfs_block_group *block_group, - int *entries, int *bitmaps, - struct list_head *bitmap_list) -{ - int ret; - struct btrfs_free_space_ctl *ctl =3D block_group->free_space_ctl; - struct btrfs_free_cluster *cluster =3D NULL; - struct btrfs_free_cluster *cluster_locked =3D NULL; - struct rb_node *node =3D rb_first(&ctl->free_space_offset); - struct btrfs_trim_range *trim_entry; - - /* Get the cluster for this block_group if it exists */ - if (!list_empty(&block_group->cluster_list)) { - cluster =3D list_first_entry(&block_group->cluster_list, - struct btrfs_free_cluster, block_group_list); - } - - if (!node && cluster) { - cluster_locked =3D cluster; - spin_lock(&cluster_locked->lock); - node =3D rb_first(&cluster->root); - cluster =3D NULL; - } - - /* Write out the extent entries */ - while (node) { - struct btrfs_free_space *e; - - e =3D rb_entry(node, struct btrfs_free_space, offset_index); - *entries +=3D 1; - - ret =3D io_ctl_add_entry(io_ctl, e->offset, e->bytes, - e->bitmap); - if (ret) - goto fail; - - if (e->bitmap) { - list_add_tail(&e->list, bitmap_list); - *bitmaps +=3D 1; - } - node =3D rb_next(node); - if (!node && cluster) { - node =3D rb_first(&cluster->root); - cluster_locked =3D cluster; - spin_lock(&cluster_locked->lock); - cluster =3D NULL; - } - } - if (cluster_locked) { - spin_unlock(&cluster_locked->lock); - cluster_locked =3D NULL; - } - - /* - * Make sure we don't miss any range that was removed from our rbtree - * because trimming is running. Otherwise after a umount+mount (or crash - * after committing the transaction) we would leak free space and get - * an inconsistent free space cache report from fsck. - */ - list_for_each_entry(trim_entry, &ctl->trimming_ranges, list) { - ret =3D io_ctl_add_entry(io_ctl, trim_entry->start, - trim_entry->bytes, NULL); - if (ret) - goto fail; - *entries +=3D 1; - } - - return 0; -fail: - if (cluster_locked) - spin_unlock(&cluster_locked->lock); - return -ENOSPC; -} - -static noinline_for_stack int -update_cache_item(struct btrfs_trans_handle *trans, - struct btrfs_root *root, - struct inode *inode, - struct btrfs_path *path, u64 offset, - int entries, int bitmaps) -{ - struct btrfs_key key; - struct btrfs_free_space_header *header; - struct extent_buffer *leaf; - int ret; - - key.objectid =3D BTRFS_FREE_SPACE_OBJECTID; - key.type =3D 0; - key.offset =3D offset; - - ret =3D btrfs_search_slot(trans, root, &key, path, 0, 1); - if (ret < 0) { - btrfs_clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, inode->i_size - 1, - EXTENT_DELALLOC, NULL); - return ret; - } - leaf =3D path->nodes[0]; - if (ret > 0) { - struct btrfs_key found_key; - ASSERT(path->slots[0]); - path->slots[0]--; - btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); - if (found_key.objectid !=3D BTRFS_FREE_SPACE_OBJECTID || - found_key.offset !=3D offset) { - btrfs_clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, - inode->i_size - 1, EXTENT_DELALLOC, - NULL); - btrfs_release_path(path); - return -ENOENT; - } - } - - BTRFS_I(inode)->generation =3D trans->transid; - header =3D btrfs_item_ptr(leaf, path->slots[0], - struct btrfs_free_space_header); - btrfs_set_free_space_entries(leaf, header, entries); - btrfs_set_free_space_bitmaps(leaf, header, bitmaps); - btrfs_set_free_space_generation(leaf, header, trans->transid); - btrfs_release_path(path); - - return 0; -} - -static noinline_for_stack int write_pinned_extent_entries( - struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_io_ctl *io_ctl, - int *entries) -{ - u64 start, extent_start, extent_end, len; - const u64 block_group_end =3D btrfs_block_group_end(block_group); - struct extent_io_tree *unpin =3D NULL; - int ret; - - /* - * We want to add any pinned extents to our free space cache - * so we don't leak the space - * - * We shouldn't have switched the pinned extents yet so this is the - * right one - */ - unpin =3D &trans->transaction->pinned_extents; - - start =3D block_group->start; - - while (start < block_group_end) { - if (!btrfs_find_first_extent_bit(unpin, start, - &extent_start, &extent_end, - EXTENT_DIRTY, NULL)) - return 0; - - /* This pinned extent is out of our range */ - if (extent_start >=3D block_group_end) - return 0; - - extent_start =3D max(extent_start, start); - extent_end =3D min(block_group_end, extent_end + 1); - len =3D extent_end - extent_start; - - *entries +=3D 1; - ret =3D io_ctl_add_entry(io_ctl, extent_start, len, NULL); - if (ret) - return -ENOSPC; - - start =3D extent_end; - } - - return 0; -} - -static noinline_for_stack int -write_bitmap_entries(struct btrfs_io_ctl *io_ctl, struct list_head *bitmap= _list) -{ - struct btrfs_free_space *entry, *next; - int ret; - - /* Write out the bitmaps */ - list_for_each_entry_safe(entry, next, bitmap_list, list) { - ret =3D io_ctl_add_bitmap(io_ctl, entry->bitmap); - if (ret) - return -ENOSPC; - list_del_init(&entry->list); - } - - return 0; -} - -static int flush_dirty_cache(struct inode *inode) -{ - int ret; - - ret =3D btrfs_wait_ordered_range(BTRFS_I(inode), 0, (u64)-1); - if (ret) - btrfs_clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, inode->i_size - 1, - EXTENT_DELALLOC, NULL); - - return ret; -} - -static void noinline_for_stack -cleanup_bitmap_list(struct list_head *bitmap_list) -{ - struct btrfs_free_space *entry, *next; - - list_for_each_entry_safe(entry, next, bitmap_list, list) - list_del_init(&entry->list); -} - -static void noinline_for_stack -cleanup_write_cache_enospc(struct inode *inode, - struct btrfs_io_ctl *io_ctl, - struct extent_state **cached_state) -{ - io_ctl_drop_pages(io_ctl); - btrfs_unlock_extent(&BTRFS_I(inode)->io_tree, 0, i_size_read(inode) - 1, - cached_state); -} - -static int __btrfs_wait_cache_io(struct btrfs_root *root, - struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_io_ctl *io_ctl, - struct btrfs_path *path, u64 offset) -{ - int ret; - struct inode *inode =3D io_ctl->inode; - - if (!inode) - return 0; - - /* Flush the dirty pages in the cache file. */ - ret =3D flush_dirty_cache(inode); - if (ret) - goto out; - - /* Update the cache item to tell everyone this cache file is valid. */ - ret =3D update_cache_item(trans, root, inode, path, offset, - io_ctl->entries, io_ctl->bitmaps); -out: - if (ret) { - invalidate_inode_pages2(inode->i_mapping); - BTRFS_I(inode)->generation =3D 0; - if (block_group) - btrfs_debug(root->fs_info, - "failed to write free space cache for block group %llu error %d", - block_group->start, ret); - } - btrfs_update_inode(trans, BTRFS_I(inode)); - - if (block_group) { - /* the dirty list is protected by the dirty_bgs_lock */ - spin_lock(&trans->transaction->dirty_bgs_lock); - - /* the disk_cache_state is protected by the block group lock */ - spin_lock(&block_group->lock); - - /* - * only mark this as written if we didn't get put back on - * the dirty list while waiting for IO. Otherwise our - * cache state won't be right, and we won't get written again - */ - if (!ret && list_empty(&block_group->dirty_list)) - block_group->disk_cache_state =3D BTRFS_DC_WRITTEN; - else if (ret) - block_group->disk_cache_state =3D BTRFS_DC_ERROR; - - spin_unlock(&block_group->lock); - spin_unlock(&trans->transaction->dirty_bgs_lock); - io_ctl->inode =3D NULL; - iput(inode); - } - - return ret; - -} - -int btrfs_wait_cache_io(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path) -{ - return __btrfs_wait_cache_io(block_group->fs_info->tree_root, trans, - block_group, &block_group->io_ctl, - path, block_group->start); -} - -/* - * Write out cached info to an inode. - * - * @inode: freespace inode we are writing out - * @ctl: free space cache we are going to write out - * @block_group: block_group for this cache if it belongs to a block_group - * @io_ctl: holds context for the io - * @trans: the trans handle - * - * This function writes out a free space cache struct to disk for quick re= covery - * on mount. This will return 0 if it was successful in writing the cache= out, - * or an errno if it was not. - */ -static int __btrfs_write_out_cache(struct inode *inode, - struct btrfs_block_group *block_group, - struct btrfs_trans_handle *trans) -{ - struct btrfs_free_space_ctl *ctl =3D block_group->free_space_ctl; - struct btrfs_io_ctl *io_ctl =3D &block_group->io_ctl; - struct extent_state *cached_state =3D NULL; - LIST_HEAD(bitmap_list); - int entries =3D 0; - int bitmaps =3D 0; - int ret; - bool must_iput =3D false; - int i_size; - - if (!i_size_read(inode)) - return -EIO; - - WARN_ON(io_ctl->pages); - ret =3D io_ctl_init(io_ctl, inode, 1); - if (ret) - return ret; - - if (block_group->flags & BTRFS_BLOCK_GROUP_DATA) { - down_write(&block_group->data_rwsem); - spin_lock(&block_group->lock); - if (block_group->delalloc_bytes) { - block_group->disk_cache_state =3D BTRFS_DC_WRITTEN; - spin_unlock(&block_group->lock); - up_write(&block_group->data_rwsem); - BTRFS_I(inode)->generation =3D 0; - ret =3D 0; - must_iput =3D true; - goto out; - } - spin_unlock(&block_group->lock); - } - - /* Lock all pages first so we can lock the extent safely. */ - ret =3D io_ctl_prepare_pages(io_ctl, false); - if (ret) - goto out_unlock; - - btrfs_lock_extent(&BTRFS_I(inode)->io_tree, 0, i_size_read(inode) - 1, - &cached_state); - - io_ctl_set_generation(io_ctl, trans->transid); - - mutex_lock(&ctl->cache_writeout_mutex); - /* Write out the extent entries in the free space cache */ - spin_lock(&ctl->tree_lock); - ret =3D write_cache_extent_entries(io_ctl, block_group, &entries, &bitmap= s, - &bitmap_list); - if (ret) - goto out_nospc_locked; - - /* - * Some spaces that are freed in the current transaction are pinned, - * they will be added into free space cache after the transaction is - * committed, we shouldn't lose them. - * - * If this changes while we are working we'll get added back to - * the dirty list and redo it. No locking needed - */ - ret =3D write_pinned_extent_entries(trans, block_group, io_ctl, &entries); - if (ret) - goto out_nospc_locked; - - /* - * At last, we write out all the bitmaps and keep cache_writeout_mutex - * locked while doing it because a concurrent trim can be manipulating - * or freeing the bitmap. - */ - ret =3D write_bitmap_entries(io_ctl, &bitmap_list); - spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); - if (ret) - goto out_nospc; - - /* Zero out the rest of the pages just to make sure */ - io_ctl_zero_remaining_pages(io_ctl); - - /* Everything is written out, now we dirty the pages in the file. */ - i_size =3D i_size_read(inode); - for (int i =3D 0; i < round_up(i_size, PAGE_SIZE) / PAGE_SIZE; i++) { - u64 dirty_start =3D i * PAGE_SIZE; - u64 dirty_len =3D min_t(u64, dirty_start + PAGE_SIZE, i_size) - dirty_st= art; - - ret =3D btrfs_dirty_folio(BTRFS_I(inode), page_folio(io_ctl->pages[i]), - dirty_start, dirty_len, &cached_state, false); - if (ret < 0) - goto out_nospc; - } - - if (block_group->flags & BTRFS_BLOCK_GROUP_DATA) - up_write(&block_group->data_rwsem); - /* - * Release the pages and unlock the extent, we will flush - * them out later - */ - io_ctl_drop_pages(io_ctl); - io_ctl_free(io_ctl); - - btrfs_unlock_extent(&BTRFS_I(inode)->io_tree, 0, i_size_read(inode) - 1, - &cached_state); - - /* - * at this point the pages are under IO and we're happy, - * The caller is responsible for waiting on them and updating - * the cache and the inode - */ - io_ctl->entries =3D entries; - io_ctl->bitmaps =3D bitmaps; - - ret =3D btrfs_fdatawrite_range(BTRFS_I(inode), 0, (u64)-1); - if (ret) - goto out; - - return 0; - -out_nospc_locked: - cleanup_bitmap_list(&bitmap_list); - spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); - -out_nospc: - cleanup_write_cache_enospc(inode, io_ctl, &cached_state); - -out_unlock: - if (block_group->flags & BTRFS_BLOCK_GROUP_DATA) - up_write(&block_group->data_rwsem); - -out: - io_ctl->inode =3D NULL; - io_ctl_free(io_ctl); - if (ret) { - invalidate_inode_pages2(inode->i_mapping); - BTRFS_I(inode)->generation =3D 0; - } - btrfs_update_inode(trans, BTRFS_I(inode)); - if (must_iput) - iput(inode); - return ret; -} - -int btrfs_write_out_cache(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path) -{ - struct btrfs_fs_info *fs_info =3D trans->fs_info; - struct inode *inode; - int ret =3D 0; - - spin_lock(&block_group->lock); - if (block_group->disk_cache_state < BTRFS_DC_SETUP) { - spin_unlock(&block_group->lock); - return 0; - } - spin_unlock(&block_group->lock); - - inode =3D lookup_free_space_inode(block_group, path); - if (IS_ERR(inode)) - return 0; - - ret =3D __btrfs_write_out_cache(inode, block_group, trans); - if (ret) { - btrfs_debug(fs_info, - "failed to write free space cache for block group %llu error %d", - block_group->start, ret); - spin_lock(&block_group->lock); - block_group->disk_cache_state =3D BTRFS_DC_ERROR; - spin_unlock(&block_group->lock); - - block_group->io_ctl.inode =3D NULL; - iput(inode); - } - - /* - * if ret =3D=3D 0 the caller is expected to call btrfs_wait_cache_io - * to wait for IO and put the inode - */ - - return ret; -} - static inline unsigned long offset_to_bit(u64 bitmap_start, u32 unit, u64 offset) { diff --git a/fs/btrfs/free-space-cache.h b/fs/btrfs/free-space-cache.h index 53fe8e293af1..2432f1783f47 100644 --- a/fs/btrfs/free-space-cache.h +++ b/fs/btrfs/free-space-cache.h @@ -105,23 +105,13 @@ int __init btrfs_free_space_init(void); void __cold btrfs_free_space_exit(void); struct inode *lookup_free_space_inode(struct btrfs_block_group *block_grou= p, struct btrfs_path *path); -int create_free_space_inode(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path); int btrfs_remove_free_space_inode(struct btrfs_trans_handle *trans, struct inode *inode, struct btrfs_block_group *block_group); =20 int btrfs_truncate_free_space_cache(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, struct inode *inode); int load_free_space_cache(struct btrfs_block_group *block_group); -int btrfs_wait_cache_io(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path); -int btrfs_write_out_cache(struct btrfs_trans_handle *trans, - struct btrfs_block_group *block_group, - struct btrfs_path *path); =20 void btrfs_init_free_space_ctl(struct btrfs_block_group *block_group, struct btrfs_free_space_ctl *ctl); diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 3668cbc7598e..9c395d075a65 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -9364,15 +9364,6 @@ int btrfs_prealloc_file_range(struct inode *inode, i= nt mode, NULL); } =20 -int btrfs_prealloc_file_range_trans(struct inode *inode, - struct btrfs_trans_handle *trans, int mode, - u64 start, u64 num_bytes, u64 min_size, - loff_t actual_len, u64 *alloc_hint) -{ - return __btrfs_prealloc_file_range(inode, mode, start, num_bytes, - min_size, actual_len, alloc_hint, trans); -} - /* * NOTE: in case you are adding MAY_EXEC check for directories: * we are marking them with IOP_FASTPERM_MAY_EXEC, allowing path lookup to diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index da54db75e7a9..630a7ad8f8e1 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -3357,7 +3357,7 @@ static int delete_block_group_cache(struct btrfs_bloc= k_group *block_group, goto out; } =20 - ret =3D btrfs_truncate_free_space_cache(trans, block_group, inode); + ret =3D btrfs_truncate_free_space_cache(trans, inode); =20 btrfs_end_transaction(trans); btrfs_btree_balance_dirty(fs_info); --=20 2.39.5 From nobody Fri Sep 25 03:20:30 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 6C4D21448E0 for ; Thu, 17 Sep 2026 04:00:33 +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=1789617635; cv=none; b=PgyXfaPufQTcXu4Py6ksgrx2BfkJcHSp3J3sIgztC5YGZP8I7QLFEH3/nIShk0pyzc7nyHdY/wLPSn9W6kPjtjODpDrGCJhYPR9OgNWhgTdbdV5HWH80yi86ZRXBvcxu+S9XWNVoQxN/npeG/kstOp9lHalURskm2WntpBJT1eE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617635; c=relaxed/simple; bh=iGFJQPlF6CMeAfd/wkpIJMW7sIb30bKSxGxikRSgXV4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O8DyTluD1z1+JsGrHVUC2X3cm7p+SzyfdVuMuV0uY6LFmbNMkHtL0rmCr8OQxOxryZVyVCiTqNVBYjSnyWnx39tE5vJb9QWlDYo1O/RRxBPYX6JQJgjSMS9x6++b8gaUS/lV8o9+L98FxAtaUMF99TS5vUXAdWiOAii3o+UBzFE= 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=HwK6lZKx; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=NzGBDZ+S; 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="HwK6lZKx"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="NzGBDZ+S" 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 68H2YdPC3509267 for ; Thu, 17 Sep 2026 00:00:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=2RAp SXs28qzhddSlvTelDQPBL0qNNmBMwObh+aSPR74=; b=HwK6lZKx7xzG7ipyNKEx 8sD0dojwkFUUco3h7XHl8vyFtEPWRoYlphXds40Qj8Av22uSm/jRn4B9MP5/RdUs M9c/3BdAfG7bD302HRr5QyYnl/gj1aS6WBzeYz1tuuugEUKKs0PlSR1pkhr3EMhU 3dK5eesgU8iZjbtsyt3zywxPMJHXPUkPoQsuJ2PZ4qaOSIRzT0/D3FxYunFwM40E 048nii5mCPB8e6CmEhiNIukmJXfQAWiEKT3B+GzGrdHfD+KPtZ4zhJZZqmltpyJI CCIFx2Dw8WDuT3mnqdzokHp7mkN55fhW9Y7SII8r5D37eESGr7Jp+CGa3WsB5509 5g== 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 4gr3swhcyf-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:32 -0400 (EDT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-9124b265371so3378726d6.0 for ; Wed, 16 Sep 2026 21:00:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617632; x=1790222432; 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=2RApSXs28qzhddSlvTelDQPBL0qNNmBMwObh+aSPR74=; b=NzGBDZ+SzEKoOd9gh6fhZRlrR+0QiUm65UxViD9/2+jeh1j0yJAPK3X6rgLpDTzCp/ xeIR8drZzuKYTaNVm7+bfgWAgAraywkNP3u3TpO8sDZ43jxHZkMwU/a61tFDshFUPQAa qx4kOnVqaf/ZIxAl8uVdr8BXsnf2MpjvzeJynDrjyBV8A3tZh2YFBIb048Sf4jUijhXx 5cL8aDpTBt3Vh5nYHrESzJiB3y1+dYxdlYij11itGGeirA/LDIEe7BAaAHfLZF2JbH2h SvRl8BuJIC20daNl0gQlSHdp5jeMVVoU4YeMPpNjQ76CMCTAKcfHB4cMjnvnSGWpzfxv zSHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617632; x=1790222432; 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=2RApSXs28qzhddSlvTelDQPBL0qNNmBMwObh+aSPR74=; b=UBpm/TFJq7xzeBfU5FqlXuxm6Xeenbj0BcrD2lNKpJj+y+i/fA8dkA2SnOa3bVCgNJ NUOV4E262O7BRVXzOsA+gHuS+Lk9G/sw7FeNPicFYRpTpqll2zh43vxT+924icec6j2u 3YqUtyuvccAMPrxLd0rRPwnv+u6YCB0V58Xy1umokFhDDWp7iBDpRgBXvzzk5qlkic4h 0M1lp4khrYIECHuEnj5RoxySEl8j68td+ji5BXxOlQ+I7xW3t7b0TW66Q5j+8rLBx8kh t74tDZKZNFFcZ3xhiPAYb/7n5TyT+nQd/+1Wy4igt6jCoAdyCQxuDhIa/Z1ImLd85p14 UxKw== X-Forwarded-Encrypted: i=1; AKwUvBxGAXSspovl4BlaDvAX96Yd9yjqp4T6SjRhd5rmqpTCI67RpqQysFLUIahOAsz50WexzwWfEApRyJuT/FY=@vger.kernel.org X-Gm-Message-State: AFuF++lgglMqWD9m5As3Mlxp3YA1Rc99kF3fErJLKNTp8SuaFME+Yv4R UrRgAQb53JG7wAkkR9qk6F5x9mNIyIjuYXymZTLSAgD1HfjNiZchxzYXSCCnuu50dKtNJQ97N6X BfEH1dss8bRajwut2GYdwU18f38FVe+NbY9zOVh0tbsscDvEOOPte1pS1E5UCwqf5JPcA/Q== X-Gm-Gg: AYBFou201wAhyw4GRyKp6qhP3yINhbmBTtIBm+++t+TSjCMIwWCImOaI00GnmBONK+K Mf1fMG5uSNskTwB18zC/EGJ9md1s3+3bwyTgIVDmFLJ8VjaDk8pnWFoMWx6oEdrGyYCBJs0O7cu uQ4+5Po21f8Pykal2q5lkXsga2pnEuy0IuPGwHI/+9V88GnHWEqHjKN78F8gk8Nl2aNoYDbL78B OjWy/7MH7vq8Ku8pmsZr1PMzcofaMzLhArzA+3OyolsbgmBJE5ixUM0DJ3rHXVR9K60fHbf+0Iq WU+/CiVQN36tPzCHBpN3rV3YVNJEkHhcApoq0u6haveRVhsdsvsFCIIstd27MFTI+y3L1I+BjX5 UfIldDuoc30yLm31I8Tcq8xIebUUN0ihJqjne/aJvXhphkQ== X-Received: by 2002:a05:6214:21ac:b0:8db:5f:c588 with SMTP id 6a1803df08f44-9123d708e65mr90275986d6.3.1789617631420; Wed, 16 Sep 2026 21:00:31 -0700 (PDT) X-Received: by 2002:a05:6214:21ac:b0:8db:5f:c588 with SMTP id 6a1803df08f44-9123d708e65mr90275496d6.3.1789617630916; Wed, 16 Sep 2026 21:00:30 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:29 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:01 -0400 Subject: [PATCH v3 05/17] btrfs: rename cache_write_mutex to dirty_bgs_update_mutex 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: <20260916-btrfs-remove-v1-space-cache-v3-5-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=9156; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=iGFJQPlF6CMeAfd/wkpIJMW7sIb30bKSxGxikRSgXV4=; b=Q3KS2QTzeic7HyvS3DPTTwTBluuIwlOmA8TYn1Qf+/Cjr6U1djgA14acC8F8YtkR0F6b/lx0r 3rAtZVpTxq1DvHH+L5ciWhFYyd8q3TQFdCEovCrPpMUvxgSKhn6FVjw X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-GUID: kucAid2ySmmX77FWRAgVxwZ_Rk_rRunT X-Proofpoint-ORIG-GUID: kucAid2ySmmX77FWRAgVxwZ_Rk_rRunT X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX6o04VUFhFX9G oWensPuOsSGa9py6CYgKFW+FMQvmbKO7Bacx4UilfMllgwzEfpMEW0+qXRGDiEYQlB1bdvWoudc 3ExUgJm4nrbMO0mtr+islfTeVfqueh7q8mFAmZvvMPJksVE1i0et X-Authority-Analysis: v=2.4 cv=ac30Dhot c=1 sm=1 tr=0 ts=6aab65e0 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=79PYxaXUQd1wl-QFWJnA:22 a=jjizJtb08lyoHivougYA:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfXzo2zekoJPfsP oojpwE/lBedF18PRFSX9rFtqz0ifkTiJ+sDMAqHeaTu8H8WQByr25k9qZytxMfeSsoqc2cJjHta mlGZ4ooblNZOheLgxg8XfSB7Wc1DhbPJov/hQXnCKrGbIxmQHefGyJ9WVeZ6xKdQXaA5qSN/3xj AlV8BHAbTRWA5JAU/1LwDW/Tj7XgRxsVBq3wmogRIXEjqSFgJyQlWDnG23lHZ+VMTZd5lB7DkuS Gj20EcYewyzEZEbfGoUinIIMFsg4URwpY+lRG2wJ3Jlj/EFxdHfXsO6OTayMPuKrWrbnIX3uA9M D3uLT036I3Ng4V8MEm1GlRVcxw/O/kHHyAA9zQYkOssyfzvJbrg4ZV8mEOPI7IpMI4G/vvda5an KIp3oUTzi8EMPZuu7yCaxkdC/jUTDTPrSvKtE6CPM4QtcPE3BBQOlaToFSDzZoYFu5YtMXCjRFw e5WW8dFxY+K+pBTCkLw== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 bulkscore=10 clxscore=1015 adultscore=0 lowpriorityscore=10 phishscore=0 impostorscore=10 spamscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 The v1 space cache writeout is gone, but the mutex is still needed. It keeps btrfs_remove_block_group() from deleting a block group item while btrfs_start_dirty_block_groups() is updating it outside the commit critical section. Rename it to reflect what it protects, and update the comments around the dirty block group writeout that still refer to the space cache. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/block-group.c | 46 +++++++++++++++++++++++++--------------------- fs/btrfs/transaction.c | 25 ++++++++++--------------- fs/btrfs/transaction.h | 8 ++++---- 3 files changed, 39 insertions(+), 40 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 5c2a57243de5..34f2cc0ef33b 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1196,7 +1196,11 @@ int btrfs_remove_block_group(struct btrfs_trans_hand= le *trans, =20 inode =3D lookup_free_space_inode(block_group, path); =20 - mutex_lock(&trans->transaction->cache_write_mutex); + /* + * Do not delete the block group item while + * btrfs_start_dirty_block_groups() is updating it. + */ + mutex_lock(&trans->transaction->dirty_bgs_update_mutex); spin_lock(&trans->transaction->dirty_bgs_lock); if (!list_empty(&block_group->dirty_list)) { list_del_init(&block_group->dirty_list); @@ -1204,7 +1208,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handl= e *trans, btrfs_put_block_group(block_group); } spin_unlock(&trans->transaction->dirty_bgs_lock); - mutex_unlock(&trans->transaction->cache_write_mutex); + mutex_unlock(&trans->transaction->dirty_bgs_update_mutex); =20 ret =3D btrfs_remove_free_space_inode(trans, inode, block_group); if (unlikely(ret)) { @@ -3353,15 +3357,15 @@ static int update_block_group_item(struct btrfs_tra= ns_handle *trans, } =20 /* - * Transaction commit does final block group cache writeback during a crit= ical + * Transaction commit does the final block group item updates during a cri= tical * section where nothing is allowed to change the FS. This is required in - * order for the cache to actually match the block group, but can introduc= e a + * order for the items to actually match the block groups, but can introdu= ce a * lot of latency into the commit. * - * So, btrfs_start_dirty_block_groups is here to kick off block group cach= e IO. - * There's a chance we'll have to redo some of it if the block group chang= es - * again during the commit, but it greatly reduces the commit latency by - * getting rid of the easy block groups while we're still allowing others = to + * So, btrfs_start_dirty_block_groups is here to update the block group it= ems + * early. There's a chance we'll have to redo some of it if the block gro= up + * changes again during the commit, but it greatly reduces the commit late= ncy + * by getting rid of the easy block groups while we're still allowing othe= rs to * join the commit. */ int btrfs_start_dirty_block_groups(struct btrfs_trans_handle *trans) @@ -3395,11 +3399,11 @@ 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 - * updating its item + * dirty_bgs_update_mutex is here only to save us from balance or + * automatic removal of empty block groups deleting this block group + * while we are updating its item */ - mutex_lock(&trans->transaction->cache_write_mutex); + mutex_lock(&trans->transaction->dirty_bgs_update_mutex); while (!list_empty(&dirty)) { bool drop_reserve =3D true; =20 @@ -3441,12 +3445,12 @@ int btrfs_start_dirty_block_groups(struct btrfs_tra= ns_handle *trans) if (drop_reserve) btrfs_dec_delayed_refs_rsv_bg_updates(fs_info); /* Avoid blocking other tasks for too long. */ - mutex_unlock(&trans->transaction->cache_write_mutex); + mutex_unlock(&trans->transaction->dirty_bgs_update_mutex); if (ret) goto out; - mutex_lock(&trans->transaction->cache_write_mutex); + mutex_lock(&trans->transaction->dirty_bgs_update_mutex); } - mutex_unlock(&trans->transaction->cache_write_mutex); + mutex_unlock(&trans->transaction->dirty_bgs_update_mutex); =20 /* * Go through delayed refs for all the stuff we've just kicked off @@ -3460,7 +3464,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 too (not just dirty_bgs_update_mutex). */ if (!list_empty(&dirty)) { spin_unlock(&cur_trans->dirty_bgs_lock); @@ -3556,10 +3560,10 @@ int btrfs_update_block_group(struct btrfs_trans_han= dle *trans, factor =3D btrfs_bg_type_to_factor(cache->flags); =20 /* - * If this block group has free space cache written out, we need to make - * sure to load it if we are removing space. This is because we need - * the unpinning stage to actually add the space back to the block group, - * otherwise we will leak space. + * Make sure the free space of this block group is loaded if we are + * removing space. This is because we need the unpinning stage to + * actually add the space back to the block group, otherwise we will + * leak space. */ if (!alloc && !btrfs_block_group_done(cache)) btrfs_cache_block_group(cache, true); @@ -3615,7 +3619,7 @@ int btrfs_update_block_group(struct btrfs_trans_handl= e *trans, /* * No longer have used bytes in this block group, queue it for deletion. * We do this after adding the block group to the dirty list to avoid - * races between cleaner kthread and space cache writeout. + * races between the cleaner kthread and the dirty block group writeout. */ if (!alloc && old_val =3D=3D 0) { if (!btrfs_test_opt(info, DISCARD_ASYNC)) diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 6a36d29406c3..6a7f33ac87f2 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -380,7 +380,7 @@ 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); + mutex_init(&cur_trans->dirty_bgs_update_mutex); spin_lock_init(&cur_trans->dirty_bgs_lock); INIT_LIST_HEAD(&cur_trans->deleted_bgs); spin_lock_init(&cur_trans->dropped_roots_lock); @@ -2268,18 +2268,16 @@ int btrfs_commit_transaction(struct btrfs_trans_han= dle *trans) if (!test_bit(BTRFS_TRANS_DIRTY_BG_RUN, &cur_trans->flags)) { bool run_it =3D false; =20 - /* this mutex is also taken before trying to set - * block groups readonly. We need to make sure - * that nobody has set a block group readonly - * after a extents from that block group have been - * allocated for cache files. btrfs_set_block_group_ro - * will wait for the transaction to commit if it - * finds BTRFS_TRANS_DIRTY_BG_RUN set. + /* + * This mutex is also taken before trying to set block groups + * readonly. btrfs_inc_block_group_ro() will wait for the + * transaction to commit if it finds BTRFS_TRANS_DIRTY_BG_RUN + * set. * * The BTRFS_TRANS_DIRTY_BG_RUN flag is also used to make sure - * only one process starts all the block group IO. It wouldn't - * hurt to have more than one go through, but there's no - * real advantage to it either. + * only one process starts all the block group item updates. It + * wouldn't hurt to have more than one go through, but there's + * no real advantage to it either. */ mutex_lock(&fs_info->ro_block_group_mutex); if (!test_and_set_bit(BTRFS_TRANS_DIRTY_BG_RUN, @@ -2513,10 +2511,7 @@ int btrfs_commit_transaction(struct btrfs_trans_hand= le *trans) if (unlikely(ret)) goto unlock_reloc; =20 - /* - * The tasks which save the space cache and inode cache may also - * update ->aborted, check it. - */ + /* Other tasks may also have updated ->aborted, check it. */ if (TRANS_ABORTED(cur_trans)) { ret =3D cur_trans->aborted; goto unlock_reloc; diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 8245a58587c0..33a1884c5765 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -81,11 +81,11 @@ struct btrfs_transaction { 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 + * We need to make sure block group deletion doesn't race with the + * dirty block group item updates done outside the commit critical + * section. This mutex keeps them from stomping on each other. */ - struct mutex cache_write_mutex; + struct mutex dirty_bgs_update_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 03:20:30 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 60071371867 for ; Thu, 17 Sep 2026 04:00:34 +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=1789617635; cv=none; b=HXkg0lhqtwEqMq1ZUPYPNx2ANa1gfMqDi98mXicNS4eDDC+bvz9nVwrBaq4k9FrtKosLdKJDDOkeHbraTPMNS3D8oEiVGLfcP2mRh8DaeGMwXkc1pwHcrJ34aYT3BNifgr7y2OdWEBPVffBV2Q1N/q6FtSBrfNJgpnrLQGu+smM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617635; c=relaxed/simple; bh=7Tr5awOvN8ARMx50qRV4E1m+atUWaPqTPP3CIfJTWL0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TuBgls8RRHfW/AG9Vns+ybGDQU++vTSoO8U8dIXwDbxvAH/UCBQG4crEg/0kaAabZNqFSwMgCNxtT+eF/1hu7f58Qe9UtZ1+aJ81TbXoZDBNCGR9z4H88ojzvKcGv6653ErAAWCx/DA9B4gWABgLFMQL3qmnIro+GbXAUKMobQA= 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=enb1oKtd; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=HXdfxYaa; 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="enb1oKtd"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="HXdfxYaa" 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 68H2YfgG2036083 for ; Thu, 17 Sep 2026 00:00:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=IRD4 cvB/PgbqUg8e65DYvGtkTJfIxTG28U1epEHrg/Y=; b=enb1oKtdejsWm4oGJmmV tDZmCyDkK5dg1iL6Mn2NTo/hvzs7b1fHSN6+FDQpx/gbdu+STHyy13RZcxauQR4B xNNzboNXl3VPY/1Fog9HhMCBXz2DY7TyDwzKFtUr+t+hw4lexKHOzqX8N2FqiURo KL4VhxB8U/xiaXRwUwB6jB3FMLzmhAEJd3cmA5zboo/XyzokdStw1q+vipwj+vuQ RyZ7biqRch00A2z4ZbwNLh0FiMsgif5daUc7ZObX/3//H9965o7P/JzjUv4OIEY3 LXEhHeudsGd6Kn85f9aHdlMSUCaFglXIbK1UvuseZawf1mMxrsyTWBRaSBS5eiEi Jg== 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 4gr3tv1ck7-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:33 -0400 (EDT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-90e8135d7eeso6520516d6.1 for ; Wed, 16 Sep 2026 21:00:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617632; x=1790222432; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=IRD4cvB/PgbqUg8e65DYvGtkTJfIxTG28U1epEHrg/Y=; b=HXdfxYaan0MJdMcvQ5RKpt5pEt6qsStSYqzFTM4CAEYzSiDAJQlkKxLk7z3ehaUReU /qEvGR5lKXKlOAYbXQhc+5aBEcP/FQom7Y/TAlLZc2uQhu5JD1gxY93XGlL3n1ZuxBSO Y4nfhbiZmtzCuZH6ZQe4ha+sF3j/uTc+A3ySgVRdwOcFqBXD8U/JthxoWrdQ7i0UbLuo 5EgkdczIRGG3vjS9xORK9OiFsyfLudoMDXbL9EPeU0im6v3ORQaZpBPQ+sT6Ko5Mxbgp uCnqymxPVU8nqj+TrZRb7cBh6XHEWVIKQIFllvT+J8Cob0IuNHWW4JcMZaTdXKdGWk87 c4Mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617632; x=1790222432; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=IRD4cvB/PgbqUg8e65DYvGtkTJfIxTG28U1epEHrg/Y=; b=QMs+nwfVhqouwR7oYXvc+BPGjegAHrxsTbZCwpTL4xAkc6/l/+ZwTddcFjWwKvkk13 4HFOpLwDvi8h3/B7qYP9uq9a5r7HqUp9alLho+DuNHZXteibDIpwFrNSCXpUk3BitVBN of3gx697RRy1KJIstOnACTCjJdgYCrhHGFIMSaYCSTw6TWEB9Tv80HJeF5x0ab+H16gI CbrNTHokGBa/Bk1w156S8jCkcxmbp5k0P+vVW1WgK11PSEfFaLREacp5Jfqii0JKnfcI VgNGYqeo0u0gDhULbkNZCTF0Wp2Z0Z7+iTejScbK2y5xzfz5SAiZe3W0XOUpTxkqf8WS 6Pag== X-Forwarded-Encrypted: i=1; AKwUvBypJPfeVrYgsb0tM+DL8uumtVcdFq/4MCVKK4QCExbkClzjJmg6pmVkyqHGUa7eFK2uNy5s/7V0Xlq6rYE=@vger.kernel.org X-Gm-Message-State: AFuF++nbP4s+n/upebQ58sSpJtkp9x50Ear5akMWGXsJJkccI5z9d2LM /brZYpbMIbnIQmW6+NeZk6OJrSVGBN+TyRS2gRielVIzG1WzD4OOaiGG20g+V3MXpcEa0MQ4enb JnYp6wZEVVRL0kN975++zGv7n/J4C0OVaIbXngIZUo0wMrjtJOxUFX8DXEzSkFjINmCNwpQ== X-Gm-Gg: AYBFou3nnvaGXA6Lg0IvvKuvqWiVjfWCgtMafVIxcOYNUBVeDIt4vBy7TV2ClvnG7IK pjKtHvo3ZWW/GwzrpDNNLoET0HfbaclvNvkiFfoV9KB1ZozLbLDwGEkAvH9LrqhXj5YrNYd+Ziy j6Qhf1iRffOW9VaeS8gpuPblu4jWv7rquv6hqPRHKEkS8JektgjdptlfcGFUY7UYEHWi1qFE7rC pPfXCah/Ik7ENlhgcAUzPvt5r+FgT1iOAIATFh/r7WAoCkMDnHAbxzJo1KaNYnYjJmD8u2qnp4k FoHNkiE9aq2RaqlJBizarYoYcUnuudtS0/iiFURS1+RnUbarg4Yr8ivMJdJtgk9ejJVhKPaDZyo MZXEEV7+IJygOwjWpu6MGlW5ohsh1MtAFrYEZ1NiS/ahM7A== X-Received: by 2002:a05:6214:cc8:b0:90e:94e5:79f8 with SMTP id 6a1803df08f44-9123d79e028mr93938326d6.23.1789617632352; Wed, 16 Sep 2026 21:00:32 -0700 (PDT) X-Received: by 2002:a05:6214:cc8:b0:90e:94e5:79f8 with SMTP id 6a1803df08f44-9123d79e028mr93937876d6.23.1789617631902; Wed, 16 Sep 2026 21:00:31 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:31 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:02 -0400 Subject: [PATCH v3 06/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-6-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=4704; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=7Tr5awOvN8ARMx50qRV4E1m+atUWaPqTPP3CIfJTWL0=; b=+YvhKl5q/F2DKSGYcyHuAT9L87K2gWETNb02lNR67EmJD5+t3w2goWZT2rXbNbn2DLYHFoZmi 6q+bfXlV7UIAQDhajcMNkL672rJkZOoLIewDTOhWDpTYTH0wqCfz++c X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX+9mg1mK0Fzc9 bcRp2lf9y7/ggdUO/RdB8o2iDG28zRoB/pmurimoe/OyNbr1ryJ1pGOfKKkJhNIbBygJCXpW5So 16XU16BsE3Cc0ekaHocTqHFm2TwgVi14wfzTR8o5OgdISVO6tR/idMHrUBWJDOaTzrzD8kSh4bp le5hNhEm5xsx0dfAdC2EaiZTudztoCX04GREvk8BcNtM1C5FVtSKp2ueZ2W8dh21BwugB3eEnHc HPeyp92Tw2MpEix5q+OVvDIxPkNsFtapx/7fid9yZ8KnGpvIEngryyZnGx5cPIECvMM/XSuFkYR fLFbMppLmfXHqrUtABHJLu/6jqzuolps2h4mii4zDUXs4FQTaw7v25szFeIzdX1ICJglG5qxr8C CEF7l84eEkHKRZOsMp8vfqf9Xp6Q9ipV8vhKVo09RVKCtxuakIddpCLJ5SwkeB+AfHOc64PrLiG uj0E5TEqOjxRvyTvtLw== X-Proofpoint-GUID: 259VvP9kM-oo6D0z_iQ6cCze0nwQO6ib X-Proofpoint-ORIG-GUID: 259VvP9kM-oo6D0z_iQ6cCze0nwQO6ib X-Authority-Analysis: v=2.4 cv=JIeuIMKb c=1 sm=1 tr=0 ts=6aab65e1 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=u1qPvHribVpbYRjuRIMA:9 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX/S3fg+YNqvOG 22RVdQpJ0aV3zGsdjc3begjeKyk6NAymdn/6u5DQe7lmWL9wyELFgMjQAslp1Q3Mg6fzK7qgHvW 2Xm2pZk8WtXhtmv4wgAsyLqzsCJRCHO1rS63mZbIQKxsbooL2vgQ X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 adultscore=0 lowpriorityscore=10 suspectscore=0 malwarescore=0 clxscore=1015 spamscore=0 bulkscore=10 priorityscore=1501 impostorscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 The v1 space cache created its inode during the transaction commit, and btrfs_prealloc_file_range_trans() existed so that preallocation could reuse the open handle. It was the only caller passing a transaction, so __btrfs_prealloc_file_range() and insert_prealloc_file_extent() now always start their own. Fold the wrapper into btrfs_prealloc_file_range() and drop the parameter. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/inode.c | 47 ++++++++++------------------------------------- 1 file changed, 10 insertions(+), 37 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 9c395d075a65..0539f27776e1 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -9132,14 +9132,13 @@ static int btrfs_symlink(struct mnt_idmap *idmap, s= truct inode *dir, } =20 static struct btrfs_trans_handle *insert_prealloc_file_extent( - struct btrfs_trans_handle *trans_in, struct btrfs_inode *inode, struct btrfs_key *ins, u64 file_offset) { struct btrfs_file_extent_item stack_fi; struct btrfs_replace_extent_info extent_info; - struct btrfs_trans_handle *trans =3D trans_in; + struct btrfs_trans_handle *trans; struct btrfs_path *path; u64 start =3D ins->objectid; u64 len =3D ins->offset; @@ -9160,15 +9159,6 @@ static struct btrfs_trans_handle *insert_prealloc_fi= le_extent( if (ret < 0) return ERR_PTR(ret); =20 - if (trans) { - ret =3D insert_reserved_file_extent(trans, inode, - file_offset, &stack_fi, - true, qgroup_released); - if (ret) - goto free_qgroup; - return trans; - } - extent_info.disk_offset =3D start; extent_info.disk_len =3D len; extent_info.data_offset =3D 0; @@ -9208,12 +9198,12 @@ static struct btrfs_trans_handle *insert_prealloc_f= ile_extent( return ERR_PTR(ret); } =20 -static int __btrfs_prealloc_file_range(struct inode *inode, int mode, - u64 start, u64 num_bytes, u64 min_size, - loff_t actual_len, u64 *alloc_hint, - struct btrfs_trans_handle *trans) +int btrfs_prealloc_file_range(struct inode *inode, int mode, + u64 start, u64 num_bytes, u64 min_size, + loff_t actual_len, u64 *alloc_hint) { struct btrfs_fs_info *fs_info =3D inode_to_fs_info(inode); + struct btrfs_trans_handle *trans; struct extent_map *em; struct btrfs_root *root =3D BTRFS_I(inode)->root; struct btrfs_key ins; @@ -9223,11 +9213,8 @@ static int __btrfs_prealloc_file_range(struct inode = *inode, int mode, u64 cur_bytes; u64 last_alloc =3D (u64)-1; int ret =3D 0; - bool own_trans =3D true; u64 end =3D start + num_bytes - 1; =20 - if (trans) - own_trans =3D false; while (num_bytes > 0) { cur_bytes =3D min_t(u64, num_bytes, SZ_256M); cur_bytes =3D max(cur_bytes, min_size); @@ -9253,8 +9240,8 @@ static int __btrfs_prealloc_file_range(struct inode *= inode, int mode, clear_offset +=3D ins.offset; =20 last_alloc =3D ins.offset; - trans =3D insert_prealloc_file_extent(trans, BTRFS_I(inode), - &ins, cur_offset); + trans =3D insert_prealloc_file_extent(BTRFS_I(inode), &ins, + cur_offset); /* * Now that we inserted the prealloc extent we can finally * decrement the number of reservations in the block group. @@ -9326,8 +9313,7 @@ static int __btrfs_prealloc_file_range(struct inode *= inode, int mode, range_start, range_end - range_start); if (ret) { btrfs_abort_transaction(trans, ret); - if (own_trans) - btrfs_end_transaction(trans); + btrfs_end_transaction(trans); break; } =20 @@ -9339,15 +9325,11 @@ static int __btrfs_prealloc_file_range(struct inode= *inode, int mode, =20 if (unlikely(ret)) { btrfs_abort_transaction(trans, ret); - if (own_trans) - btrfs_end_transaction(trans); + btrfs_end_transaction(trans); break; } =20 - if (own_trans) { - btrfs_end_transaction(trans); - trans =3D NULL; - } + btrfs_end_transaction(trans); } if (clear_offset < end) btrfs_free_reserved_data_space(BTRFS_I(inode), NULL, clear_offset, @@ -9355,15 +9337,6 @@ static int __btrfs_prealloc_file_range(struct inode = *inode, int mode, return ret; } =20 -int btrfs_prealloc_file_range(struct inode *inode, int mode, - u64 start, u64 num_bytes, u64 min_size, - loff_t actual_len, u64 *alloc_hint) -{ - return __btrfs_prealloc_file_range(inode, mode, start, num_bytes, - min_size, actual_len, alloc_hint, - NULL); -} - /* * NOTE: in case you are adding MAY_EXEC check for directories: * we are marking them with IOP_FASTPERM_MAY_EXEC, allowing path lookup to --=20 2.39.5 From nobody Fri Sep 25 03:20:30 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 2CE0C3BB13D for ; Thu, 17 Sep 2026 04:00:36 +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=1789617644; cv=none; b=O+hNmQLoYULHWCXunermzxsBddZ4X/GdKt4yxZWs89Xj+C3Sy65/HzTDeEFPyLo5FuXWdb6w6ObAdBXti3PUHkZHWD/bpVYt7v4cUvz7h2v9WF0loAGppczRwUJEMoKMFpnSJUi53K/lJUWLToD+c2NvnJmJfPN0vkYOyauXl5A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617644; c=relaxed/simple; bh=8CtEBdvPVtP6J6XtCpLhCy8mE7AjMZnAXcRzFF5MC6I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VID4UHrT/WEX1uci+mHUrQ43AjXxwom1gRihw62ACC+f31K8v4HYC66EJVgWSZceG1gQ0nGQ9jCvNQmY8s51oDf+91z0AE2oy9w+9Z3SNNzWt93YCLXrbGyq/wjof0WAys5Y6HADV2CEVQ9AwaMEDUgM0EZOuSz4cChXtvTqPd8= 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=qHbL5/HY; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=SSMmlrkn; 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="qHbL5/HY"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="SSMmlrkn" Received: from pps.filterd (m0167068.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68H2YHKI2861916 for ; Thu, 17 Sep 2026 00:00:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=4ZsU 5q6arOxqkMnS60E24xhbyZscST8U0/pja0/2bHY=; b=qHbL5/HYAT9vyuBDKtzt /x2V7P5jfZXtC9BAqQtgfGjIeaxnUaWwfr1UXyutchJvGsv25saIzpleuHdfALGD l7Z0tDr7yCIr0pXCiYzdKYWx7B8ZAESMRxfhRRW39dOHfMkUj5q6O3yPEMEVrwzL UmuSVGPlDqGcEdtFD10ugHkQNCgx2cXYPBTB9Z3sJ7W5XKFbKO5Usvdfp0yxt/5l aVDaMVk67qs7FjNDvfcc98SOSCoFSYWKL9t4VyXJ7B+FR42Ve3a3FnYOb9srrrKv NDebd6KDJ5InRWEUIdBdhrW9veuKPPCjjld8zKmA71JAmeDSR0gXnJr9Z8qfioky Vg== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gr37v1ngj-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:35 -0400 (EDT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-9104eedb5b0so6886526d6.0 for ; Wed, 16 Sep 2026 21:00:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617634; x=1790222434; 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=4ZsU5q6arOxqkMnS60E24xhbyZscST8U0/pja0/2bHY=; b=SSMmlrknUGsC+8LYGnuhx/2XmKvi+btL7VnpQ5jL54YizcJFb7URTXegAQPq2MlLN7 G77m/H+Eu8jSu0/oMIkLGp8bW9BiTMV0atV9QCyWu78DqmpGsLlpt2tyLCAvyAoZNQi6 Qq7OlsbDGQPS9xMI8jtXp6pm9kB967/e9oGQ7nOvAnadPNyEPzdZIpIsgeTjox6EX23T 12t2XM0Wxa6RX+oHXpD7zMW3YRnnMi2mlXDxwh4cJqMV7vl6q/mAaYIyOQlbeIUy2aqW x+SXTSh+reamYaJK276VfVxI65tncu9oRGMP0et7dw6mTeb0w3SMjisouQsrIGVMMaiT R2TQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617634; x=1790222434; 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=4ZsU5q6arOxqkMnS60E24xhbyZscST8U0/pja0/2bHY=; b=KiZhnvm8EIuHID4KjO34G8ie4rw9JXD9Kwuj3KmD6+CVBcKFLFKiv/QYdO61f8kl/f rNokdGCDQAWFj8CgNVpLtuLnhLdWvzQ2DIDXXTX9TvaJjx8w8+TlevYkyow9oCibHIje oI1SbE5nXsiwHe34IkwjNDtGMIeRk3wd9VTVQfuVmok7adbB4YY3R4H24KNq8r3riwmG qHY8KQpke6wpKNdLhHxKWnXD+YGJhz+sej9IHiaZdVRQJiHH2XmfRM56HtGmWmBeater g/sGhh+do1pTdw8xO3bHgUVuZ2i9MTmO3CVCzyZ5Z/kTU0k52/WsIPrma5ATe9WEU1nm 2xQw== X-Forwarded-Encrypted: i=1; AKwUvBzJln42XaU/jV6UhuzYvVe3OYvdKybGcfpBjvvGuTfrnDW0x3DMd8y0zUX6Z00809rtZvEfE6gDkP8b3uo=@vger.kernel.org X-Gm-Message-State: AFuF++kYGpwpoQP3WSZnCl5EvOGlQ26r+e3OHRjii/v6kgrGCJ0yPOnM rEKwL2smDIw7hS8brEcwfU+kJM/XG/iLrKQZPeHqye0nWkdRJEm+27zLIajUmIMn5TjH7HOnvp6 qNUXYzl99MMIp+FPefsphXzyFP5VJIz9euTrj0u+o2gZ2O2630+PDbLK8xOjxO3C9XvHG/A== X-Gm-Gg: AYBFou3D8d4T0CWaWLPotmBfLHMpETTUGAzi0QOuYDnRo21qKHztOf7LiUUqS8W4NN1 WWRA0dPqTkvuTJotzeHvWtHEMQPxKRPVntvcHyuD621tPMUwJKIVoxo3vYJlYj+PyioF7EVYA2S FKCLxIlvEvFeK7BEEjNgjkzDDiuZJ9fO4Z+OuXOhWyM06CMt1AKrsCaBuC7UBua4k37bfqxqjRQ RVyrW+KvGVmDfChwBTxEJPuafDpEYiiBgipUZuQTHEr9lHMz5Ecybd5sDcG2JX3nIwtOIiON4dI sLfjZRhxm1Jpeo3r7Ht/meuCWpRAAhbs+h66o7eE9lI3Y+FJ4pVdo4gKvxdZ5L3M+EB3k56JJ7Y IK24GCYeuLQuI6R6hNxu9nNoyKfODebrGDbHrb8yCECYqrg== X-Received: by 2002:a05:622a:1347:b0:530:f3f7:ca18 with SMTP id d75a77b69052e-5327f1af812mr89181461cf.57.1789617634372; Wed, 16 Sep 2026 21:00:34 -0700 (PDT) X-Received: by 2002:a05:622a:1347:b0:530:f3f7:ca18 with SMTP id d75a77b69052e-5327f1af812mr89180861cf.57.1789617633807; Wed, 16 Sep 2026 21:00:33 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:32 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:03 -0400 Subject: [PATCH v3 07/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-7-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=20021; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=8CtEBdvPVtP6J6XtCpLhCy8mE7AjMZnAXcRzFF5MC6I=; b=TqBHvROJqM6XNFsxngoXT3yO/p3PH/oUhO2+6FWEuwjsqoKUiXiFizxGZMovbZrBal154kVQ1 CesPJXlGHNxDJoVG4aVl3BD2B0hnyOkBPvAOrQ4I8WGA9iY9Wn75k2g X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=TMvQ2Fla c=1 sm=1 tr=0 ts=6aab65e3 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=usPcmh10W0ubT8QP8_c3:22 a=P5Dk6VCOSKDVTHAqsQAA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-ORIG-GUID: _a6ir2dQ7dnNAsNWNOA43nJXj2ExQ0fG X-Proofpoint-GUID: _a6ir2dQ7dnNAsNWNOA43nJXj2ExQ0fG X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX62D+oPILzA7f J3oE5aEHMrCRUzf32hzmDt+yxUJcMOqeXIF2hPDAR21hIPf/Hx6SPnTybKv+Ln4ovc72mUKWQNV 8KrkrFfDXcf9MIJVMPZG3jSb24K9SOndovpTSTCmWup7JCrx8f00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX0gXLukqEtTRO v73valSp6n9uDuuIPswKrhQ12pR7WaI39jZ1z0tOUcRsH8F0UtR5l3KdAnQVIGRQIJVfLVvszpj Z1UrzwVnN7wv0X/BmWODrxd4fE34gXPIzpiA3WSf9NatSWIqnHSsU7lbTnSE766drLgmB73P6Jx qDE5imWku/PzlxLMOGE1iMiNxaPq97SrSdkrQJjctzU65HMtZcOvuGu71eoK8Z4OpKE6RRRg4nE gLipk1R/wm8BjBABAbzOAe1e7VdmKvIAu9DPOQffFdhvPkDxCE+CQ7lhN8HiV9h8mMW1fM92VCx Ltnln+EswP2VSPG+GoifmFplNg7D7xPgD22YjypB1ixbned/PcW9gPZpvYmHKikqbmqiUYUiMqH LoVNsRWlmSYM44pgjMIeQNsRTGpO+3IVQ++4joTPfgPsk2g7xgdTlIK3wdbxQvD8nCF1uULEjHz vpbTs1y+3UKaQ3Liwhg== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=10 spamscore=0 adultscore=0 phishscore=0 clxscore=1015 malwarescore=0 bulkscore=10 suspectscore=0 priorityscore=1501 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 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 34f2cc0ef33b..972909b52a39 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 03:20:30 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 F1A623BBFAD for ; Thu, 17 Sep 2026 04:00:37 +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=1789617641; cv=none; b=VTV3in2+aHLCQIGGf0NANvV5c7oMbKeoEdRj87hUtC25BscKiSG1pxiLYPGq6NwtczNtclXoIRbuctGWtYGsW2IJrbNb8k1uTop8mLCgF0AhnQt2xkRYBnx/ka9ConfTC+sHqF7uuvmqAoyzuDNpkQcUoSMlmUNM+rd//OII97g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617641; c=relaxed/simple; bh=rulmlM26V12Eg+K7SQZ/FyXPG7ub2C5fYZrfS5dFjSk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LLPn6J8Ig6GwKVEhjUXE7ApCngp6wj2qL3Zdrw5T18TvzPND2uK57j8u/GLkryoxDZOybq0qBPGzT1CgTif8mhk3f9gW5XSyz9pbW7GyjB+Jsdx5MKVh5TM5cMO8RJt6RYeK8RSzEuJ+Fp8hGapcE8tKNI0UW43f9wWdcF5ZEsM= 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=N4PX21j2; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=tjvWHdBq; 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="N4PX21j2"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="tjvWHdBq" 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 68H2YgHI3509288 for ; Thu, 17 Sep 2026 00:00:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=OnlL M7eRN8QFBco+RjUrDttkRnm/OziXiXr6FMqlxo4=; b=N4PX21j2obYubWrVPPsB zuABRW6ufw2idxmjZtHD29kJjwn8Da3/iy2SvDqVRV2WkBPrgdadEiTwgpx62428 8px7Csylle//FJnadPCM7y85oAWuCAFFVUzzGhM2jEIngF3MuO5gT4Fa37locJOW 8X9Ic5M9FoVHdHPhgVmUWBsEOyJ2XcdND92/+OgEFLim5j6zobLh4TKMMAVCNxxt 40iSN+pSZqIwV3X/FqLfWzeo1NDZh7bth7AfW5OQtpSPDnNR1XVWHnRsgCQZln9i y34owBuKr/MFLyTMH+XvVIJZ1ztnTabzgjllnJyVX5dL8r+1oMfsXBGElB7ICtJk 0Q== 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 4gr3swhcys-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:36 -0400 (EDT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-90e8472ee1eso7683366d6.0 for ; Wed, 16 Sep 2026 21:00:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617635; x=1790222435; 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=OnlLM7eRN8QFBco+RjUrDttkRnm/OziXiXr6FMqlxo4=; b=tjvWHdBqwNxDij/8D2hZ1P36ZkEug1Zrhkd3cWMIRP8YeEQB7MUQug5XpuQMcL7FzN x6eCKINB8FrTiLx+rRAgcq6FMX2m36par2loW2TBwbKOmLrLkQ7FRyWdsuOUQhfQZ6CT sIcviMNgJkOA//86/RrVcnBjuX4uK26nVsInv+oNa05P/IiafG28D8gjQvNRy8N1zc4R WXObn1/+hTOofBe39dLSxlAv+qS2d94k2cH09hILyzWRWk3i0piq4qhXa6gZcEd5nOpe L0KvA3u+OfzNq3vGKxjYjgaytydBBeQ2nWZwcX21XpGnngEGRduX/vp7OjqRT//rWawW mCaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617635; x=1790222435; 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=OnlLM7eRN8QFBco+RjUrDttkRnm/OziXiXr6FMqlxo4=; b=z60x3Pu2etdoOly3YBDTBs+SYixrGTcFiFSdwiz+EOfQLRTVPGcNvJAK3ANdu1jonL 0mS/2b/XkNxqj5MGlMYkohNyMDYDwUnePOj5HTKtYNTnuylEwcaVqCBC/KZJ/6V4zKQy IundsrYg14vWBXyr35xas6pQfQ2bOWh49c3dpwcRARNEVcvpt6FMG32lcurXEXdFQ5yE 9z9XMqJQhYfe+6fBh2H6mz3c6wYf4pG9xjP1TSKmCDQ2DiOTrksontK3+jgXaJTI86eT aHFsgpCVdfwlL/OrpJU2o5+rTaS3pNZco9qfdwzkrsEWIQOtIN7pD+FYq0xoQH0HXscb cAiQ== X-Forwarded-Encrypted: i=1; AKwUvBzD/V290uCbKAR1cME0JRdSrwSqS6A9NVDSp32yMeEfqwnwvdVkM1o+5U0sVOJVHy4bGTBy/ntjBsLd39U=@vger.kernel.org X-Gm-Message-State: AFuF++nO0msmPtRUVcaJXlWm72mKmubMl6AlJi5ccZP6XVWzVrfPiTlW jiUmpUvFyX2xWWNMtt8GQ/NByOoBCxmKjiZfM2yCONViNRrmw3Nk+w3yYK9z7I4Jd6xdUOUAbWb g8rz5W1JaQUtJ8bm4o+Dgn704m2aSKWqw0OABmr9F5i9VycrtYjS3yKySdQHyNb3AOsYuyA== X-Gm-Gg: AYBFou3DeJwpm2+3xygDvTg9+t9QQJSC3TghzVLCXUMVaPOhK88BNmwp2lp6FJbwO+l /ksg8eHBHNmc6CWyiloKQ/6jf2gzWjw8v5gw7oWDDicJvsFF5ngJAqqt8fj9l7WugLjpeB5s2G/ pm6mAmsToX38BD/D+lkFmNTk7tLOhr3jkRx/Fn5/iNNgoKYh5+7hvxbG2nWqDNkf6oM2iXtPvqk ItJkaJamxXR81I1RYds32IufzZoLCu4ku9uXfpCUasUaIaBFtwR1oHG2rlIpoQkIG24etDBghYX h+nAZmuBjbMOR1RP06bRi5+SpXV5dMqxft7jRP7f3FWFfJMDe/AEIFYUKSUBeXHG5e2Oo/VTSO0 fcIrsJwfz77G+f5NC9ltBoeG6YaD1/hB37HE+4URU2RNpzg== X-Received: by 2002:a05:6214:5d05:b0:912:127c:d7fc with SMTP id 6a1803df08f44-9123d7dbe02mr118184096d6.37.1789617635371; Wed, 16 Sep 2026 21:00:35 -0700 (PDT) X-Received: by 2002:a05:6214:5d05:b0:912:127c:d7fc with SMTP id 6a1803df08f44-9123d7dbe02mr118183726d6.37.1789617634866; Wed, 16 Sep 2026 21:00:34 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:34 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:04 -0400 Subject: [PATCH v3 08/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-8-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=6238; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=rulmlM26V12Eg+K7SQZ/FyXPG7ub2C5fYZrfS5dFjSk=; b=l7I3D8GkAZG1CegWVZXzayXMbxr6vC/8EhbT2Z6HLIO+0T0PevIIqJL7/ypJgaMLOlN7VypN4 g//yYoyRUMOANUnzbBoVUARDPoqDJoHHtzvo6UQoZtq6IvuWCm4BHvh X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-GUID: WjzgRcbKgZ3bpZ_ffaRZuVmFEEsKvQ8Y X-Proofpoint-ORIG-GUID: WjzgRcbKgZ3bpZ_ffaRZuVmFEEsKvQ8Y X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfXz9nPf5NpsDVz QTqVPs8Z59ch0rGjXlBeTHh99HK+YcdshmC2PH8XetxKrCChNbq6NBGLUznX4xZmqPi1ZX2sN26 +8fp9efrXk4o9B1+mwSJb+WLJ2PCmt6Shjl6QcviGKE/aZPoa1PC X-Authority-Analysis: v=2.4 cv=ac30Dhot c=1 sm=1 tr=0 ts=6aab65e4 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=79PYxaXUQd1wl-QFWJnA:22 a=-H6kAsrtDIwNne7E0FYA:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfXx9rgHg6goihk kYlix+O01RT4t9WcyVWbDkPRG/waBxIaBlcoeWeBZamsTdP/nEgdzl9hD6blBVD5kgPPAj9fMLH FeLgZ4sXoo+RcKrthwIghJWVVeUATwi7W7nf1Aw3wMn26v4ZII2znNVMmvPA46y0vmwYeno7/4c roidyNK5G8r/X8up8bNifiD4PHTD+5a5x5fBzJkVc5LigfqaKkXRMK9sR99f2VCRXiLF3PILqlg CCAIi2x30UDSJjd706ttM6EUPtmydxin8WVhRFK8srdxD5mfASzJ1ZU5MU7yU60+sZ7/vfdUoKx E4a3a8tktfxTQGv8UK6QSxRWKRDRoHbTPv/GYjG9O3aK/ug7/nZ/ehsY8vW9Sn0MQK/N2l7vVyz XeMbDoBLxpFA/FqlGfrPdQwoT0DM+BFaf9l9gaHL3XIwFMClKXf9YGHG83YYqZLF+2UkRpaq0D+ 0Mu6oMxFzatNmnGQO0w== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 bulkscore=10 clxscore=1015 adultscore=0 lowpriorityscore=10 phishscore=0 impostorscore=10 spamscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 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. lookup_free_space_inode() converted old style space inodes by clearing disk_cache_state so the cache would be rewritten with the new inode flags. Without that it only sets flags on the in-memory inode, which every remaining caller truncates or deletes right after, so drop the conversion too. 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 | 8 -------- 4 files changed, 2 insertions(+), 52 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 972909b52a39..7c5f80f4aa79 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -2454,8 +2454,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); @@ -2481,20 +2480,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, @@ -2635,8 +2620,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 @@ -2657,13 +2640,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; @@ -2692,7 +2668,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; @@ -3555,10 +3531,6 @@ int btrfs_update_block_group(struct btrfs_trans_hand= le *trans, spin_lock(&space_info->lock); spin_lock(&cache->lock); =20 - if (btrfs_test_opt(info, SPACE_CACHE) && - cache->disk_cache_state < BTRFS_DC_CLEAR) - cache->disk_cache_state =3D BTRFS_DC_CLEAR; - old_val =3D cache->used; if (alloc) { old_val +=3D num_bytes; diff --git a/fs/btrfs/block-group.h b/fs/btrfs/block-group.h index 939d4bfbd4b4..eac794a053cd 100644 --- a/fs/btrfs/block-group.h +++ b/fs/btrfs/block-group.h @@ -20,13 +20,6 @@ struct btrfs_fs_info; struct btrfs_inode; struct btrfs_trans_handle; =20 -enum btrfs_disk_cache_state { - BTRFS_DC_WRITTEN, - BTRFS_DC_ERROR, - BTRFS_DC_CLEAR, - BTRFS_DC_SETUP, -}; - enum btrfs_block_group_size_class { /* Unset */ BTRFS_BG_SZ_NONE, @@ -131,7 +124,6 @@ struct btrfs_block_group { u64 delalloc_bytes; u64 bytes_super; u64 flags; - u64 cache_generation; u64 global_root_id; u64 remap_bytes; u32 identity_remap_count; @@ -171,8 +163,6 @@ struct btrfs_block_group { unsigned long full_stripe_len; unsigned long runtime_flags; =20 - enum btrfs_disk_cache_state disk_cache_state; - /* Cache tracking stuff */ enum btrfs_caching_type cached; struct btrfs_caching_control *caching_ctl; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index f256a91f58b4..881d95080709 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4864,10 +4864,6 @@ void btrfs_cleanup_dirty_bgs(struct btrfs_transactio= n *cur_trans, dirty_list); =20 list_del_init(&cache->dirty_list); - spin_lock(&cache->lock); - cache->disk_cache_state =3D BTRFS_DC_ERROR; - spin_unlock(&cache->lock); - spin_unlock(&cur_trans->dirty_bgs_lock); btrfs_put_block_group(cache); btrfs_dec_delayed_refs_rsv_bg_updates(fs_info); diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index a25c4db561b4..3ba9ed4a39d0 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -124,7 +124,6 @@ struct inode *lookup_free_space_inode(struct btrfs_bloc= k_group *block_group, { struct btrfs_fs_info *fs_info =3D block_group->fs_info; struct inode *inode =3D NULL; - u32 flags =3D BTRFS_INODE_NODATASUM | BTRFS_INODE_NODATACOW; =20 spin_lock(&block_group->lock); if (block_group->inode) @@ -139,13 +138,6 @@ struct inode *lookup_free_space_inode(struct btrfs_blo= ck_group *block_group, return inode; =20 spin_lock(&block_group->lock); - if (!((BTRFS_I(inode)->flags & flags) =3D=3D flags)) { - 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; - } - if (!test_and_set_bit(BLOCK_GROUP_FLAG_IREF, &block_group->runtime_flags)) block_group->inode =3D BTRFS_I(igrab(inode)); spin_unlock(&block_group->lock); --=20 2.39.5 From nobody Fri Sep 25 03:20:30 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 D9EF33C2782 for ; Thu, 17 Sep 2026 04:00:38 +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=1789617642; cv=none; b=naLyI0dGB6De+XDQJlLhh/szcGVDHeIQARkU/ZuoeSwJH55xL+LkWM2O9UmOEoeaq3Ef9qoOrqW76rweEL3kdCkSpnIOial9bfuB0t6X07R6UYkvanU1hrwpZSKdtpgm4Q4QTxOU1T0N7eT34m5Q45Cgwb8O923dhnAENlgvZAI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617642; c=relaxed/simple; bh=OtZkkOA+g2bKFcJKKjfPsmrKC//tMdxiksjKSConr3A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=A+F+28jN1IvWeKjxvFyCSO+rHfsh8KwdDaOIRch6ALwBoKbqGdAcUXtTbiGg3oROLtyll/zX/uAVD1rNHK6TUrEC4teAfrqeoDeug4TsEsaz37H2Vz15UK1Xc5WL7UWR0FI0XdytmLy4XHez5IdTFinj0rJc/PJiGcs2o3DbGh4= 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=ptjdq83M; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=FULdvy3a; 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="ptjdq83M"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="FULdvy3a" Received: from pps.filterd (m0167069.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68H2Z1cW203537 for ; Thu, 17 Sep 2026 00:00:37 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=IBYG O6c0J62o2PqiRsQrkj8EYLmNxxruC2umkrM2quM=; b=ptjdq83MPOaeXDtVaxD1 rfzwiLkXaEQ1Aia6k9WxbfWlNnVYkLTlV/8d/vxE6To2JyRFNFRrQJ9v28QTvNxq f3QNcojIWkdlOHRyNxLLV5Pke+VRMi8jyYHzUJhPzViGhoRRI+VRTxJCz/EnlhU2 +DWiigx15XFiN8IOy/7wCCS6PU/7OPVNI/6/dNzb77ANPI4QpxVZc14uok7Q7Ppi tzPRQHuFHiKx+RscFVetbc2y7WY3GXil6uTJmDyqx4Ayim72hpfKDiJrusycpR1S RG0K0FOOUNzyqa38AjzMTxutotXFFVUZAFfXL8xfhsWEK8JDPjMHAc0ChAPLWfp5 Kw== 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 4gr1x6adpd-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:37 -0400 (EDT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-90c8da50f4fso6427436d6.0 for ; Wed, 16 Sep 2026 21:00:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617636; x=1790222436; 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=IBYGO6c0J62o2PqiRsQrkj8EYLmNxxruC2umkrM2quM=; b=FULdvy3ajGckpe8dZ6V1hLp5l158aRLqK6k37W3b0Oj32V9iEq3OoVyp2w7iqBnzi6 cYkVb2l6LGXFcDvpRiBdUEx7p9et0iyObTmaTlnM/ZEiNXuNxdFuIiWsYE28ClFyWcBC hKDNUGCEVFHlVx0eI2r/i1C/G1iIaAbejhrvwHjxVviPfeG63OEyCcrsae8qvCplnfHa wQxWp8sggiaib1wqfffcYsNgXJ8fsHq3gqxVmp4AswJ2apkjqpYepjZxOdsIWT/io0bv vHI1Lv63gRIR6tIR2PJldLQ/bfBFFyZVocMlbxYtFPpdF1di9h3Xngt20Q19jEyuycbs WMgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617636; x=1790222436; 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=IBYGO6c0J62o2PqiRsQrkj8EYLmNxxruC2umkrM2quM=; b=TnkjT6viwwrmKeKFtwclaTqRDAhbEQf25tj1oh+sE0PQDnUdGRZJE/uTkv//kCP47a 3XZokp3UXlAh50id8/AdMs10ZQvEmLB3KedOqe01bbH/iKzkBNY5rZ4C2TJXE3cT2xBq QHk9/+wP+7VE8GWlzo2eNybKe1K646wjSjavfG702KTSqDpg4BQHrJpTYBtFNIaGR4fu jvp4MYH2kvutdfLeehkaAKp+oR2wZcyG4QrOxXUZGJk+V5NoD97jpJr1xqnLqzeaKDEc gwMceOoZOcaViVz3gUUV2XRaUgUlccS423ZM7vEjFXw3FfCGUzsm7eQpfprqfASETWLP 62rQ== X-Forwarded-Encrypted: i=1; AKwUvBxgwpHg/oPrDMKIPYK5PLU7Y/rSvGj2jNGxFKkxHDw939H5zJVewM5AtQveU/xH6a3DzsNsjwoGc13/tX4=@vger.kernel.org X-Gm-Message-State: AFuF++nSz/WVQ4XtxSYcjuS3cTV9RB2iqHU2dzvQZY1XvaJXYk++T8/H pGkt2beBGxmmLOqe5fqluPXMuTraFnNjHl5VGAh1FBz4nNY92zKFpiq0wt/aMijNSmcqcdB+BL8 Vc2SH8iAx97AesX/0grgpRe2mgapxGaHsDhy3bSH47mDcjuuW6Yyi9ZM/BV3pDNIohz+0UQ== X-Gm-Gg: AYBFou0Ijgu8Cv9G+Zgwv+7DJR3xHXbS2RGoUVu99+j6FOVqcH7+6+JUt3vnCa75fwa u1c1Ujz+HpZPT9DWMix4tRSwAs91+r58QUDpQ0O7+LoXAyLwmMCo7dkdhKGz4MAgD0BWLkiCfJm WhdcJWxR/QB1CRqkr4conSzUt3bGnSoRalt6TS2HaGvQl9ZePHx3HwFi5qEa6mI33dj8RCObfxG Q25EVzYWdUCT6ETpPFCMKw6fwm+9efevilTbsrmTfd+3j5PS7xW7d/UWUxnO91/E4IBlreO9UKA MzgHGybMHNjwYA8yA8P6pgwJj4Fs7Xm6kCPSDQbac2S7w9YZkgS2TTVMqYfFPOQbDJhQqQbVkuT 0WBPIRzD2+tyeMI8cx6svjZROcywHOiYWMU4r2ba+UWHQ9g== X-Received: by 2002:a05:6214:1cc3:b0:910:4c56:76d8 with SMTP id 6a1803df08f44-9123d724036mr90279756d6.1.1789617636453; Wed, 16 Sep 2026 21:00:36 -0700 (PDT) X-Received: by 2002:a05:6214:1cc3:b0:910:4c56:76d8 with SMTP id 6a1803df08f44-9123d724036mr90279056d6.1.1789617635749; Wed, 16 Sep 2026 21:00:35 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:35 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:05 -0400 Subject: [PATCH v3 09/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-9-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=8891; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=OtZkkOA+g2bKFcJKKjfPsmrKC//tMdxiksjKSConr3A=; b=wzc099PGBmjR7Li4dcPYn2CvtAu+5GFJoqdOZIT5GXtFsdS0Au17sp8LcIjb+wwTSYnBH2Yz5 O4OtB+7LxJoC3yczr474Nft2Ji11xkLuxJBUafggzmpSwys4Fm8L4/J X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfXyNAYpE0hn9lW BTylYNsWohlrCPImqxDd/gdkK8T2t2IJn/Ay++v8CauNLXMmAjqjEUd3DpxPgqJzKJqpt1lGg50 Mt7mLQX/Jh9Lg4W+n00zlUmc7US+5u7RqT6IcjchrFdRXbF2PsDj X-Proofpoint-ORIG-GUID: zoI4eVIKS7dbj1OVhMBu48-5K3QuQTj1 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX+zuPI+fiUfo7 +SUW7CgVriDv8H+dTV0m6iKXbLBfpsCCvJAbbxPKkNw59gOsoMTKPLy/4dXRoKcj/fxh6V4dlK1 fBgaN0KRVemruEhKQss5lxAO5Icy0uIOVJXqX1iZja3pf+8cEsK7v/f5uPpmZhMJazeiXqd201Q OhywVWAs7q19HXYwpKUhqMxAOHe6v29RfjyrDY1LAlbAzN62Uzrb9eyOXOOrgJa3iGnUsCWAUpb i8ZwI8Mo5uYVdfkhPlOYa/Ot0go7iUdktg4y6ZtWEbt86+0KwiiAKYvCWXKbVkinWzV8NBwBrZa NGtBnSi1k1STe+lhzFmy1YrX70HOT1Yh7qp0vvq/KuEI4y3Cvv1VdaaFRecfY+35ygcxEv8z3Ta bg7iWkIT8nsRLjtWCk6oJKHBb8eQai+1MW0pbfknlhraCYZdMEVQFQoQ0T9XB7DfQT/aNAAGGSP oVHSfl/E3O5/bzieYaA== X-Proofpoint-GUID: zoI4eVIKS7dbj1OVhMBu48-5K3QuQTj1 X-Authority-Analysis: v=2.4 cv=CLS/zhrD c=1 sm=1 tr=0 ts=6aab65e5 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=JR4YdQiviy7OQf72WyZ1:22 a=iLG6Hs8F1K9pulr5F7gA:9 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=10 malwarescore=0 impostorscore=10 spamscore=0 suspectscore=0 lowpriorityscore=10 clxscore=1015 priorityscore=1501 adultscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 Nothing sets BTRFS_MOUNT_SPACE_CACHE anymore, so every test of it is false. Remove the flag, the checks rejecting the v1 cache on zoned filesystems and for sector sizes other than the page size, and the deprecation warning. Show a read-only filesystem that still has an old cache as nospace_cache, since that's what's in effect. space_cache and space_cache=3Dv1 keep falling back to no space cache with a warning. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/disk-io.c | 19 ++----------------- fs/btrfs/fs.h | 1 - fs/btrfs/super.c | 31 ++----------------------------- fs/btrfs/transaction.c | 4 +--- fs/btrfs/zoned.c | 9 --------- 5 files changed, 5 insertions(+), 59 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 881d95080709..2ac0e7c2f1e4 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3054,7 +3054,6 @@ static int btrfs_cleanup_fs_roots(struct btrfs_fs_inf= o *fs_info) int btrfs_start_pre_rw_mount(struct btrfs_fs_info *fs_info) { int ret; - const bool cache_opt =3D btrfs_test_opt(fs_info, SPACE_CACHE); bool rebuild_free_space_tree =3D false; =20 if (btrfs_test_opt(fs_info, CLEAR_CACHE) && @@ -3149,8 +3148,8 @@ int btrfs_start_pre_rw_mount(struct btrfs_fs_info *fs= _info) } } =20 - if (cache_opt !=3D btrfs_free_space_cache_v1_active(fs_info)) { - ret =3D btrfs_set_free_space_cache_v1_active(fs_info, cache_opt); + if (btrfs_free_space_cache_v1_active(fs_info)) { + ret =3D btrfs_set_free_space_cache_v1_active(fs_info, false); if (ret) return ret; } @@ -3266,20 +3265,6 @@ int btrfs_check_features(struct btrfs_fs_info *fs_in= fo, bool is_rw_mount) return -EINVAL; } =20 - /* - * Subpage/bs > ps runtime limitation on v1 cache. - * - * V1 space cache still has some hard coded PAGE_SIZE usage, while - * we're already defaulting to v2 cache, no need to bother v1 as it's - * going to be deprecated anyway. - */ - if (fs_info->sectorsize !=3D PAGE_SIZE && btrfs_test_opt(fs_info, SPACE_C= ACHE)) { - btrfs_warn(fs_info, - "v1 space cache is not supported for page size %lu with sectorsize %u", - PAGE_SIZE, fs_info->sectorsize); - return -EINVAL; - } - /* This can be called by remount, we need to protect the super block. */ spin_lock(&fs_info->super_lock); btrfs_set_super_incompat_flags(disk_super, incompat); diff --git a/fs/btrfs/fs.h b/fs/btrfs/fs.h index 96cc8c50af82..ad4b2cbf64b7 100644 --- a/fs/btrfs/fs.h +++ b/fs/btrfs/fs.h @@ -259,7 +259,6 @@ enum { BTRFS_MOUNT_NOSSD =3D (1ULL << 9), BTRFS_MOUNT_DISCARD_SYNC =3D (1ULL << 10), BTRFS_MOUNT_FORCE_COMPRESS =3D (1ULL << 11), - BTRFS_MOUNT_SPACE_CACHE =3D (1ULL << 12), BTRFS_MOUNT_CLEAR_CACHE =3D (1ULL << 13), BTRFS_MOUNT_USER_SUBVOL_RM_ALLOWED =3D (1ULL << 14), BTRFS_MOUNT_ENOSPC_DEBUG =3D (1ULL << 15), diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index b44b16970a62..6ddb7b352166 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -515,7 +515,6 @@ static int btrfs_parse_param(struct fs_context *fc, str= uct fs_parameter *param) btrfs_warn(NULL, "v1 space cache is deprecated, falling back to no space cache"); btrfs_set_opt(ctx->mount_opt, NOSPACECACHE); - btrfs_clear_opt(ctx->mount_opt, SPACE_CACHE); btrfs_clear_opt(ctx->mount_opt, FREE_SPACE_TREE); break; case Opt_space_cache_version: @@ -524,11 +523,9 @@ static int btrfs_parse_param(struct fs_context *fc, st= ruct fs_parameter *param) btrfs_warn(NULL, "v1 space cache is deprecated, falling back to no space cache"); btrfs_set_opt(ctx->mount_opt, NOSPACECACHE); - btrfs_clear_opt(ctx->mount_opt, SPACE_CACHE); btrfs_clear_opt(ctx->mount_opt, FREE_SPACE_TREE); break; case Opt_space_cache_v2: - btrfs_clear_opt(ctx->mount_opt, SPACE_CACHE); btrfs_set_opt(ctx->mount_opt, FREE_SPACE_TREE); break; default: @@ -705,13 +702,6 @@ bool btrfs_check_options(const struct btrfs_fs_info *i= nfo, if (btrfs_check_mountopts_zoned(info, mount_opt)) ret =3D false; =20 - if (!test_bit(BTRFS_FS_STATE_REMOUNTING, &info->fs_state)) { - if (btrfs_raw_test_opt(*mount_opt, SPACE_CACHE)) { - btrfs_warn(info, -"space cache v1 is being deprecated and will be removed in a future releas= e, please use -o space_cache=3Dv2"); - } - } - return ret; } =20 @@ -729,14 +719,6 @@ bool btrfs_check_options(const struct btrfs_fs_info *i= nfo, */ void btrfs_set_free_space_cache_settings(struct btrfs_fs_info *fs_info) { - if (fs_info->sectorsize !=3D PAGE_SIZE && btrfs_test_opt(fs_info, SPACE_C= ACHE)) { - btrfs_info(fs_info, - "forcing free space tree for sector size %u with page size %lu", - fs_info->sectorsize, PAGE_SIZE); - btrfs_clear_opt(fs_info->mount_opt, SPACE_CACHE); - btrfs_set_opt(fs_info->mount_opt, FREE_SPACE_TREE); - } - /* * At this point our mount options are populated, so we only mess with * these settings if we don't have any settings already. @@ -751,9 +733,6 @@ void btrfs_set_free_space_cache_settings(struct btrfs_f= s_info *fs_info) return; } =20 - if (btrfs_test_opt(fs_info, SPACE_CACHE)) - return; - if (btrfs_test_opt(fs_info, NOSPACECACHE)) return; =20 @@ -1107,9 +1086,7 @@ static int btrfs_show_options(struct seq_file *seq, s= truct dentry *dentry) seq_puts(seq, ",discard=3Dasync"); if (!(info->sb->s_flags & SB_POSIXACL)) seq_puts(seq, ",noacl"); - if (btrfs_free_space_cache_v1_active(info)) - seq_puts(seq, ",space_cache"); - else if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE)) + if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE)) seq_puts(seq, ",space_cache=3Dv2"); else seq_puts(seq, ",nospace_cache"); @@ -1441,7 +1418,6 @@ static void btrfs_emit_options(struct btrfs_fs_info *= info, btrfs_info_if_set(info, old, DISCARD_SYNC, "turning on sync discard"); btrfs_info_if_set(info, old, DISCARD_ASYNC, "turning on async discard"); btrfs_info_if_set(info, old, FREE_SPACE_TREE, "enabling free space tree"); - btrfs_info_if_set(info, old, SPACE_CACHE, "enabling disk space caching"); btrfs_info_if_set(info, old, CLEAR_CACHE, "force clearing of disk cache"); btrfs_info_if_set(info, old, AUTO_DEFRAG, "enabling auto defrag"); btrfs_info_if_set(info, old, FRAGMENT_DATA, "fragmenting data"); @@ -1459,7 +1435,6 @@ static void btrfs_emit_options(struct btrfs_fs_info *= info, btrfs_info_if_unset(info, old, SSD_SPREAD, "not using spread ssd allocati= on scheme"); btrfs_info_if_unset(info, old, NOBARRIER, "turning on barriers"); btrfs_info_if_unset(info, old, NOTREELOG, "enabling tree log"); - btrfs_info_if_unset(info, old, SPACE_CACHE, "disabling disk space caching= "); btrfs_info_if_unset(info, old, FREE_SPACE_TREE, "disabling free space tre= e"); btrfs_info_if_unset(info, old, AUTO_DEFRAG, "disabling auto defrag"); btrfs_info_if_unset(info, old, COMPRESS, "use no compression"); @@ -1524,10 +1499,8 @@ static int btrfs_reconfigure(struct fs_context *fc) btrfs_warn(fs_info, "remount supports changing free space tree only from RO to RW"); /* Make sure free space cache options match the state on disk. */ - if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) { + if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) btrfs_set_opt(fs_info->mount_opt, FREE_SPACE_TREE); - btrfs_clear_opt(fs_info->mount_opt, SPACE_CACHE); - } } =20 ret =3D 0; diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 6a7f33ac87f2..0ea984d641e0 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -1984,9 +1984,7 @@ static void update_super_roots(struct btrfs_fs_info *= fs_info) super->root =3D root_item->bytenr; super->generation =3D root_item->generation; super->root_level =3D root_item->level; - if (btrfs_test_opt(fs_info, SPACE_CACHE)) - super->cache_generation =3D root_item->generation; - else if (test_bit(BTRFS_FS_CLEANUP_SPACE_CACHE_V1, &fs_info->flags)) + if (test_bit(BTRFS_FS_CLEANUP_SPACE_CACHE_V1, &fs_info->flags)) super->cache_generation =3D 0; if (test_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags)) super->uuid_tree_generation =3D root_item->generation; diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c index 9cc2c9c1a606..c916053aefad 100644 --- a/fs/btrfs/zoned.c +++ b/fs/btrfs/zoned.c @@ -804,15 +804,6 @@ int btrfs_check_mountopts_zoned(const struct btrfs_fs_= info *info, if (!btrfs_is_zoned(info)) return 0; =20 - /* - * Space cache writing is not COWed. Disable that to avoid write errors - * in sequential zones. - */ - if (btrfs_raw_test_opt(*mount_opt, SPACE_CACHE)) { - btrfs_err(info, "zoned: space cache v1 is not supported"); - return -EINVAL; - } - if (btrfs_raw_test_opt(*mount_opt, NODATACOW)) { btrfs_err(info, "zoned: NODATACOW not supported"); return -EINVAL; --=20 2.39.5 From nobody Fri Sep 25 03:20:30 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 E99083BED23 for ; Thu, 17 Sep 2026 04:00:39 +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=1789617642; cv=none; b=ioSKYaG66oK4dft2krhxYhp+QnYTtWkek9YSRNC3PMGzbqfDe0c4tKjV7saTS/6wiwZfeVp7YxrCPBUW7/ePPRRT/99lImZn0oukTfRREc5WD2RTMsrVfG8XyVJV3XJeStI9XRTFyOL2yBFYQxoQlBUvjlp89AkQtzqnYlB4ONM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617642; c=relaxed/simple; bh=NmMgkHqeel8gBCXCalVFD7JPoOZ00iX3XH9QHMsWeKk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ga9GTvJbQXoxCMAf69yc4yK3razMNFIUFJlCnqJEeWeIbQlShntbPz1ZxO+JuCU4mIVxvrGN8/B6+n/OZYSsJ9ocGz1AOs1zTMUy6+HIdvqb5eUZItpu8inIA+FNEWn7P6sFAqVfvE8VmWWfwRHJX14LyqOuqsF+jUBRTFLd43w= 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=G9doapVd; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=fBIaVI62; 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="G9doapVd"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="fBIaVI62" 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 68H2Z1fa2150907 for ; Thu, 17 Sep 2026 00:00:38 -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=YAEw vlW4G7rbS9GXrhM21VB8FEsa56Dol+SgMsWIET8=; b=G9doapVd3p46zVap/rBT YynUSUJd8hmLHN7o5lK7brKQ2qih5py1Fu3dSvjsNMCU/T71xVvYSLeIDaXpC6ee lfPVMzY0D1x/t+NpwDF7IROREZgnOwqdTv12z3s/XZ5nVNQI80MPZ5r/LvPls5v8 crodKfv7Nzx5dlDNhBLEXRKvW+7h3A91kNun+hNbn2beHSHvm6H9qKriXcZPth+5 A8W5iq+WLjdWifT37zyvMCP0DwGOOkgBrmzatgvoA2kKztuvp8mzF0Hn/z7DgANk zxJjOJx//6F1Pp+01a9yM3tRx8iBSNVq3Gl8zaEPdXligxJjrz2gUGi/fZ0GEnsN aA== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gr0kqb9mg-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:38 -0400 (EDT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-93a082c014aso94516485a.0 for ; Wed, 16 Sep 2026 21:00:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617637; x=1790222437; 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=YAEwvlW4G7rbS9GXrhM21VB8FEsa56Dol+SgMsWIET8=; b=fBIaVI62EYcL3qFfYcKggtBY5PE74Fi01WaKwLcipttcG2uBCwrb0Ndb6ID4JX+9os W4gaELV0Ghaiw6u0GuHCfhze1DMH2p4LA4tEUcqLUkqvuRKzcKYHoHBx1ZLIuQlG3LWz Lmb2SE+Ul9JERz4xHNqsKUgDB7XrqygrZfrB52jQzudLt7BSxi9j1QAGX6qgO1mZC78x t5bZs2ruVQEpmwgxowdF+D3U5+TEonrDfFX19DmWbslS9dUw2jRaxFn3VNnfGNp+oc6A IBCQ6t5iJiGcK7oTFfmaq+go917d7X3N/bwm/G4LepXuL8r42YIv4y5d3Vtv8oGhBZ48 1TlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617637; x=1790222437; 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=YAEwvlW4G7rbS9GXrhM21VB8FEsa56Dol+SgMsWIET8=; b=Y+TGfz2qQiWfHVUqVdoTubohIHAABZGOUk6FigxJjzfvIUs67rLTny/QRqZUr3bb1W KvPwzlZOsS0yDTEH111cE4CO8MD7Zth2838PB/ZTVU4VCEoWyNMavKbZz7MzAnZ9i+yC zhGG8ZcSK4DZrAMDPFko0BYQUCIKqk8xSnTscHCwysO4+b4c8ChAhaiHUkCHPHu8BMk5 8AmgMEdAjv4lu0jeaXiiujQWBaEqD90WW2j8DspUthQDuSPlBbxDlzQwl9snLYMEht3M NnQKsvqo3qupMeK3dVWZseuHo0SlzscQctEVhhXctQgPRtRswtBhj/ttH7XiK5sGlgo5 VISA== X-Forwarded-Encrypted: i=1; AKwUvBytug+7uWu/srhamS45cMhbAqZSaqLfip1hi8Z/elPElR37MJtWuYUlsq8oR0anZaZW1AT+m7jqY6rXpl4=@vger.kernel.org X-Gm-Message-State: AFuF++kAgkMb2pPHWOId1Kesgp5FVonhXCe/rmb9xOzmsWiRNN3E66yR IMwXhHH1wFpqtUlw+oMa8rbrLtDLkIu0UrA0VQctzVV03EUIBwwDV/an3OZ4IvrffnDVadcosT8 wZdXecxz6LemLmFmA0TTPTlnhlTifV8/NyTLKb0mCx4EGOOu87H7nvChAEHGKyllbn+FuUw== X-Gm-Gg: AYBFou1P/tZysAcNKBC0kSidrM6JjFn1YmaqK7/zJI5E522dMfxNzDOECaPJoHKCXu0 YVk2999ucW6jKWZjmbH3xiA+yyq9JjkFNiaLW16sAty58D266zJaTyP+YwNn8HQI9pNpMBlBhgy UpdYLUFs0wTVXHcXAmQvjmHSBBqPVmYKoM5pYmdbJNj9gGjM6MSFmhoEpSE8aKpz3fA0+S6+eji P686pjLGe9M5orCoFbh9ekNiYx4GST15jhqxBiBRaRXtKK2d+gPmuSoK5zMISR9dWMaou71LTpg pwbA8fH44q5pNz+v4bvqU/AFE9mH2Vpg1qLT/KQQSA+osaS8z+Kaba7KL9en1efchckjMfIvPyN Q/pCLKI4v1EctuKDOYNPbLp3YRSf5J8gWzDXKDkYiCgdWvw== X-Received: by 2002:a05:620a:3949:b0:939:fbe0:9abc with SMTP id af79cd13be357-93bc6240b9bmr368870985a.9.1789617637474; Wed, 16 Sep 2026 21:00:37 -0700 (PDT) X-Received: by 2002:a05:620a:3949:b0:939:fbe0:9abc with SMTP id af79cd13be357-93bc6240b9bmr368866285a.9.1789617637047; Wed, 16 Sep 2026 21:00:37 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:36 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:06 -0400 Subject: [PATCH v3 10/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-10-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=4011; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=NmMgkHqeel8gBCXCalVFD7JPoOZ00iX3XH9QHMsWeKk=; b=UhE5YRTp8LlOgNlViS0FRdlQeEHTyl6iIWYpwSfIv0k1RL3bBoho0Yb5wlHlTf5UWEw7XrhFc Sn+BrMewnegDwV63jRkFCWb2ANsxH52hqbCAii7onbOgD1Z0q7CXIn/ X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX3tLfBSoNlhfb Bm/sMExReJdS7OFWE+x7UOyWF405tqsE9foGaGDGuJKrP3gzbrzGr5MuReTeaH5Va05xRnd1Vua Z83yEw2mymMk1wQjtwdFF+2cAdlOvqBUrC4JhAe2jfBzE8R5pyrx X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX6gGscz1aS4VI AP2hzGf3rQ1L8uLoITKvUqrSguB2sdKLlK7QhE9J7pz90CPa142Xqi5XiVJywW8PlPRYvbOj+Wn yXxUrTXFzHlHIA4xulRQxhPuy4dJ9w0XOekT0EchVvTRWraincV+wCg0XnpextLq9eVuYn8pu1a 1FymzyBpIVp/mJZO39M2K4jbXySYhYDQt9S1NFNjUZ6RpR6fmclPZS/b6bBmy2zzapPzLCxnZ2H iZJPpRrsEFTvIbkrNdKaM1M4Gl6ZXlULnBS6Jg6KsSMyGRldGbA21hKqm15CgwaXVqwmbhDwFsc 7JaVGZQN29PZRmJEM6IWTOu3L+fe1uQz6TEHo5pVeluz63CAUbs67i32ERVudpPNU6S/oVUCsWV yzWR/a7jIhdB5R9g7e3QNG7Xok81/DyWnkmcmlum3gG3dciDKVTuTFi2E9AIlPjjq4rmUNg85Y1 ryPh8MKqDWc+q/jjehA== X-Proofpoint-GUID: 8fVkvmKf5fODibI53WmoaTzO4NFlNBaO X-Authority-Analysis: v=2.4 cv=ZbqIpcVA c=1 sm=1 tr=0 ts=6aab65e6 cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==: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=UPWLJQKup_2xIvwY5mAA:9 a=QEXdDO2ut3YA:10 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-ORIG-GUID: 8fVkvmKf5fODibI53WmoaTzO4NFlNBaO X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 adultscore=0 priorityscore=1501 bulkscore=10 malwarescore=0 clxscore=1015 impostorscore=10 lowpriorityscore=10 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 The only caller passes active =3D false. Turn it into btrfs_cleanup_free_space_cache_v1() and fold the block group loop into it. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/disk-io.c | 2 +- fs/btrfs/free-space-cache.c | 42 ++++++++++++------------------------------ fs/btrfs/free-space-cache.h | 2 +- 3 files changed, 14 insertions(+), 32 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 2ac0e7c2f1e4..323fbbea48e5 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3149,7 +3149,7 @@ int btrfs_start_pre_rw_mount(struct btrfs_fs_info *fs= _info) } =20 if (btrfs_free_space_cache_v1_active(fs_info)) { - ret =3D btrfs_set_free_space_cache_v1_active(fs_info, false); + ret =3D btrfs_cleanup_free_space_cache_v1(fs_info); if (ret) return ret; } diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 3ba9ed4a39d0..fb6ff3db1241 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -2891,47 +2891,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 03:20:30 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 C56F03C9892 for ; Thu, 17 Sep 2026 04:00:40 +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=1789617644; cv=none; b=WwkEpl1me1v8yZRmhAHlWZR8+8p66L1/vrQxauS4dyBQLygl2vM5wZEVJX/8ZEKPpPfPtmnnbSQYjjgQNW3NQS/5Z7AjtdcCyscXMaiRUAtmv9X/tfVj+tAgw3gOgTUBA0GgSdlDDJXTyD+v5ZPjGM3WYnGN+se6FAsKfIkDspY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617644; c=relaxed/simple; bh=neT/tzpSIWnOsYxFKC2yUFBG9n1yazxJzFDZgWXyDBs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PnRZsftsDbWMZM7RwytF439WdDFkCms8oLY1fhGZkMeHwtLeX+Jnm4Ds6gGYKWQQWmubYCkAGLWs7Deq8rfJIWfaUjU8QjW/R90GaG1rSJy1obvkBnILstG/WRcC7YX2z6uWFDquebrDWhHzZRPpgGvZ48RwZkRBZsk/H/0i5uE= 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=EoF/XLbE; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=D544Kcbj; 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="EoF/XLbE"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="D544Kcbj" Received: from pps.filterd (m0167069.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68H2YKws202998 for ; Thu, 17 Sep 2026 00:00:39 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=5q6Q 29uB2RPNQ2NyxscgzG0RbvLJFOMyV0WxiGVhcCI=; b=EoF/XLbExRdqjdp1C46h m8I8p8hqGlrbgLKljdhu7NU3JXY6hmNXGdWmTly2p294cbar9FpZu0j49qx1d+9O NQc292OvNuSBk1ONMSP77fPB+z+n3g2/d+t4On//fNIpVuYCLfnAT4LnmAcpQ3Cu 2TfVP50koOSF+4U/aQUFVmrRd0gmThmXJ/pTj31dxRFkeqf6jSSJmWxKQKZ//Km3 PtuEhRl+jgM1d5xuPJpAi/O5Fe9QZQsep2LzwpGHTr5aZWXkbxAVRTmH35/z5evL iXceec6yn0cukTFzz3Eh6FCEri/8jIB61LFEEW954JyrFmUo2NidxdbRy9MGLee/ 5Q== 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 4gr1x6adpn-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:39 -0400 (EDT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-91049eac948so6780836d6.1 for ; Wed, 16 Sep 2026 21:00:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617638; x=1790222438; 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=5q6Q29uB2RPNQ2NyxscgzG0RbvLJFOMyV0WxiGVhcCI=; b=D544KcbjNSHMDmP3K5DT7K6ANGvWHoWlFlnlVvGZXA+vHVxhRRAgHbbWlXLWvePg1Q 1E58AwuGuEs5y5OTpgxmt1pxewL8HFxO+Axg2vlEA5Gl/clwNrPsyyn7gxO47KXzw8Pk SOjlRr4GSyO6xCLJUjXJOfZSXekSToa0jpZgNs2y8NAFUrKeLuOtlMJFk099uhcScvEC jNw2buF1kkDd1FD1JL0iGdkzgyuAxYuvZhFoxxztS38aU+jPYkZIa2QVsGkY1jlmQWkz dfvu5vCthzU1qUh5STXp6i9JjTrOQKacHeFMnVXFWhaceB1ke7Ev5LpCck1qrLCbAvFW /WXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617638; x=1790222438; 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=5q6Q29uB2RPNQ2NyxscgzG0RbvLJFOMyV0WxiGVhcCI=; b=FTrXtsdxt2iYnZn6A82swigdtIpruQ4p4mcr1iY+mcGOIFGVmmfCcwaQNXh/dgGsxZ 21D8AVb/3YGizBZwE0Q5OO2g9W/WXCYqosGQpX9BglmwBT/poRwrPOw1umfjt1SKWXNV KqcnUQLuwF0J+r2e+h2KG16pl94NG0fTpObUoUAsrW6oGcN5FjhGuO7MlVcNbVrDUYIR mw4bkfmCLCjxrDev170yX6jaZVscFSp3qeqNNueM8G3TukSQP53BNLrworbioLxA/Wf7 JHWmcVz9yStgEc4MrT5X8h8xvPeFU7xFA/s3cLc4SKSVgZBAlXHbCQFa9k/VhRSXo99u 5MTQ== X-Forwarded-Encrypted: i=1; AKwUvBy8AcP/saVTHiOJsF/YqUvIPNEEv8kvOW4aIbYgD1/um/h3QNA/j33wWWhjTKWpTHBl65l66sZPbtpAVpA=@vger.kernel.org X-Gm-Message-State: AFuF++mjA9OJmJKpJsjcFgWFNZl6LYk27YZh2MD5pnAcafzVK+HPU88v HhsnTYWebgtZj5Iy7fOALj4Ror746k8zWuVnpqH5HtgwS9docEwMn3j1XkxF8SYAyW/F6SEQU8D cYJwFiQvGTWepAOKRLE+lduzC7VLJja7/w8X/7i1H8SkTRFN4Vs6xqZNAfJqpv5OyeikB1Q== X-Gm-Gg: AYBFou3t7eK1UM0R5X9VV264ZNI9wW5x4jXp90sHOVc+VaZvB4oFCrNSn4iw9NE6qrY lB4w+9GDvtKr/lbGR2LaZMHtSUrjFXNhNy/CrhKIdCACYm2P4xrUSi8fPCp44bvCkkNaThk4FuX rYEWbeztA3LY9jvqIXJVykYrnTY+fXUHyKyMueszkYgmKZS2mnQZ60vSvhu9kKTgCuiLfA4q689 1ff3fGqUxHpyD98wg2+BPQFo/01XnFRBh8cp5Ix93P9gijfBkJ+ZVB3zv5QiYH554sAh3YmcASs LqTqZRkjY/HAxhEFCdBGIwX+OB3jHlvHNWKIx529Q3Bg6MD4ZtM7mfNxr4Llpjb6uLVUFV0riS0 dbgcxNIet4LAhXpUfEDleRD+Kz69RRHQ= X-Received: by 2002:a05:6214:404:b0:8fd:d5a7:f970 with SMTP id 6a1803df08f44-9123d754226mr100463276d6.11.1789617638618; Wed, 16 Sep 2026 21:00:38 -0700 (PDT) X-Received: by 2002:a05:6214:404:b0:8fd:d5a7:f970 with SMTP id 6a1803df08f44-9123d754226mr100462716d6.11.1789617637983; Wed, 16 Sep 2026 21:00:37 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:37 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:07 -0400 Subject: [PATCH v3 11/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-11-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=7181; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=neT/tzpSIWnOsYxFKC2yUFBG9n1yazxJzFDZgWXyDBs=; b=S5JfT1WYgC07tpTNfrCv/4rGpeI2qoVcApImDnfJd4jCv3TSC2cpsgyxysHGkFg4L1q6JhPgH MsqJW/MEDEcC5suGNw3hhldgo4orHFO8+R7GcZgZNLJEqQ4k5xlP9Tt X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX+qLFh0Cpvy+1 Faib5kicLOOcp8HfX7iPgD97NuWqJ6hhGO/p/AhZ0JH1Maa2klRZ838DgAmmYQT79e7vXZK/JQZ ywiFTHwpohZXkRMcEpk5+85zxBbeR2OBYEbKgeGaPkDG40tbfLlC X-Proofpoint-ORIG-GUID: SLZbEWxr8jrOfddbrrlMV_DHbQJZcECG X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX88ERJJCMA44E kZgtR1gSJxNAb/jvCEzgvlNLCVnJMibBOC6qslOds0iFXWS0LhwofpZBBX1OmgG2eIpMjFIQV6T dRHSuZpWUuBFgvFId92Q7+0yx7hVuI67guZZ+/lkVul32l/DYMfT6k3QN2JiIombpodaVw6O7JP u4DkpQc/Xkn4wUcCasAn5kMGHca9FlRyTQIowIaeYApYP5vRTD+MzUgHDTVXrgi6n2GEc9u1JVo r6aCWfZrqHYX+kkpfRvyPf4UNEadK/EPjLYtlgjHayW4lE0mFh4y97yHKUv+s4JG+hGlRa05Cd2 VxAt1aZLa3fykJO5g5yn2GSNOjBXeJzD1ib83Y2kvVOW1DYCPkpM329ZT8q0msPYP1gLi61iHhU YkyQ5lEMvkA1ltu4Tf+LGH0HxCaQm74tpVpnD9Bnv25mj2OXAzStECra5l5qADL0M3aLBZ7VyYR BXJe+koaaXfm7R1tR/g== X-Proofpoint-GUID: SLZbEWxr8jrOfddbrrlMV_DHbQJZcECG X-Authority-Analysis: v=2.4 cv=CLS/zhrD c=1 sm=1 tr=0 ts=6aab65e7 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=JR4YdQiviy7OQf72WyZ1:22 a=qCNzSPQ7UVaF4CatvjwA:9 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=10 malwarescore=0 impostorscore=10 spamscore=0 suspectscore=0 lowpriorityscore=10 clxscore=1015 priorityscore=1501 adultscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 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 fb6ff3db1241..2a40167c3fb6 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, @@ -1692,8 +1686,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 @@ -2389,12 +2381,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; @@ -2420,7 +2410,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, @@ -2429,8 +2418,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); @@ -2468,9 +2455,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) @@ -2501,7 +2485,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); @@ -2526,7 +2509,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 @@ -2535,14 +2517,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; @@ -2566,7 +2543,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; } @@ -2677,16 +2653,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 @@ -2702,7 +2675,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; } @@ -2728,7 +2700,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; } @@ -2739,14 +2710,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 @@ -2766,13 +2735,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 03:20:30 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 77C2C3CC9E8 for ; Thu, 17 Sep 2026 04:00:42 +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=1789617645; cv=none; b=YWlvB8/r5/k369kboloMVuWbJ5qnJ9i/6ochEuuE21YMH75GWCP06E8GHkPqjhgv/Gn7kSdt/u/3+QYWZkWks/xdcelINc3BHnEwRzCqwJxVmGmDqzFavLHuFCxaTnUhKZUeoPLxgVgco3KMU9G0vR5MpzIV6S/qKFIFxW/rfd8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617645; 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=qXqu4udfyQU3RCKuFOL1HeBmkaCJVVfk0UlyozY90k6cbpxmG2ziW4IHoSYkbW81ixIDDjXjfrp7N72S+6mrRKfcAA01NgN9w6KTXeNN/ccyzCu1HOsd9rolLviCg1xxaVsOrr/kQV+Q5BVNHj/afn9+pRSO02vqcF6Xa2bTUvc= 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=JG8JuXdv; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=QCAmTFhC; 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="JG8JuXdv"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="QCAmTFhC" 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 68H2YjkV2036102 for ; Thu, 17 Sep 2026 00:00:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=GK6I 62eBP+KN+hKQKgUP5QjzfCNYZqmQtRtjxGM6l5s=; b=JG8JuXdveTE70FNJWhkz Sj3u9lg2ao+Tn7/gQs77n5OFpQwQcMInHeKOf19wSLgZXuBBr4cAv0W4rPNe6jeJ feA9D5tAJCIbN1RrQCpkIJuwEZO/qEAGPd/x/6r/eurXAmHq4d30AIQO6EuAzAGU V1c4/lNy6ZpslT8CQQ/mgV5/jJbHHcfu/wIWnFBKgiuUf0nqYkIHwD8cULVo35Yd JqyBS1fD7/w4WvM1fE8uC4weZa2P5b2qofmdCFSt452zgBmskoJ8gFILJdGd6tdp N4kAlzq319cWlaamidJs3pXXJl/0lgyUhqEdIfrJhrsFFX+1TUFbSiwe5Li+uc4b 5g== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gr3tv1cpf-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:40 -0400 (EDT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-93909014c85so71043585a.0 for ; Wed, 16 Sep 2026 21:00:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617639; x=1790222439; 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=QCAmTFhCL/j97kiNFLPj+O4DL3fOpj5z8OWYy3I9ucEjJ9p8wNr9GLoZHIz2FNnAmZ JrINxlWUvI3g6xzpnXOrKK7jNayhwQQly7L2U5kqmWHtH+z3xiiV6WADc92wq6wkjk8U jgMdQ5M75Y1Q09ielSNMrIX37gZFZvuQgbGRb1EX3jaA1Okp5vqiZ9YipK3aoBsS+xJT j5jMDleC2+O3AnMnCXd6R6X81qQNR8MmQfT8X1uFXrFehDu/Lo791CnNJiy6S7yh+55D xh5VgbeJ44G+Sa3IchmjNqtOkIafohDM7vu5rSpxkue+PuX4+pS8I/XzCoTvFan4H3zN M6dA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617639; x=1790222439; 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=U29GkoxoaRzJcSUv4avIOVOqm6K+ZC3hBWCUIkT6+aU+zoMnm/qPn+1c+ylnT2qp8P 8u2F6wxVjV5KBpi1rsF+WR+2yU7A/H0bmd2hhlsqoTfOTYno5PpAKspYHE7y4SLyWlL3 4z+NJQK5M3EBCz7FlC4KrIcetw4wXs8jlC+X2JchtlzrYS9AHzDPxBp/fQbRMip9ucwJ MkOWsHJ1hI7X4gLHJgDSa0UC4YBhRxII2BpO9E4dl7nEnFVv0fpltLCdHYj4Tsk0TcVK abP9JcTIGP5nyvqjpA1GBGkFXpl3JZs2wvBwRcywGQT35d+kqtStmT4tZftMYpY/1WQW ajQg== X-Forwarded-Encrypted: i=1; AKwUvBwns2CTVL4zY87838RJRRz38YWWBW0H30jooD1cR5Ca2LHdIDvlLQyNfhI2QjHJwxw4onMzGw2tNL27pn8=@vger.kernel.org X-Gm-Message-State: AFuF++l3SNR6+jloUws3HYouOjMCdmhBTSYpcSBwuvkX2VDX3n9xhKTX rwpeA6sEa6474yDUpzz3HXrcwGbV0M4IGWmiCkA8q2W0BkQwVkoQwUy/9XJD2TPCvJ7pjByyx5t vXaMBIf1lBorGyYmnr6dMVJA5Ctc8J4irkmpRmP748Cjma0NmNb+Y+UpyoY/HLFducuojQQ== X-Gm-Gg: AYBFou0QvaN/7JEftCrfPRYOpSDPEus4DV68PG+606B6GFxXNfnklszjpHKfE5PwYAw Qffu7ZKvUYTzrkHhmeKTZQm3ntlx0dOAa6h03akV0/3o4Tw9uAo/PSKCStxghWGlvHXwQu0KHbb PiYvwSbFZDtfYAits5l26ZyWSEmWOPRGyhHGra8edNlSZ5scgZAviwXyCKDgW3peLnppgV+IvLR Cs3BQpUcG1B8XKszdZMdeHUh3H7BOzzqHLUMFgF3Jqfe6KMOJhkoloiKlrJRMINV97qStZZ4mvw 3B3ophitxtsV1+Wr6sHLUTX6DqajB9Eky+NhKM5NjDfk8A9GRBbkmb5TCOoJof0Fe2znhNiDOIE x30Wy7oCdDbfnMAufG5BXCT5pEupFQ7A1NTGypZtcW2Tcug== X-Received: by 2002:a05:620a:450e:b0:939:8373:b552 with SMTP id af79cd13be357-93bb76e6382mr844245785a.1.1789617639535; Wed, 16 Sep 2026 21:00:39 -0700 (PDT) X-Received: by 2002:a05:620a:450e:b0:939:8373:b552 with SMTP id af79cd13be357-93bb76e6382mr844239285a.1.1789617638949; Wed, 16 Sep 2026 21:00:38 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:38 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:08 -0400 Subject: [PATCH v3 12/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-12-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=3841; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=rTEatSh2afYJTS/R+S9oth9gqbiO3TcMxRS2cWJg+9I=; b=0E9XVpUBVOquIFrMxLveRVOBGXb0CQOO1+3nXZiVQ69wCdezbEW+0Rr/+6oxxWzurFvt6Ygrp gsfyr2XzCAWCUMUTP8g3I7aH6hs47zPvbjNBQKpj2NxD1ZugKE6Qlfa X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfXzxVZbO9KwKhZ Bvw1+FbZSUyjA9KFx5GVeizBqUOs8+coBWAw6G1oLoRz8uLmFj7ACYUOc+kOUpuTZuJHBkp3riJ 8e2rwTscqkx5oMK//mcnPd8OzJma8W+fcl67geANSK5NZi98Rjj5rnM8OZZdNxSyju9rh9Dlabj 1isTp5Dk2/VYLpyn1IDQqQ9qMzUxV+95Sjf1qd5nojWlXO6tW712VTiMJqxOVUg7arvjsqkSqDn tAbmwGQgZ3TjH9DjrM5+vYjH84K5lQQbGdfnVkoO02CibS9vgejhpHCI1MPkEYMJTEnRkTQeef1 M1RNyH/7zwxkttv5qTAeKzyBslpQSgo2wiVUhhquXyYfSUGi0bMc9Sx/otnKYZcpI8iRSieIFul LekLnG/yBgI1shlZMDYoAPI+l01MdZNWa6++WxbHRSg9TFoo16L26I5XhlDwYa2YijPRxvv68+C r08MnUp43MwtmbZHiqA== X-Proofpoint-GUID: pJPdcsVcWWK8uiltycH0UqnU5AUun_2B X-Proofpoint-ORIG-GUID: pJPdcsVcWWK8uiltycH0UqnU5AUun_2B X-Authority-Analysis: v=2.4 cv=JIeuIMKb c=1 sm=1 tr=0 ts=6aab65e8 cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==: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=BlyEiQbNVX7t3OJdSnkA:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX1Tfv7y1OSpZk /w6yBRa4JwLoM+Bp0g1jIG7XJleQe8z0fGc+f2E841J7fO7PkWQgqHnDbtb0w6Z07786WPGDJcq cBlcMknDdg9hB/HX3zbK5C5mlCGeI6o2Zs4QHXDOLlRNHz6UX2W8 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 adultscore=0 lowpriorityscore=10 suspectscore=0 malwarescore=0 clxscore=1015 spamscore=0 bulkscore=10 priorityscore=1501 impostorscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 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 03:20:30 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 2E0303D25CC for ; Thu, 17 Sep 2026 04:00:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617648; cv=none; b=LHG+Ckg2r+UEHgdFrYlUcRwuotoJDUqPXRrsmRb89aas6SSMmHXY/LNm7ZJjxpaSSQWinF70pDS+eGRvdX/ppIk4IVtG25Z4aoTAStE+Ep4QzTUVEE1GT/1pq37SMriBoeb0jDgR1R1Edebg+41/jv0gOV3hb87Qpk6B3EYzo/8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617648; c=relaxed/simple; bh=jr6iJ2XTm/NeDYB0AKM6kJjSve8LKKcse8zyC1ifnUs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O5t7Kc+cDpPj/qPO0XejMuf/ZOYEGJ1PG+QvsJWS19nxpyxNX1tJq3+QoU3nKIfk+Q9KBo3evFyF9otYyp7Rgq6FHcpmfiM9ZnlkzUgodOPn/YpQ8i6NusGfKzY8eW5WAunPUDsLqlV4LZo3dzyhwPlrgkeuOwxIUYjnZQonmwg= 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=mY8otQUF; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=K2G+fdoX; 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="mY8otQUF"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="K2G+fdoX" Received: from pps.filterd (m0167073.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68H2YLnk2535619 for ; Thu, 17 Sep 2026 00:00:42 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=536N Ckbz27nIuI5cL7oJVN519+z6T8yl7KtS+93Yvp4=; b=mY8otQUFAu6Y0GzgUaCc 5hixLy8VYh/o8DHhbnpl5hOoUYxRQTiiEE0S0H1aVaT6hRIMDsiLiFSeBDIK713R l8CyejAf0Eq9geky9TqvMM6jbL/GWlbNOpXd5Eaz5yWOUFOAvIri6CcGMNX3SGD9 x0rLc9JLc7cUkstr11DdZSYDZAfnE0RB0VqA5fy6AugPIqjWHqfsSpqVyU/E6TMW 5D0ubwDkxLRBiM57/UmSHpz3nn/+Gpx/Vs+2h/J44GGumZo9LNntqnughbHMG4iN /zSlJLeSX3qraqpgH5h+q9hUMAL24kkcHayqczv588bjxLSohqMuLXtPaqWfh74w 4g== Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4gr2m4j2hk-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:41 -0400 (EDT) Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-51bf321d786so3197811cf.1 for ; Wed, 16 Sep 2026 21:00:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617641; x=1790222441; 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=536NCkbz27nIuI5cL7oJVN519+z6T8yl7KtS+93Yvp4=; b=K2G+fdoXKBHnddxOMYaSxNg/UJnFzE7Lp5CW+hX6PJMM2RIut+ifjnItQV6+rILmya 1B4f7iv4ltT/2fNKFwmEM0tkZAc1dv87Gd+SGHWh9V82C6PLHd45/iS1kHwwYbQxuk1M ZhdQyrG3qUt/P07ObX7yR2h6WHPEsAnhk/OZcXpSW5gXZ85bJZ2onL8H9lI3iCC+xw7T OuAcGSeTX7hy0DZaUaTf6qPxIw1+GJOeMdCdrbypGlUH0cHertKTS17QqpmjZEduRnhd 2rlHwmNR5/qQLuXKMMkr4uO+N9LPWBrKvfm4xC1oIVFYrnm1x3HR01zfEB+49IVOP/68 DgqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617641; x=1790222441; 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=536NCkbz27nIuI5cL7oJVN519+z6T8yl7KtS+93Yvp4=; b=LzsbMSxC2VuIaff5ji1QJIi1RaKyqgwxE0PzPGoaxr2nnzGkNfdMDV9gPd3p2XV4k5 vqdL4yJBrvz6iKcpBhjg0zNDxN4lGqSwYfw2JaZDRkjgqjAEHIkQKxCsKbDhXgg3fU2F /aa2F+doCce9naHgjNsYTakUU4oX6hFgcJNY/kLyiGHvzqe9UTVdMe7a683cZZyGDh8d 9st0lkgfSLMkWrnF5NZoaPSscRIiFiohlI5gxGHjkFD/RJcR6Tcejcj4zame1DB0UAjH W2Nf5sTVwgHovJeu3qoDSyiUw0OgiskuZWkzxxa4JDVkayyCih2OBs9/AzqrAVSIAykU F4UA== X-Forwarded-Encrypted: i=1; AKwUvByWuSk1v/M2CR2V9W07e9HhTghA8+Ra9F3tNR2bl2T0gNVe1Yt7GCeBnjTkzMr9T2KS4rriI9OS1P2IkL8=@vger.kernel.org X-Gm-Message-State: AFuF++kEOKJxMFx/H1tlKNYs+8vw89VwRj0oF/LL2F/gwVcjzDVSJzaJ F7tYxyN35XenpegyOMS+tE7uPxEQsjmylK7VNK2QhRtCxwglnsW2Mwep3iPSGJM9FATwqBUCr1O OXbYb1j6VpOk/bENZhAAcm6sQ+sbK31Pm/xQTVDUjiUW3Gpk1vBdwoAMc93XgJaQL8n1v2Q== X-Gm-Gg: AYBFou16OKamwr+DdWOd4E+I8GMGxgPfLUcmGlgr+IUg8O3NkywctYh9NgxVmxX+54T KTLIO0l+YrE1pRDjvY1HS0g3FqNQrARDi+M9+hnd9jVkU+FcSkOQP8gJzsL8GaIk7iW0dJb0p+A LxOxQf4LtuIdV41iwH+eNVZKpY5gaEy8k1NjHRr8TvhDn/sTr+AfHX2KRTlsalXlSWeeUc2dMRx 8SnB9a3YGoR3o5DigqPDCW8EyQd+vSIkEqNn7Mmqz6fmLD8z5aGHTw9e04RcSNXpdXlOg4OMr4a PqNSXK7sSEuaMDf680kHS7hefdid3PxIIENXuyrLemJq4gZUzj4w94nhPy5JrdQAWLqepGH8djH HiTkzmw7D5rANpHXikIOhrLY05wJqH7otjq0bkKWDvb5Ovw== X-Received: by 2002:a05:622a:e09a:10b0:532:8827:a9bd with SMTP id d75a77b69052e-5328827c71cmr48229301cf.39.1789617641194; Wed, 16 Sep 2026 21:00:41 -0700 (PDT) X-Received: by 2002:a05:622a:e09a:10b0:532:8827:a9bd with SMTP id d75a77b69052e-5328827c71cmr48228861cf.39.1789617640579; Wed, 16 Sep 2026 21:00:40 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:39 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:09 -0400 Subject: [PATCH v3 13/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-13-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=6340; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=jr6iJ2XTm/NeDYB0AKM6kJjSve8LKKcse8zyC1ifnUs=; b=Czz96l7+/3AIFybi5cswH0U6OQ+ybUU1Q6Q4DWlLU6hD85Wv2IEeFDFisZyoGXLSn1awqYCcG KbupOA3ZEM3D35nU+ZaeYjUjL1BxHE8+6UwRuyyKL/ICA45fP/1h8Ef X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX3idATn1oR+w7 0Qc9BnXmHtAWgSNXzs+vuAux026MWoG/zaMy9cCHVxwp7Nsc042Y0klTXrKMlnq4+DMyzeBgfx8 r0VSf0/16Xc+NzuKh7jBnlwiz/TiBoTEiyMdQArzkkE4O/3iEQXu X-Proofpoint-GUID: EKnfxDil-u-h-7QX4i3AYZhgMwBS2Hbz X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX8/lRdKHynMa6 BsgwKSu+tXEzpjC+sReUUiVQnEvhmC+TBNY6havnQRJ6OE3YTlsO+x5sgYjsqtZcdG/s/fAkm5S ymI8uZ55oCUaw8U9Ff2O7wrmceWBxEGQ5GBrPOq3pKCJfcd8ActbmVCcXfPYuGyqSo9P7+9yf64 1akodC7BRUPDtgsghF/TfqpgW9JhEXQSQSD2QUi0vCzGDJaAf0i2rLUsh1vzwkMHcaZhmV2YChF KcvJiEjlzVFsLIA/gEh6s6R2XvabY1gy7p1FUDS1uw/bR9X3au6AjZS6rXdSv5Z+YeujxfbmqGy rBu9tYz8mo23dMnXibGaj6v8y44vmR4hU0pD9ZTseY0/rCox0MHXfbEyomueu9y68PUHT0Ct2AM Qe17UhJMEJEXSM21T40mGd6ZswqtHFw30WSg1gCVjE/tbTtokCi+bi+u307XVy/lSOZSK9xXGib viw3xB9NygmF5PBvhRw== X-Authority-Analysis: v=2.4 cv=R6OWitRX c=1 sm=1 tr=0 ts=6aab65e9 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=jHxIr1HyPKZ_Q5_91PL3:22 a=Rsr-QhNx__N08eNVIAUA:9 a=QEXdDO2ut3YA:10 a=dawVfQjAaf238kedN5IG:22 X-Proofpoint-ORIG-GUID: EKnfxDil-u-h-7QX4i3AYZhgMwBS2Hbz X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 phishscore=0 impostorscore=10 adultscore=0 clxscore=1015 suspectscore=0 spamscore=0 bulkscore=10 lowpriorityscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 Free space inodes never have ordered extents anymore. Drop the lockdep exceptions for them and btrfs_join_transaction_spacecache(), which was only used to finish their ordered extents during a commit. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/inode.c | 20 +++----------------- fs/btrfs/ordered-data.c | 20 ++------------------ fs/btrfs/transaction.c | 6 ------ fs/btrfs/transaction.h | 1 - 4 files changed, 5 insertions(+), 42 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 0539f27776e1..dec1a848c7ca 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -3203,7 +3203,6 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_ext= ent *ordered_extent) int compress_type =3D 0; int ret =3D 0; u64 logical_len =3D ordered_extent->num_bytes; - bool freespace_inode; bool truncated =3D false; bool clear_reserved_extent =3D true; unsigned int clear_bits =3D 0; @@ -3220,9 +3219,7 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_ext= ent *ordered_extent) if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) clear_bits |=3D EXTENT_DEFRAG; =20 - freespace_inode =3D btrfs_is_free_space_inode(inode); - if (!freespace_inode) - btrfs_lockdep_acquire(fs_info, btrfs_ordered_extent); + btrfs_lockdep_acquire(fs_info, btrfs_ordered_extent); =20 if (unlikely(test_bit(BTRFS_ORDERED_IOERR, &ordered_extent->flags))) { ret =3D -EIO; @@ -3257,10 +3254,7 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_ex= tent *ordered_extent) &cached_state); } =20 - if (freespace_inode) - trans =3D btrfs_join_transaction_spacecache(root); - else - trans =3D btrfs_join_transaction(root); + trans =3D btrfs_join_transaction(root); if (IS_ERR(trans)) { ret =3D PTR_ERR(trans); trans =3D NULL; @@ -8131,7 +8125,6 @@ void btrfs_destroy_inode(struct inode *vfs_inode) struct btrfs_ordered_extent *ordered; struct btrfs_inode *inode =3D BTRFS_I(vfs_inode); struct btrfs_root *root =3D inode->root; - bool freespace_inode; =20 WARN_ON(!hlist_empty(&vfs_inode->i_dentry)); WARN_ON(vfs_inode->i_data.nrpages); @@ -8154,12 +8147,6 @@ void btrfs_destroy_inode(struct inode *vfs_inode) if (!root) return; =20 - /* - * If this is a free space inode do not take the ordered extents lockdep - * map. - */ - freespace_inode =3D btrfs_is_free_space_inode(inode); - while (1) { ordered =3D btrfs_lookup_first_ordered_extent(inode, (u64)-1); if (!ordered) @@ -8169,8 +8156,7 @@ void btrfs_destroy_inode(struct inode *vfs_inode) "found ordered extent %llu %llu on inode cleanup", ordered->file_offset, ordered->num_bytes); =20 - if (!freespace_inode) - btrfs_lockdep_acquire(root->fs_info, btrfs_ordered_extent); + btrfs_lockdep_acquire(root->fs_info, btrfs_ordered_extent); =20 btrfs_remove_ordered_extent(ordered); btrfs_put_ordered_extent(ordered); diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index e9f1cbeb555a..df74c75d6c29 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -654,13 +654,6 @@ void btrfs_remove_ordered_extent(struct btrfs_ordered_= extent *entry) struct btrfs_fs_info *fs_info =3D root->fs_info; struct rb_node *node; bool pending; - bool freespace_inode; - - /* - * If this is a free space inode the thread has not acquired the ordered - * extents lockdep map. - */ - freespace_inode =3D btrfs_is_free_space_inode(btrfs_inode); =20 btrfs_lockdep_acquire(fs_info, btrfs_trans_pending_ordered); /* This is paired with alloc_ordered_extent(). */ @@ -735,8 +728,7 @@ void btrfs_remove_ordered_extent(struct btrfs_ordered_e= xtent *entry) } spin_unlock(&root->ordered_extent_lock); wake_up(&entry->wait); - if (!freespace_inode) - btrfs_lockdep_release(fs_info, btrfs_ordered_extent); + btrfs_lockdep_release(fs_info, btrfs_ordered_extent); } =20 static void btrfs_run_ordered_extent_work(struct btrfs_work *work) @@ -867,16 +859,9 @@ void btrfs_start_ordered_extent_nowriteback(struct btr= fs_ordered_extent *entry, u64 start =3D entry->file_offset; u64 end =3D start + entry->num_bytes - 1; struct btrfs_inode *inode =3D entry->inode; - bool freespace_inode; =20 trace_btrfs_ordered_extent_start(inode, entry); =20 - /* - * If this is a free space inode do not take the ordered extents lockdep - * map. - */ - freespace_inode =3D btrfs_is_free_space_inode(inode); - /* * pages in the range can be dirty, clean or writeback. We * start IO on any dirty ones so the wait doesn't stall waiting @@ -896,8 +881,7 @@ void btrfs_start_ordered_extent_nowriteback(struct btrf= s_ordered_extent *entry, } } =20 - if (!freespace_inode) - btrfs_might_wait_for_event(inode->root->fs_info, btrfs_ordered_extent); + btrfs_might_wait_for_event(inode->root->fs_info, btrfs_ordered_extent); wait_event(entry->wait, test_bit(BTRFS_ORDERED_COMPLETE, &entry->flags)); } =20 diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 0ea984d641e0..fb026d81414b 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -854,12 +854,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 33a1884c5765..6b0da4eaa0fa 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -294,7 +294,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 03:20:30 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 4915B3C5DBA for ; Thu, 17 Sep 2026 04:00:45 +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=1789617654; cv=none; b=CMLOzM1AQaJLnydVUit6MpwE4hz74qtR9A2WAWp/aURlC1u+abIyDMG9DXhUWq2gQWbOxoeiwBAgEdnFJqvV6cFwgbFlhyRE1cBNsZWrGNLUM5HegpzLmv5bj9b7LbTiDdY7X/1A0lhB16XBs5aqa6nfaw9npbxfbb6f7cPszLM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617654; c=relaxed/simple; bh=vKb/gGmZfXP29NVMCIBexCHeMi4FmxmfEWzn7IiL0cs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Or8V5gSxXrzsl8kxw6voHuubtFH5JbIeAfdv1bPps19hDvP37+lfugREL917lywBbTK8udi7Wr+wEA4d4SzpJrLZX8S/FGULaNnR7nvmpnDd6BP+YWGhJk2tshHiT/uEGiyLxeiWdS1eoiGwemaa4/lIuL5QYu1UdIrerGlhCSE= 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=IPs6Hh9o; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=3ZRVdTVA; 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="IPs6Hh9o"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="3ZRVdTVA" 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 68H2YIVi2149668 for ; Thu, 17 Sep 2026 00:00:43 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=FGtc 1NLeQBu+kS94gpur8nkzS5KJcdAIY3+s7g2GWMM=; b=IPs6Hh9oUk1kjhoFvM+s OoXXRezjo1j+KH3GPGYh/VL+t7jNjA6d4cUUaLvswdK2L8aXwboqSmgkTzIYm/3l Hxv2PYzNw/7WsoGKOvYUnkgEyy9CdrY82ddWnta1jlWrJ89xEdiZjpmo24APF4Uf CartuFNapCu2dGzgGuRpbP05QgkYjcqbqOA1Xxd06VwUsH46pHYCAtg+D/5dL8oG /zslXMgO+0VGCrdvJh4aD++Eq1uHeln3Pr0WkjrVYdp37TGdsJNHvO85GH+rTmRf 7C/VotIgGzYlN1MfXZIr6G2dMGnVgfQ9jVRJfqI350KYnrgzX9VAMLuKaeK+yTCm kw== 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 4gr0kqb9n1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:43 -0400 (EDT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-912348a0ffbso4183376d6.3 for ; Wed, 16 Sep 2026 21:00:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617642; x=1790222442; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=FGtc1NLeQBu+kS94gpur8nkzS5KJcdAIY3+s7g2GWMM=; b=3ZRVdTVAOofZXO0vQ8iNNbK1kMb46/fWNSYunYJV7IvOMAAPprTtkLVeSfcmfXK0DD jmgE/93v94u83AJdmG0ji7dwd3P4IsBXeTUhwF/zyIS3D3zRoRxlVo2ROL0TM4bwaq6y UyiptV3M28/fxPGSiSmKX8HeHOasuANxeN/bQfZeRQSZXONX5cpiiXZQ60pd/LVmtc9G L0dgANB/ZuMYulN+JK7KhUY/QBf9kKU54QouWqnUaO0VvAl+DDjaMBQinGcUL9VHpg3o VkIL+YVRGz+385jydLF3MawNZ/YBeZj3paAw5tedRpXUyZ9+5zSCd7tmeNTZ1ahK0PuD 7VoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617642; x=1790222442; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=FGtc1NLeQBu+kS94gpur8nkzS5KJcdAIY3+s7g2GWMM=; b=Un1x2kFxa/v3DC3z+RLE9XAhABLnULedexCscgWOrjE1kEmb1TMJyodCuqoPSDfSoh EuVuw38S5+W++X28Ztb2wR7GVTNgzsTXDxTa74i5NdT4wrcIVF+7N0eGzYeFx9FX1mrg lqycXYi1hfJ8+47bkfm1CS9nM1XIQHB9MSj1z4hAYVVBucAQTNL28OxQrYL2w9WLY8sM Y+4TErw8wOISCA9yk6hp23LjORE+mufEFCT09FhHh3pHW1L5IRzD52OvBbK4O+KCPvoT G5uyMeUbWYxnRek9LyOeWazyF9PXd+6JhqJEdkmktvVlmanrEB3zOZAuJsBfosdfe+UG 2EiQ== X-Forwarded-Encrypted: i=1; AKwUvBxMvlHp4rHrcMVvVfwljx28y8l6ToHfF5qdnwe84pU59x48tuM10rgLYEY86129claSV/OLjrFZC39MyuM=@vger.kernel.org X-Gm-Message-State: AFuF++llShlEGZHJk5wyWVx+9GXzUdXplviS+LtiwJub3Ix1o1bvlj6/ h0lN+mjI2dNSUjMOraaRg4X4keCXEz+umMonK91wEX2Xaurw3tYFREkxcRWCiiR43o384AgGGuA xt/VqC7MrwecW8oc2lp0brTE6f9AMh+gDUQIeunubtwdpkoM3OApirrkoj0AdxZWP6v6lzA== X-Gm-Gg: AYBFou1cGk4sZDsqd9dtdAq7oz+va2Uqdy3akQpU3uA8CDzghKLMsHFGZ/jjCwOwH6o xQHo1I7wsxKcYP0fMLWfJYczpfwQDgBi9iQCHznsLCG6tflnClMZvWzrwFUTo4x/DgUU3YRAaCt zcXp6o63VJLSXXdGQHIn5mak2zU3aQj/nb1WM1Ftyo1iJlJeOVPy1m5him6hhCeFPt6LOpV7gMG vJszN+5zgKrrpOVWfWt3lwmIi54bJ0C7RcaEJ1Pihnh5guF7FX+YMhEpkztWKPmo7z109yvD7BJ J6fMO2B9xf+vXrMvceTeOsJkryeiPFPk6K1GlsxPAmVrKlwb/RZ9daOx1I7N88WdxEJ7bGrVgWB GJfasT2beo2mevOAVFbwNOsZxeDh7coos576tRfcSNZPEjQ== X-Received: by 2002:a05:6214:5d82:b0:910:4954:7992 with SMTP id 6a1803df08f44-9123d62eb5bmr100997886d6.0.1789617641820; Wed, 16 Sep 2026 21:00:41 -0700 (PDT) X-Received: by 2002:a05:6214:5d82:b0:910:4954:7992 with SMTP id 6a1803df08f44-9123d62eb5bmr100997186d6.0.1789617641282; Wed, 16 Sep 2026 21:00:41 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:40 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:10 -0400 Subject: [PATCH v3 14/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-14-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=5995; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=vKb/gGmZfXP29NVMCIBexCHeMi4FmxmfEWzn7IiL0cs=; b=vfPdwZEzVjmRUbyCBqWNioCxb5vsagNpbfCKMM+j/XKWvAaEJjeaSwMXR4d38wIucdwb4OVBt XjkqCyz+wRyAb78zq68DRWevjofRkmBwH0lpE7rbtJYkCdHToKdNFOr X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX/V9PjrcsJOum IwAleG6tcFFBclJGRj7iTch0Wback2h/kdtnTu3XhQ6ZHji7Z1N34vvmeyj4i2QsxuiB5Cx04LD 5iewXIhqPzYkzoyas4uUnhTKk79an8cSHIl2WEnt5mWD2TenTZB6 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfXxq4sD4lAkGw/ 6CL//sDcnVw3lmsl7JRtLDE48x9CaS4NoijaomfE7/ZAmVocDUl+YFSo26yiQX7BZmPL4nDTRb4 MoQl2psWDzBZJ8B2DlWxS2kzrg/luQPJyblR7g9wA9p2doY9qvqlJicmDCn4+FVnWFJeQaVuNBn cb5C1bW5emK9gMlISFfiziCind7rYSfWNh6HqBp6hJvSZqVE0TcqmMl2yVLaEsRUBu6RR6TM069 c/G/1Lcg13Db4hH7ZYtWqWMyWKwhBZzQuo+lFXgQGsvREnClw2oCw0EDceSzzN3xTzPJL2a3Fbh KcU19p0CuW+jYZS2/sBBMtUCdif+s86yQRIG5M9CMN6m57pBbPzXiF5rg9UAG7F7OrHAjcPRCRw ewi0EK/dnMr5iG0fO8/7G2VzlqhbGg576S2xYp0zVeIU4007LNucKO7Chqy1/PAvjRUqtr0Zjk+ QibY0GYPOF9WWUtAtyA== X-Proofpoint-GUID: jnzDvpe0O4PG5rKb67pUfN8pb8cVOWRj X-Authority-Analysis: v=2.4 cv=ZbqIpcVA c=1 sm=1 tr=0 ts=6aab65eb 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=G--0XuH5328wxK7v7Suf:22 a=2oXXyLKhFp2WroVMdz4A:9 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 X-Proofpoint-ORIG-GUID: jnzDvpe0O4PG5rKb67pUfN8pb8cVOWRj X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 adultscore=0 priorityscore=1501 bulkscore=10 malwarescore=0 clxscore=1015 impostorscore=10 lowpriorityscore=10 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 Free space inodes are never written anymore, so drop the special cases for them in cow_file_range(), fallback_to_cow(), can_nocow_file_extent() and btrfs_finish_one_ordered(). Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/inode.c | 58 +++++++++++++++-------------------------------------= ---- 1 file changed, 15 insertions(+), 43 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index dec1a848c7ca..c8292174b550 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1366,11 +1366,6 @@ static noinline int cow_file_range(struct btrfs_inod= e *inode, goto out_unlock; } =20 - if (btrfs_is_free_space_inode(inode)) { - ret =3D -EINVAL; - goto out_unlock; - } - num_bytes =3D ALIGN(end - start + 1, blocksize); num_bytes =3D max(blocksize, num_bytes); ASSERT(num_bytes <=3D btrfs_super_total_bytes(fs_info->super_copy)); @@ -1680,7 +1675,6 @@ static int fallback_to_cow(struct btrfs_inode *inode, struct folio *locked_folio, const u64 start, const u64 end) { - const bool is_space_ino =3D btrfs_is_free_space_inode(inode); const bool is_reloc_ino =3D btrfs_is_data_reloc_root(inode->root); const u64 range_bytes =3D end + 1 - start; struct extent_io_tree *io_tree =3D &inode->io_tree; @@ -1713,23 +1707,22 @@ static int fallback_to_cow(struct btrfs_inode *inod= e, * extent_clear_unlock_delalloc()) the bytes_may_use counter of the * data space info, which we incremented in the step above. * - * If we need to fallback to cow and the inode corresponds to a free - * space cache inode or an inode of the data relocation tree, we must - * also increment bytes_may_use of the data space_info for the same - * reason. Space caches and relocated data extents always get a prealloc - * extent for them, however scrub or balance may have set the block - * group that contains that extent to RO mode and therefore force COW - * when starting writeback. + * If we need to fallback to cow and the inode is in the data relocation + * tree, we must also increment bytes_may_use of the data space_info for + * the same reason. Relocated data extents always get a prealloc extent, + * however scrub or balance may have set the block group that contains + * that extent to RO mode and therefore force COW when starting + * writeback. */ btrfs_lock_extent(io_tree, start, end, &cached_state); count =3D btrfs_count_range_bits(io_tree, &range_start, end, range_bytes, EXTENT_NORESERVE, false, NULL); - if (count > 0 || is_space_ino || is_reloc_ino) { + if (count > 0 || is_reloc_ino) { u64 bytes =3D count; struct btrfs_fs_info *fs_info =3D inode->root->fs_info; struct btrfs_space_info *sinfo =3D fs_info->data_sinfo; =20 - if (is_space_ino || is_reloc_ino) + if (is_reloc_ino) bytes =3D range_bytes; =20 spin_lock(&sinfo->lock); @@ -1794,7 +1787,6 @@ static int can_nocow_file_extent(struct btrfs_path *p= ath, struct btrfs_inode *inode, struct can_nocow_file_extent_args *args) { - const bool is_freespace_inode =3D btrfs_is_free_space_inode(inode); struct extent_buffer *leaf =3D path->nodes[0]; struct btrfs_root *root =3D inode->root; struct btrfs_file_extent_item *fi; @@ -1807,8 +1799,7 @@ static int can_nocow_file_extent(struct btrfs_path *p= ath, bool nowait =3D path->nowait; =20 /* If there are pending snapshots for this root, we must do COW. */ - if (args->writeback_path && !is_freespace_inode && - atomic_read(&root->snapshot_force_cow)) + if (args->writeback_path && atomic_read(&root->snapshot_force_cow)) goto out; =20 fi =3D btrfs_item_ptr(leaf, path->slots[0], struct btrfs_file_extent_item= ); @@ -1857,7 +1848,6 @@ static int can_nocow_file_extent(struct btrfs_path *p= ath, =20 ret =3D btrfs_cross_ref_exist(inode, key->offset - args->file_extent.offs= et, args->file_extent.disk_bytenr, path); - WARN_ON_ONCE(ret > 0 && is_freespace_inode); if (ret !=3D 0) goto out; =20 @@ -1892,7 +1882,6 @@ static int can_nocow_file_extent(struct btrfs_path *p= ath, ret =3D btrfs_lookup_csums_list(csum_root, io_start, io_start + args->file_extent.num_bytes - 1, NULL, nowait); - WARN_ON_ONCE(ret > 0 && is_freespace_inode); if (ret !=3D 0) goto out; =20 @@ -3203,6 +3192,7 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_ext= ent *ordered_extent) int compress_type =3D 0; int ret =3D 0; u64 logical_len =3D ordered_extent->num_bytes; + u64 unwritten_start; bool truncated =3D false; bool clear_reserved_extent =3D true; unsigned int clear_bits =3D 0; @@ -3364,29 +3354,11 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_e= xtent *ordered_extent) if (ret) btrfs_mark_ordered_extent_error(ordered_extent); =20 - /* - * Drop extent maps for the part of the extent we didn't write. - * - * We have an exception here for the free_space_inode, this is - * because when we do btrfs_get_extent() on the free space inode - * we will search the commit root. If this is a new block group - * we won't find anything, and we will trip over the assert in - * writepage where we do ASSERT(em->block_start !=3D - * EXTENT_MAP_HOLE). - * - * Theoretically we could also skip this for any NOCOW extent as - * we don't mess with the extent map tree in the NOCOW case, but - * for now simply skip this if we are the free space inode. - */ - if (!btrfs_is_free_space_inode(inode)) { - u64 unwritten_start =3D start; - - if (truncated) - unwritten_start +=3D logical_len; - - btrfs_drop_extent_map_range(inode, unwritten_start, - end, false); - } + /* Drop extent maps for the part of the extent we didn't write. */ + unwritten_start =3D start; + if (truncated) + unwritten_start +=3D logical_len; + btrfs_drop_extent_map_range(inode, unwritten_start, end, false); =20 /* * If the ordered extent had an IOERR or something else went --=20 2.39.5 From nobody Fri Sep 25 03:20:30 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 003DD3DD874 for ; Thu, 17 Sep 2026 04:00:46 +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=1789617652; cv=none; b=bJm5IHFeL3QPQusj6vF7aTCuEz0siUUN/5h26cP6w10LjNoqIGy49LZw9f502FbBqRQ/XUgy8mZ1qhnnTvD2b8jWXKNMBWljlia8ThFtcFJVhdUIwaHXsHVoQTn8j9fYOjnn37xmoh6Zd5tSVJCzvYo+1mpclJd18dr2q2ereuY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617652; c=relaxed/simple; bh=dkg0MwKLg1iLy+Etq/q2Hvf0oO7DoeoyOqsWTmh7O0I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Bt0+FqG9LLQEEbLNN77l+pE46YOXGEXIMaFnp772TWJrESsUTtuuxxGdo1F9SSm9+IGKK37Dg6XZAxklc5ePC2zJjQBg3VHZCaL9vDKzpFUif4c9AVHnrcmDBx7jaRkPC0uZmjAVS1CD5d9eRMZi0l5PsRHOErHHJx8A5zNGc0g= 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=nov65+12; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=dEMl5/Wt; 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="nov65+12"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="dEMl5/Wt" 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 68H2YIHo3508956 for ; Thu, 17 Sep 2026 00:00:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=V0ci pskccyeD14O9cgglEpzzEgLikHPr63hXXeLz4FI=; b=nov65+12Z9nhvKfiI0qV eXoQmZ4TAj4b64TSAR3NH99PnUfzMBqsxe6/1khBBZdrj/5onAt4B/VwCN+Kiy6A NN/d6mgRzMuc6waj8p4s5wSHDeMj12Om4Z/btXS2KYQIFK9EN2YygoE0Dhih3v5S BNcItmv6H4OmVqufi4INHTzL3voI33PRF7viUIpgXzvwKWVc9CHXxtDPDyqcGogj 359YqGnwPs7P/qKrQNRNrHUvco4ja+DMSm8ofQwmLntnCcR+0R2SWMEKPtIphtwa 0i7V82KSkZYUQOdJ23c3m4+vM3QrpOGPA6aqeIb+xSZDXeP0LCoAybb60QjVA266 ow== 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 4gr3swhd0k-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:43 -0400 (EDT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-9106fce784dso7116526d6.2 for ; Wed, 16 Sep 2026 21:00:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617643; x=1790222443; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=V0cipskccyeD14O9cgglEpzzEgLikHPr63hXXeLz4FI=; b=dEMl5/Wta4nufqriZZlz2yErT85u/Dko8pkJzYF9+97d86ZMXr3MUbvcMxlnT6WbLF JUtNLryWgE6x3NCvPYoTv3vfDhDevlbPDbJuAKY2G5STJmSqPKyy/VjOJZoRnMReg2j4 CrBx2Ql9Ug52wPs5nwkhnYI4xQamnS0VRMOcubuBXOCVcLbUH9Ycb6y/NL+P4upslDLI 40L4moHxUD4Ruf1Pr8PbzOnY991GHXtXLcgI7A21vyJC/SaS021gity42W3su/2aq/LJ oHJhZ1hRcgfW3f9c7MWOJzMFcE3cW6b+HWto8gpBcW/dGIi4swHKJ7V/FJ9G2r5ZVjik Y6WQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617643; x=1790222443; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=V0cipskccyeD14O9cgglEpzzEgLikHPr63hXXeLz4FI=; b=XN8krSHBhPF5V4z72Gbn64GGLDNCyxuNxDMoZElluE4wEVmWoTiV9FJvP+/zLFsiGX 0HfK/IXM9RPOxXkfEVk+WXQNAKUY6FK9Ws1j/Nr2WWlzfEmlcYfYvjI+si5ObkSqcIiF m5VB+iiV+zVyxoYkKSOkZgbeg1CbkYohheEFXy9Lqyq3aE/AmQGXYsrWBioCMZM/Gwp2 MpYuKT2B2leSTAjY/QqGZXCe43VofRxAvQR8lhsB4srr0+xlkJiVzVxrGBHCxLAGScSx q9xwEiNsyY70REYgbeElUz3a5dJLds6TdznCekxZvmkkokE9R+U5XtWwlP9tsvSIqFMF xaiQ== X-Forwarded-Encrypted: i=1; AKwUvByG8OfsJmQpSFahaVeF+Z/IbSXG5Q9Xw4wbCh5nehVwKhnl71zdX11KDVqTOCTJZIPnZklAUlQ3KXQ/L8A=@vger.kernel.org X-Gm-Message-State: AFuF++mTwfmXKZUgictY2DdLLme1xAUguqyGPiQfHJZvZ8cVYQuZLazv z0CiK9uVUOa8Rfxvt/e2w+NPZ3Ozo3dNSwdFLb/wZPq+/5S07I0LclJdL7H9GQB7zf+6Rbzf+O8 +WfxGqMWXum+jCgCicgCDjrkJ3JzxZl7YrkX1w1rlIU1ndSKwf5Fbkb96mBM64mEWtvZbEg== X-Gm-Gg: AYBFou1lDYgEZkYTZx1OkVHYyUAYhremcsoUT/gNvkC4kVNRQx6AtKBzEJWxctrrfau pcV6U30f3nnsEE6Cu7G2DJtIrJJ43qJ+WfxEHI5uM080wz1RuUCQcI4uwCCR4ViqezX3iKR/G+A YFRmXwXR+KiPC+7r5opCmEhXxKcEXG5FevPhG4jnQjJ4b69kEtWFE/nnhTa1lT5fc/1m7foFl6Z 8jecVvZfQ1PI0yyeFGQlIVWGri7ZyO6KJLBGnaZy9RFD+toGCYgLtnYwCjsJshYSTCItZhXHKsb LdkRWFEVjutPrJR2nTM9RndIy8oKp4wRoorb3p8X4nzS1Wrl8bESdB66N3FgFy0F9wQgWKRB8UF 12wlV34PdrrxmqH5nFt/5eKWgPnV4sv3+T6eEaY6svJT25Q== X-Received: by 2002:a05:6214:27cc:b0:912:d20:9b1c with SMTP id 6a1803df08f44-9123d623eefmr113520686d6.0.1789617642652; Wed, 16 Sep 2026 21:00:42 -0700 (PDT) X-Received: by 2002:a05:6214:27cc:b0:912:d20:9b1c with SMTP id 6a1803df08f44-9123d623eefmr113520116d6.0.1789617642226; Wed, 16 Sep 2026 21:00:42 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:41 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:11 -0400 Subject: [PATCH v3 15/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-15-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=2215; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=dkg0MwKLg1iLy+Etq/q2Hvf0oO7DoeoyOqsWTmh7O0I=; b=crUukIonHY8WCi0LJPxP0bKL+Bb/MxcEvBr0jgqWwBVRwDsLb/1e5hnD1DHxun3ZG/cGb2Uaw zCNpVDHVqPlCpxGcwOPwMvoSvJNA30NlVZ9HRIJAU9y04GEusPF74zd X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-GUID: qEFaLAF4sAz4F9sVivNR7MrUVYdd_Ehy X-Proofpoint-ORIG-GUID: qEFaLAF4sAz4F9sVivNR7MrUVYdd_Ehy X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX6M0d+a/De1B5 amxip7zosIisx55oxBjVNJcSvXfc74cIWu+ACEagc9qUGGGStflxTTnqO8ukM2NF6Sf1tID6Syg 4pzq01XvMoVo1Z5cyXFvSW6+GTeYz69k3riXEOnHG2S6Dzi26N0E X-Authority-Analysis: v=2.4 cv=ac30Dhot c=1 sm=1 tr=0 ts=6aab65eb 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=79PYxaXUQd1wl-QFWJnA:22 a=bn-TaVTt-omw3cABb-QA:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX/LZiQ+XElGqr h0DJi0vlqxXzqU2mtc2MWAkrUQYnKErVu1KCdSFaPt2WWYgHfAPhA9EJNd7uOKofRxRzOULtJdc 5SEqrI6mwxA1HnVHBe8KvCcMrObNQPy3Owvu6pvu9pvSegox4egbwwA49AH+LUXhn7pAmhhUAgN Tm+JuBYOLFmgbWd32uyTCklCfwN1oroa8LOM7mXQ+Au9ielUT2KVdMoxeB/yHnKrZOjA1kMZYqP kyNNmIGAo1apRWEZdUCbKGH33kqpfitOQoadz01jywvauH8mbAg2YUBYwj034Wcx3z+i1Ad/KvZ ZhBAamVc2oXtGnPBKhwOSzwpjd/glq//P/YaoLzd6Iz3lnX/+RwCeMVI0gXnaluni7dYL8KN3RC aLaTCEOzVJ4gfTNSrqCcmkkqBOx9LfC4SX6YbSFCzIuGhdpAUeG8zo0wepa6LUcp010HPpyOoPh Qx7sULZkELBAqLIcJvA== X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 bulkscore=10 clxscore=1015 adultscore=0 lowpriorityscore=10 phishscore=0 impostorscore=10 spamscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 Free space inodes never have delalloc or outstanding extents any more, so they don't need to be kept off the root's delalloc inode list or out of the outstanding extents tracepoint. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/btrfs_inode.h | 2 -- fs/btrfs/inode.c | 5 ++--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index 26cc5d1aca4c..795bb222a2d0 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h @@ -402,8 +402,6 @@ static inline void btrfs_mod_outstanding_extents(struct= btrfs_inode *inode, { lockdep_assert_held(&inode->lock); inode->outstanding_extents +=3D mod; - if (btrfs_is_free_space_inode(inode)) - return; trace_btrfs_inode_mod_outstanding_extents(inode->root, btrfs_ino(inode), mod, inode->outstanding_extents); } diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c8292174b550..89b50d4e0400 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -2614,7 +2614,7 @@ void btrfs_set_delalloc_extent(struct btrfs_inode *in= ode, struct extent_state *s * and are therefore protected against concurrent calls of this * function and btrfs_clear_delalloc_extent(). */ - if (!btrfs_is_free_space_inode(inode) && prev_delalloc_bytes =3D=3D 0) + if (prev_delalloc_bytes =3D=3D 0) btrfs_add_delalloc_inode(inode); } =20 @@ -2672,7 +2672,6 @@ void btrfs_clear_delalloc_extent(struct btrfs_inode *= inode, return; =20 if (!btrfs_is_data_reloc_root(root) && - !btrfs_is_free_space_inode(inode) && !(state->state & EXTENT_NORESERVE) && (bits & EXTENT_CLEAR_DATA_RESV)) btrfs_free_reserved_data_space_noquota(inode, len); @@ -2690,7 +2689,7 @@ void btrfs_clear_delalloc_extent(struct btrfs_inode *= inode, * and are therefore protected against concurrent calls of this * function and btrfs_set_delalloc_extent(). */ - if (!btrfs_is_free_space_inode(inode) && new_delalloc_bytes =3D=3D 0) { + if (new_delalloc_bytes =3D=3D 0) { spin_lock(&root->delalloc_lock); btrfs_del_delalloc_inode(inode); spin_unlock(&root->delalloc_lock); --=20 2.39.5 From nobody Fri Sep 25 03:20:30 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 2CEEF3D79E2 for ; Thu, 17 Sep 2026 04:00:47 +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=1789617654; cv=none; b=cNVCbMImUmcHmX0iyFoNfMgFNEWzFI5cqU/TOXvm0cramzZxpDi1rElEj8/9EO40dXaX5wr9BG5KKqH751kxqf+koj+ki4zB+blt2ot/k/CwtCxEN1oitzx3w9dUktv19j3fpCSniihSQ1D4uo8k8kV1xvp4wKv6R7IUjvkqgNo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617654; c=relaxed/simple; bh=IxPtZs7YmG0KTAjKIomldxp3suS2xlB2WlerF1Jtwhs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JyXBCLF9XZdXZMGhxjwNnN42ivirAVVPOd+HZcX+gr7mzAtKMRkQM/WzRD4WOd3CuiyaNEXWwozcTFMupb24F9q8XWSy0EBEfDLzcnyEaIaWoNTgrxyLjtEGreOqf/2ZmXiOx2kWqEu305Tb4supcPddSiq3LLzYeU2Nmf6C3fs= 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=jBWqvs54; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=DnVXREb1; 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="jBWqvs54"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="DnVXREb1" Received: from pps.filterd (m0167069.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68H2ZK7G204163 for ; Thu, 17 Sep 2026 00:00:45 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps01; bh=Jdph n3uGMtosHUIIlsCZR+S+zVxJ+iV/LKrDbHMNan8=; b=jBWqvs54mnDIo1aIqZK9 yVR25BlyLqn8e83YUlNsbNiJwXbJagnj1+I7tbYD+oxatgwvsbjoBKYapCV8bRop 2wllUW3QmPbud7FjGu1knXX0F3HzkJ6wUD6YJCTxmjBwfu68D+Qq8v5J1u3yOS8F 0hVbL++SkUOdVRl6O6lT6yOPfS657cBEo0SZ0kEmSnYMJOKAbOGDBJh4iIj5D/eM fDTF6dMMDkBpX3BGomJC4OEltGeRAzz9e9ZPOXs/L+OFrGYXiE6jPAyMrCpaT2th mX7r03J1LDIAcA5nL9+gVP0dQidl83Ckmw+JjX5nSRt3xcxu+fu3BRJBG2XZYShm mA== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4gr1x6adqg-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:44 -0400 (EDT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-9104ba8bf51so11352626d6.3 for ; Wed, 16 Sep 2026 21:00:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617644; x=1790222444; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Jdphn3uGMtosHUIIlsCZR+S+zVxJ+iV/LKrDbHMNan8=; b=DnVXREb1k+5Vu/LNzsm0NQ8jhmEKyZatmgPc5eGOU2VYUwJWGSQOZVeBozDFdVJTCb 0ppeHDcrQHV6qzlqMZEaDYPTk8y0CUgkk2pTKOQqJviMQOmMZFpJcJ8wUacvnfJT7ZVw 2a+rbNGqVwHb/vvAo/jeLwnX7pnDEoP8C6RuAyBw72y5t1ONj5GebPgQukdMt+YxPnIa 656+vEXC0wiIF/IQIKK9sexBQJiFZfupLeXRVutwVlL9Fbc2S4Ye6dOxMO8S19VcaqFS sbKZxk9dHFkSDNY+K+QgHxY4U52sFExQxCXTJPLjcirssac4VzPNv1+h4y4gNF36IkWi Dhxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617644; x=1790222444; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Jdphn3uGMtosHUIIlsCZR+S+zVxJ+iV/LKrDbHMNan8=; b=bpnjNkGpUm3fOrwOAGOPaLEM1ofzdzcAV7pMXNT0PA/5KK2Fpah5ImKLea6TUghNXk wPNWYT72wT+8f1YzMZZU7hhuQdmMD4rk/wtBvUiqYyhGuiCcIPSCSTkrHjuGZ9DNvjHE 0+8o/H9oZa+sZUB4ov6+1vMdwY/kHI847WfC9TamtZAEUAlyl9sBiLu6AGBE2U8KXqW/ a9N20pcFDePxllWGZ55vjmFGPkrimENIporBTLOqozUhYb9F7K8uQleLP3rmFAuz0U3G zeC/JnRnk+MIqx+oQC4OUqOTHPJrMmsyuI5g9zRxsxBrCDficZGoozPcksfRWT3Ypny2 pfhA== X-Forwarded-Encrypted: i=1; AKwUvByVEp35Vc5rvg+1D6ICkJOvGO2L12ZChi21PkHYpUBdXIxARgFjb1wnVG8a9JzcqHDGyw/jbEMqT/tu4ZU=@vger.kernel.org X-Gm-Message-State: AFuF++lRycKKoDhUXzAdnK+FlxydOcAuMXYaRSws9u2xZ1zBfa3vcBbO Zoh/Y33rn2xl5UP8sFMv6PjRiVcGKS/RifIo+fkNPSd6O08tPHXfVs865UGa/v58YALuxjGElhP U5qgD9x9CYOmdnDSFHz6VvVSs807HijmkIZJNcIDOXOjLpKsW1HYmytPHpFd0QVgQiMqJwg== X-Gm-Gg: AYBFou3KX0EroXX1Cxeh3dNMHgMfC3IDgZNCZHuoY/b3seNtSf6qPP1dKTKLBgS94rA vkSLqPIk5kmJEgk6t+uawzvsmI+JriQs25p6EUFiJuOZfQIJMThlN7LdmUBfvFVW4rZ5WIxy0eZ /JNtRX0PHc8mP2HtUltlBfbzBYuUBofk5ypYwo7D75I6tyd+oBi40zkrOIc9uyQgRygfYD1YWfK 5EXVv6NXU+JRArvsXthB81me4mUqSr2PJCaWp+Gx/9KggWKDzxbG9vtxXZyJpTxobKpSTF5OEMe K2oOVJrIAoHL/yCcOK9gJ0pRWPhgHtcVHB/3oC0HFWl0aLCVjFsvpk6yltIhNYXQkitPeBGPHSq 9FuAsY4VGcVbrHijiE12e93smBaZRE8BuBdJRqAlyywcxIA== X-Received: by 2002:ad4:5d45:0:b0:911:9385:8581 with SMTP id 6a1803df08f44-9123d7ae3a3mr129668016d6.28.1789617643773; Wed, 16 Sep 2026 21:00:43 -0700 (PDT) X-Received: by 2002:ad4:5d45:0:b0:911:9385:8581 with SMTP id 6a1803df08f44-9123d7ae3a3mr129667166d6.28.1789617643145; Wed, 16 Sep 2026 21:00:43 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:42 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:12 -0400 Subject: [PATCH v3 16/17] 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: <20260916-btrfs-remove-v1-space-cache-v3-16-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=1999; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=IxPtZs7YmG0KTAjKIomldxp3suS2xlB2WlerF1Jtwhs=; b=Aso/K61JuzYV1IXg9ODiIIycpGya+BidjJzb+j2Ylt8lMPgSGYy9gKZTl+bp87+m2eq/yX47j 7GYE+kju94zBP9MDPT79CEZzaefV9juV1JZjAjY7TBklAhIUsuhNr0y X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX8Mj+MzxbsH3J rLX8kiu/6GtISHIg8YQHU8ltKAQo9nGRxXJO94gIYOLrMFd3+X09+TBE8kO6s9alTk8DR+Z3Gbg xCSjEYVlOiLsgG1N1kQ0fUo7tnJLEvuhBRbiGhabV17l2bGZx2IS X-Proofpoint-ORIG-GUID: Jq2rhnml6QEWjXR_UcLQkKF1N-IpbiSW X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX5UVD5jbB32ps E78SSiGzwHPC/QjEDtHu4DflHLchLBnko/vEPuxgAbnws5uQ8CtPlBaq9CXOCBHmZDzLCy8SZp2 r0GXl5fX3ceTcAg/uF4j+FKNd4cjGXX8OLA1lgZ4Z5+TYBxeGQIE7RYwfmsXoISr/WC9SknMg4+ 3k/T7/4a0YhpRLaWQQXNBUO1Bij5JcF7i/vd+/pBRX5FObk+Hz2lWFNP68G6PADTKW0IGXnE5HJ 0y9JDsYUbLo6okQ6wsV2i2XOEne3op9TaIphCPBS2dpOA50U3bIgK5ZKcLRGe8IXfa4gqEUcBeT yz2Gt/LdWqUwcPxDuuy80mSnGmCOjdrqWY/haVY7Kz1GUbchbA9b6f/+YW7OZNOhBzSNjw4OHQt lqhnFTP/BZxoHQWPzpOJ5lPgnogWsMa+Tj/XTOLOaJC6yrMcK8pa5jeHP9sGrYyNfDEPhzwaz07 X6VOM7OGK7w6QuBeg9A== X-Proofpoint-GUID: Jq2rhnml6QEWjXR_UcLQkKF1N-IpbiSW X-Authority-Analysis: v=2.4 cv=CLS/zhrD c=1 sm=1 tr=0 ts=6aab65ec 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=JR4YdQiviy7OQf72WyZ1:22 a=F-rX_8kjA07mH5tGMmcA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=10 malwarescore=0 impostorscore=10 spamscore=0 suspectscore=0 lowpriorityscore=10 clxscore=1015 priorityscore=1501 adultscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609170047 Free space inode data was only read when loading the v1 cache, which is gone, so btrfs_get_extent() and btrfs_lookup_bio_sums() no longer need to search the commit root for them. Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/file-item.c | 11 ----------- fs/btrfs/inode.c | 10 ---------- 2 files changed, 21 deletions(-) diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index cf50fd623f41..484c04de1af5 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -396,17 +396,6 @@ int btrfs_lookup_bio_sums(struct btrfs_bio *bbio) if (nblocks > fs_info->csums_per_leaf) path->reada =3D READA_FORWARD; =20 - /* - * the free space stuff is only read when it hasn't been - * updated in the current transaction. So, we can safely - * read from the commit root and sidestep a nasty deadlock - * between reading the free space cache and updating the csum tree. - */ - if (btrfs_is_free_space_inode(inode)) { - path->search_commit_root =3D true; - path->skip_locking =3D true; - } - /* * If we are searching for a csum of an extent from a past * transaction, we can search in the commit root and reduce diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 89b50d4e0400..163f26fe36e7 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -7230,16 +7230,6 @@ struct extent_map *btrfs_get_extent(struct btrfs_ino= de *inode, /* Chances are we'll be called again, so go ahead and do readahead */ path->reada =3D READA_FORWARD; =20 - /* - * The same explanation in load_free_space_cache applies here as well, - * we only read when we're loading the free space cache, and at that - * point the commit_root has everything we need. - */ - if (btrfs_is_free_space_inode(inode)) { - path->search_commit_root =3D true; - path->skip_locking =3D true; - } - ret =3D btrfs_lookup_file_extent(NULL, root, path, objectid, start, 0); if (ret < 0) { goto out; --=20 2.39.5 From nobody Fri Sep 25 03:20:30 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 8DA643A1E96 for ; Thu, 17 Sep 2026 04:00:47 +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=1789617654; cv=none; b=PMYfdV+8rfueQD4I8JGm99Xtyi6lyKgiOb9rDsCn9EGwiwC9bQ8kJLTchtbM8gvu1DwfeN4U2/VVBpdy03FuZiol47gqG1iy7gNaCiCmQDb94btpi3EpRTbb4D9GCI0rNbxLN0VK6kG1hod62reSWZ525C2n07Z+qqO08ySKqu4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789617654; c=relaxed/simple; bh=ZPOc8twdoJYnvUc7fRjG1xN2c4tNuhM2PWHVMpPgEr4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RXnBepP4jsDV2+6xI7RW0BdF9mBGGNEcFx1TzwTL5CU/VXI9rv0BqnrqRaYRGvAQopmsuqM0EZDn35dFK2RGprOi9OSf1ou9aNQWXuqqux3yg82hLhl4rVEx9T8ViGnauUkodG7Df3s8BOhHrRuqAlzyPWmQOL1I+/aNnakl+Oc= 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=aP3XNQcb; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=V0V2/tE5; 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="aP3XNQcb"; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="V0V2/tE5" 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 68H2YAkv1938433 for ; Thu, 17 Sep 2026 00:00:45 -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=Z75e wDbISR2PJ+Wj16J7HvLLuCXx+W5s4xQMYYFw36Y=; b=aP3XNQcbiU5L9MmssMz5 VAo4YbqpIV/7CYx3YsRhOjqQHScQoFK+6UMGybCQG7PzUWgrO0Y0g1+qfGN3DYps tsn3DrWWzxcJ+rMHdeFnQAoUFLSNA9F/wMbdauPOqEQqn8HP/spvejewV9Em5PuZ XPoddc58nGpFGnjlDevmOM70GlnkwMLhVK2va4BCkQcK9CBMtaolqo77tvhtNFUs wxTYGYiSGoKRp4eegXd+5Bvws5lhsa/0zd1ydVieR+d35gYLBr3DKBJ91PKENFuN tHvfQfcTeq+N+Ma/0EE/lMlG+bw6rftNEeXVIAmgphNRj2oucvBIENUwbtOhca6S 6Q== 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 4gr33qssf1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 17 Sep 2026 00:00:45 -0400 (EDT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-90c8da50f8dso10673596d6.2 for ; Wed, 16 Sep 2026 21:00:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; s=lionmail; t=1789617644; x=1790222444; 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=Z75ewDbISR2PJ+Wj16J7HvLLuCXx+W5s4xQMYYFw36Y=; b=V0V2/tE5I1mkmraAWtyOb0DtiS7fl9QFOGpQXF6GQrqATIufJBAl3IleLvbKWIpG+z d6FZdQkrJhpqtT63SdGoOGM4wsL3KSPI9+ONX87GcyEYryTQFxviNAVG7LiomHzFKw+q v+76kSW+JW217JoNRj7i7rb/5jd8GFRN4Oh/rxO0c2ldz4bLb0LLOimQCPxA9xoh7mhj YYsQjlVhjtu514waLeZT1B541GgSb6ZDwocU+ld2t44WX0uqjKRWm//36UI/k4fGOkkm k0mYGL/onQu8qFUTTzMfbYcdNEQf/O/ybAPeiwU/dh6pOFhweJRu3+OX9xuA2J6JxQQL jQKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789617644; x=1790222444; 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=Z75ewDbISR2PJ+Wj16J7HvLLuCXx+W5s4xQMYYFw36Y=; b=esYHfSFUBJ5x5zwlRJAA33BKhc3wMrD+BObJOJQaUjyQ8mV1xDYXuhyyacaHr2PLJm bN3kqi0A1B9/N0giiWgvTLKj2oyjrfv+IqmY8wx/F6qZSU0zzpJBUhMj6v8N+V3bsYRu F2VNcyX4LZlW/ikNOG8dc29JdIYHlX/laxD3tSzar7/ZKuY7j3DACDyiwZtSowtO6aYy URVsHHzQQB+p9T+zCUVdpi81MjIQp4h1vtf/oELYrG1X0aTlhiwWRtwFaHZv0nxlbizL a4H+8gBf1mAzGOvkmMc0nJpAl87NWiNHXbMoj0aCIvRe1nlhRRYtJUfWh1W3iuIMGpWs 8C3A== X-Forwarded-Encrypted: i=1; AKwUvBybaAIiZBXBmIPvVBIfyGoKku9bTTwZYmZd+KY3NidYQh58xvG7B8YXdFC1Bpf4Th4nwo291TkoRCLf5Fk=@vger.kernel.org X-Gm-Message-State: AFuF++lHfTFD0jwBSUl5zSoA/ryuqM1R/V8bceiy9k2CZRoaYqR5xASI /cWPAZEEukPcGGOpN93IODMLPRMfwnK0/1Gx3E422PZSIpWL40nGK0PQqHyUptoW+BUcSQoR53D kCmmYOvv0mno6oI+X0l8dlTXdc5nEeSgnQC56m9hvP7Wle6xnX+7qZvl78onopw5ZSuDfyg== X-Gm-Gg: AYBFou0NzlaWkHr3qfIBmfK9SC1EFs42YuWjY5ozZQBgkr59Zy9qwgapZb3AHMEmsNk v2z0DrwWY4knwT9CcIEZT44IFSJ2xkdcwhzcJSspmDkV3jLDnvOdt6Giu9S/rnuSO5ukg0UeRY9 9xYukThnVN3E5bC6mZAtjlwfbBM47UvALR451PPU7VseLWOA9zUl5OYF/SzIZ1+OHk/U3+s8+OR Fhq+bQmHiBsRsbngSD2JjvxiSTFV7KvaNH+YbDIbZS8OtE4p5DemlKVoZ3vSsvrsph+EkNXbsOA 9zusZUokr0XQwmFQ9cLXucZZgLKTZ1GlFiyhcJEstEzrqkluhVkaGyJo+TP30gIzSLrxKqr9cF2 ZJuvgMXDpj7fl2bO7IBUpweXsTyMgCDysFzdKyblTAotNfQ== X-Received: by 2002:a05:6214:2d44:b0:912:35a6:3bc5 with SMTP id 6a1803df08f44-9123d7ad39amr105291196d6.22.1789617644295; Wed, 16 Sep 2026 21:00:44 -0700 (PDT) X-Received: by 2002:a05:6214:2d44:b0:912:35a6:3bc5 with SMTP id 6a1803df08f44-9123d7ad39amr105290576d6.22.1789617643858; Wed, 16 Sep 2026 21:00:43 -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-9123beadde6sm41748766d6.35.2026.09.16.21.00.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 21:00:43 -0700 (PDT) From: Tal Zussman Date: Thu, 17 Sep 2026 00:00:13 -0400 Subject: [PATCH v3 17/17] btrfs: remove TRANS_JOIN_NOLOCK Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-btrfs-remove-v1-space-cache-v3-17-10ebde03b96f@columbia.edu> References: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@columbia.edu> In-Reply-To: <20260916-btrfs-remove-v1-space-cache-v3-0-10ebde03b96f@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=1789617622; l=3141; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=ZPOc8twdoJYnvUc7fRjG1xN2c4tNuhM2PWHVMpPgEr4=; b=jfup3H0MxW0SR3BgpvfgxVCp/Fl6/Fw5j8+MGSE2EPYtLP6QaEDhbiYnINB44R0Qcz8djKYlZ yG7M0cHyO3UBYnZ3QWAeyHiEvhL8Pq8X8LQRqSzqkaudYn2Mz4KsXU7 X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-GUID: GIKhMDLGk2ZON8v71lFvVNMdzVkFAac3 X-Proofpoint-ORIG-GUID: GIKhMDLGk2ZON8v71lFvVNMdzVkFAac3 X-Authority-Analysis: v=2.4 cv=O72sLx9W c=1 sm=1 tr=0 ts=6aab65ed 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=SsB-OO3BMngHh3ZO9fOt:22 a=bdDZCe7T2lofFMgrKTwA:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfX5iTp2wW6OmZc hq5afrxZXDOOsupOieSwpgHb0xxQUWEL/ilr8Vn6HNtAWm+qCdVpksp+BppErTK6S7IPmmasELs jzQMeIylBbyd+UnBBcoGyzhElm1W6Hc3GAJx/L9a5Pnh9+CaK8m/efM622xLakyf+TEufSPhADd PWRvYeBjaH07gjjmLyv9ZZ0Ko4v/I84qMl7lrMdernOzfEyNRk7q32JxFtbd+FqQiYFpET/R2Q3 ZITE9XhBmWvbYNtsR5uIM/PBG0zZY7RAP9nU3QnY8sugb3B9AQB+kU4yK0b7Ex6b6a8EubhEtfx GHdLDSoiZvcQvlh/nIIg9XBiB/YD+xu/uojnRnhqmBlvf1ChyaFU5JYjK5GUIcz85u3T1zRX1Nq 16jd54vTvKpNa7N+Ce0mwTWSyA7yDON86+paFy0iiIV1JrRHoLCKA4+hGsApHyiU567nFb5Pfsd vc9fW/+3IjVNHSdLJng== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE3MDA0NyBTYWx0ZWRfXwQdYP79/sWxB fZUUdK/IYHf0A10bPaWU90jVCVUNMxAW2addmZlZ4axFG7ShJyd5wAQvxRfGWZoDDc2M0C6s5+3 WVddqv67EWvdKtzkpce61TqVk8hIAt5UTyoYLYyJzAU3zIy/N4Ad X-Proofpoint-Virus-Version: vendor=nai engine=6900 definitions=11907 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=10 spamscore=0 suspectscore=0 lowpriorityscore=10 priorityscore=1501 bulkscore=10 adultscore=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-2609040000 definitions=main-2609170047 btrfs_join_transaction_spacecache() was the only user of TRANS_JOIN_NOLOCK and is gone, so remove the join type, its entries in the blocked types table, and the special cases in join_transaction() and start_transaction(). Assisted-by: Claude:claude-fable-5-1 Signed-off-by: Tal Zussman --- fs/btrfs/transaction.c | 17 +---------------- fs/btrfs/transaction.h | 2 -- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index fb026d81414b..e96dd99ce623 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; @@ -709,14 +700,8 @@ start_transaction(struct btrfs_root *root, unsigned in= t num_items, } =20 /* - * If we are JOIN_NOLOCK we're already committing a transaction and - * waiting on this guy, so we don't need to do the sb_start_intwrite - * because we're already holding a ref. We need this because we could - * have raced in and did an fsync() on a file which can kick a commit - * and then we deadlock with somebody doing a freeze. - * * If we are ATTACH, it means we just want to catch the current - * transaction and commit it, so we needn't do sb_start_intwrite().=20 + * transaction and commit it, so we needn't do sb_start_intwrite(). */ if (type & __TRANS_FREEZABLE) sb_start_intwrite(fs_info->sb); diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 6b0da4eaa0fa..556c094eadb9 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -106,7 +106,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), }; @@ -114,7 +113,6 @@ enum { #define TRANS_START (__TRANS_START | __TRANS_FREEZABLE) #define TRANS_ATTACH (__TRANS_ATTACH) #define TRANS_JOIN (__TRANS_JOIN | __TRANS_FREEZABLE) -#define TRANS_JOIN_NOLOCK (__TRANS_JOIN_NOLOCK) #define TRANS_JOIN_NOSTART (__TRANS_JOIN_NOSTART) =20 #define TRANS_EXTWRITERS (__TRANS_START | __TRANS_ATTACH) --=20 2.39.5