From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=74.125.224.48 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1792712197; b=aVVre5j+s+WN4eBs2IbnECnYhwlPEKgxf6MKmRHynpaNBLQXIaHjkKb3C/YI5TVJXlwu EjyL1cd084MW/1s74VTiqsaaCbFrq3aU2cEjIFen/HXJx8uapwLoSXHR8xa6lBEo/TpvO cTSC0ztzE0aC4flChRZLv6lnUn2D1MsZ+lAXy2TxUQpYykGzdAILA/NC0lr7hRvm0q51F a4Z0OhyyVY57obg5vCLPupM56eZEoxEW/HF6sNDBTX4Pnypkc0MQPUpZ9RARqRsRnZtW7 ebicUZypI3XiNWtMJeZNs967efrZmZTMTEqwlWEVswv6ZW6G8MhMoUg6XCY8TJ969xg== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1792712197; h=DMARC-Filter:Received:DKIM-Signature:X-Google-DKIM-Signature: X-Forwarded-Encrypted:X-Gm-Message-State:X-Gm-Gg:X-Received:Received: From:To:Cc:Subject:Date:Message-ID:X-Mailer:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding; bh=vd0cJ9duAzPWkS9K0wzMKp/efF51QEmYJSWs3p1I1Z0=; b=V++Ht6+OusoOZSlE/hEAuepMdzpEWpC7Kgy5+kDbQf1Y/AHWYvlZ2AaXjlJZAmAEdvq7 mkDqjhKmus+1rLL2mwYWYzlJ5CxpwZc4Eovzic0ZWDUUOscbrsj05M+rf1dS988S6Zk9n gcIDeGQTgl+FQXzVzfT1IFQdRdayOvNfxuQmhdeT+mTkz5p03ONeS6+7X+o9peGgoVhvf nhbhVLpzihcUiL1dSn/VB5Xk7ZZg/ggFI2n1hXUw0djHmBae33b2qu6JDWrqUJcHYHe1a wj+DYOuXkmcPCYOuuJ0fPU/MxN0xbdfypeEfBzSUbjz00yKO9zpjyCJJ3wHU20XJ7eg== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none header.from=dubeyko.com; spf=pass smtp.mailfrom=dubeyko.com; dkim=pass header.d=dubeyko-com.20251104.gappssmtp.com header.i=@dubeyko-com.20251104.gappssmtp.com header.a=rsa-sha256 header.s=20251104 header.b=YWEPFA6l; arc=none smtp.remote-ip=74.125.224.48 Received: from mail-yx1-f48.google.com (mail-yx1-f48.google.com [74.125.224.48]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C864C606A767 for ; Thu, 22 Oct 2026 23:36:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org C864C606A767 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dubeyko.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=dubeyko.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=dubeyko-com.20251104.gappssmtp.com header.i=@dubeyko-com.20251104.gappssmtp.com header.a=rsa-sha256 header.s=20251104 header.b=YWEPFA6l Received: by mail-yx1-f48.google.com with SMTP id 956f58d0204a3-6740e7ae219so430909d50.1 for ; Thu, 22 Oct 2026 16:36:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dubeyko-com.20251104.gappssmtp.com; s=20251104; t=1792712196; x=1793316996; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=vd0cJ9duAzPWkS9K0wzMKp/efF51QEmYJSWs3p1I1Z0=; b=YWEPFA6luN/2OpWohFoAlb8EklkjVbTvPyIgVLi+PhE01t2fCYwAjeGq9IA9anJOb9 laSocgVZyAZ0X5vLaAsAH4oMV0MQjWWTPlX7EcMd+8ow7Jh652Q0SiQNRFVy3ZXVfnOf hTx3BoHC7b5QyfMncfJD40E58RaTxbwiZgL/MLulV9hWpRsH8Ceb30musVmJTmTBCjJ3 9vtHXR6Q10Kj4OTPBl73ONZYlQq3VLhfURNL8rg6S3Ez9bZQb9gVHO5FWdEEPZ/nr/O9 9OwWLlxmowINoFJswGsElE1KTMR0IQwTEzQcq0ZiibCGTvtAdmML0fqJ183x7Q3BMGi4 FeJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792712196; x=1793316996; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=vd0cJ9duAzPWkS9K0wzMKp/efF51QEmYJSWs3p1I1Z0=; b=qT2p/uDSUc+qjX/53u4MeZk3DYFLQ4sqSA08ujhbbq5ZTQ6+X0qOcKCA3/xtneGF02 rBugER6D5DxcNPctjZPanMo3rviCi0g8FbbvicadjGIuhYbMzOwVbG86uMp0lr24VL2c DkgNyqorM622GU0V7yJtgxiVplTo31T/mNaXpEMYCpy9pCP6kD9QCB/wzrPhl5mmq+xu DMphKSGM38z7zSE8UEwyaK3I2HRePFQhwZZPHjN0PImHofoW4xSk3wWX9XtoIIS+LZCA Lt/8S9wQ0C7+2ZG7z0mcbqRXfDoY7UeydrB8p7xvFhFuNEyjSWb8Ora1rXU2g4SuH9Vg VR+A== X-Forwarded-Encrypted: i=1; AKwUvByIZKQEIv3Z1nJsS2/rCNOyDwnbiXnKQC3PDuoW6oRXkjLQAdmCzSYzyfTthP4jbNTs5bEG9ff5I5H0TFY=@vger.kernel.org X-Gm-Message-State: AFq9FYLo61AhcU/bKVp69TWsB8QUdzL4Pxayn1mbQzVvy3le1JeH8AYm IKYGq1SuhzJvofWOJ1bTy67g9YLvgLm777ndA9o0QNeJ7pCDDh+Ihjk9XYxFI21/0GQ= X-Gm-Gg: AYBFou3JVsWvTiNTmnyD63DRwQutn2HEmF4GTivpeyUtA9+zIbG/9asgCAGjWE5Vmil FBGNrWrjYIJtgCRhhzoQyxjZ0Vg7ACYSNRVrimOaMo/jgp63DKYRJn4O9LjDhRnarGfMeKflKJP iDmweM2AnNECCLwhpIL5ZvVdAMd+92g7OzT5TXr1t/Xu/mx7Ch21tlan364VS8lsXwcViPZLaIB 9x2hrBl/FUysDzfraTOILhk2DQ5tCFKdvCzbOZO9x4sUzdmU8qo48jy2509SD2+h6HAJviIZY2w MTjuPKP26MD2rgo9Sa1Spba0qJ+72pCOvCo3+kj9TwVLKgesr21W8T5HhkqS0/7lZqdl8BCXwte 5NbJvZlUBLqmg4zAUlL8KyOBdGopEOVPjZk52eUhOuePKYBR3X3UHDZPgmYPqGJdabDwRO4rfCa lhYfJgVNl8KYoPqC6GvOquCI5Ul1rP2DNHmtkqOK1sSIZsM8ojLxAW12KvWJ796IifcZRvDlQBO 6KrPBuCGP+sYDFaQdYRVjcY8cuiqiWgmoFXc8F0m/K41FpqFV95Jexsf6Hnsz3v8XUbXxrwX6lc jUh9kLrV0DQ5dIdOTfEjRhCayc2YLk+5n8M9KidGCm6NtcpzYSn+LhBi8Q3pXR8lcltU4RkSPYT eONyq6blqLg== X-Received: by 2002:a05:690e:1507:b0:679:c803:98db with SMTP id 956f58d0204a3-67a35c0c3famr245359d50.149.1792712195858; Thu, 22 Oct 2026 16:36:35 -0700 (PDT) Received: from pop-os.attlocal.net ([2600:1700:6476:1430:5551:17ca:f374:dc57]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-67a34009247sm487643d50.11.2026.10.22.16.36.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Oct 2026 16:36:34 -0700 (PDT) From: Viacheslav Dubeyko To: glaubitz@physik.fu-berlin.de, frank.li@vivo.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, vdubeyko@coreweave.com, Viacheslav Dubeyko Subject: [PATCH] hfs: fix potential race conditions in b-tree functionality Date: Thu, 22 Oct 2026 16:35:48 -0700 Message-ID: <20261022233548.3481882-3-slava@dubeyko.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261022233548.3481882-1-slava@dubeyko.com> References: <20261022233548.3481882-1-slava@dubeyko.com> X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The HFS_BNODE_DELETED flag is checked in hfs_bnode_put() under locked tree->hash_lock. Add locking for the case of setting the HFS_BNODE_DELETED flag in hfs_bnode_unlink() with the goal to avoid potential race conditions. The hfs_btree_write() method should be called under tree->tree_lock. Rework logic by adding locking the tree->tree_lock for the calls of hfs_btree_write() in hfs_write_inode() for the case of Extents and Catalog b-tree inodes. Also, add the lockdep_assert_held() in hfs_bmap_reserve(), hfs_bmap_alloc(), and hfs_bmap_free(). HFS port of the HFS+ commit: commit 6dca66d7ba17 ("hfsplus: fix potential race conditions in b-tree functionality") Signed-off-by: Viacheslav Dubeyko cc: John Paul Adrian Glaubitz cc: Yangtao Li cc: linux-fsdevel@vger.kernel.org --- fs/hfs/bnode.c | 3 +++ fs/hfs/btree.c | 5 +++++ fs/hfs/inode.c | 13 +++++++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/fs/hfs/bnode.c b/fs/hfs/bnode.c index 1b331108d9c0..93a13ece1eb4 100644 --- a/fs/hfs/bnode.c +++ b/fs/hfs/bnode.c @@ -271,7 +271,10 @@ void hfs_bnode_unlink(struct hfs_bnode *node) tree->root = 0; tree->depth = 0; } + + spin_lock(&tree->hash_lock); set_bit(HFS_BNODE_DELETED, &node->flags); + spin_unlock(&tree->hash_lock); } static inline int hfs_bnode_hash(u32 num) diff --git a/fs/hfs/btree.c b/fs/hfs/btree.c index 4f0ddc76e8c5..b140d8597474 100644 --- a/fs/hfs/btree.c +++ b/fs/hfs/btree.c @@ -398,6 +398,8 @@ int hfs_bmap_reserve(struct hfs_btree *tree, u32 rsvd_nodes) u32 count; int res; + lockdep_assert_held(&tree->tree_lock); + while (tree->free_nodes < rsvd_nodes) { res = hfs_extend_file(inode); if (res) @@ -424,6 +426,8 @@ struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree) u8 *data, byte, m; int i, res; + lockdep_assert_held(&tree->tree_lock); + res = hfs_bmap_reserve(tree, 1); if (res) return ERR_PTR(res); @@ -500,6 +504,7 @@ void hfs_bmap_free(struct hfs_bnode *node) hfs_dbg("node %u\n", node->this); tree = node->tree; + lockdep_assert_held(&tree->tree_lock); nidx = node->this; node = hfs_bnode_find(tree, 0); if (IS_ERR(node)) diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index cce3a7bb95e9..9dde4b43c88f 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c @@ -468,6 +468,7 @@ int hfs_write_inode(struct inode *inode, struct writeback_control *wbc) { struct inode *main_inode = inode; struct hfs_find_data fd; + struct hfs_btree *tree; hfs_cat_rec rec; int res; @@ -481,10 +482,18 @@ int hfs_write_inode(struct inode *inode, struct writeback_control *wbc) case HFS_ROOT_CNID: break; case HFS_EXT_CNID: - hfs_btree_write(HFS_SB(inode->i_sb)->ext_tree); + tree = HFS_SB(inode->i_sb)->ext_tree; + mutex_lock_nested(&tree->tree_lock, + EXTENTS_BTREE_MUTEX); + hfs_btree_write(tree); + mutex_unlock(&tree->tree_lock); return 0; case HFS_CAT_CNID: - hfs_btree_write(HFS_SB(inode->i_sb)->cat_tree); + tree = HFS_SB(inode->i_sb)->cat_tree; + mutex_lock_nested(&tree->tree_lock, + CATALOG_BTREE_MUTEX); + hfs_btree_write(tree); + mutex_unlock(&tree->tree_lock); return 0; default: BUG(); -- 2.43.0