| From 7a4e8b1e2a194ae4f94c55a09080aa2b0937ad97 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 29 Apr 2025 17:12:11 -0700 |
| Subject: hfs: fix not erasing deleted b-tree node issue |
| |
| From: Viacheslav Dubeyko <slava@dubeyko.com> |
| |
| [ Upstream commit d3ed6d6981f4756f145766753c872482bc3b28d3 ] |
| |
| The generic/001 test of xfstests suite fails and corrupts |
| the HFS volume: |
| |
| sudo ./check generic/001 |
| FSTYP -- hfs |
| PLATFORM -- Linux/x86_64 hfsplus-testing-0001 6.15.0-rc2+ #3 SMP PREEMPT_DYNAMIC Fri Apr 25 17:13:00 PDT 2> |
| MKFS_OPTIONS -- /dev/loop51 |
| MOUNT_OPTIONS -- /dev/loop51 /mnt/scratch |
| |
| generic/001 32s ... _check_generic_filesystem: filesystem on /dev/loop50 is inconsistent |
| (see /home/slavad/XFSTESTS-2/xfstests-dev/results//generic/001.full for details) |
| |
| Ran: generic/001 |
| Failures: generic/001 |
| Failed 1 of 1 tests |
| |
| fsck.hfs -d -n ./test-image.bin |
| ** ./test-image.bin (NO WRITE) |
| Using cacheBlockSize=32K cacheTotalBlock=1024 cacheSize=32768K. |
| Executing fsck_hfs (version 540.1-Linux). |
| ** Checking HFS volume. |
| The volume name is untitled |
| ** Checking extents overflow file. |
| ** Checking catalog file. |
| Unused node is not erased (node = 2) |
| Unused node is not erased (node = 4) |
| <skipped> |
| Unused node is not erased (node = 253) |
| Unused node is not erased (node = 254) |
| Unused node is not erased (node = 255) |
| Unused node is not erased (node = 256) |
| ** Checking catalog hierarchy. |
| ** Checking volume bitmap. |
| ** Checking volume information. |
| Verify Status: VIStat = 0x0000, ABTStat = 0x0000 EBTStat = 0x0000 |
| CBTStat = 0x0004 CatStat = 0x00000000 |
| ** The volume untitled was found corrupt and needs to be repaired. |
| volume type is HFS |
| primary MDB is at block 2 0x02 |
| alternate MDB is at block 20971518 0x13ffffe |
| primary VHB is at block 0 0x00 |
| alternate VHB is at block 0 0x00 |
| sector size = 512 0x200 |
| VolumeObject flags = 0x19 |
| total sectors for volume = 20971520 0x1400000 |
| total sectors for embedded volume = 0 0x00 |
| |
| This patch adds logic of clearing the deleted b-tree node. |
| |
| sudo ./check generic/001 |
| FSTYP -- hfs |
| PLATFORM -- Linux/x86_64 hfsplus-testing-0001 6.15.0-rc2+ #3 SMP PREEMPT_DYNAMIC Fri Apr 25 17:13:00 PDT 2025 |
| MKFS_OPTIONS -- /dev/loop51 |
| MOUNT_OPTIONS -- /dev/loop51 /mnt/scratch |
| |
| generic/001 9s ... 32s |
| Ran: generic/001 |
| Passed all 1 tests |
| |
| fsck.hfs -d -n ./test-image.bin |
| ** ./test-image.bin (NO WRITE) |
| Using cacheBlockSize=32K cacheTotalBlock=1024 cacheSize=32768K. |
| Executing fsck_hfs (version 540.1-Linux). |
| ** Checking HFS volume. |
| The volume name is untitled |
| ** Checking extents overflow file. |
| ** Checking catalog file. |
| ** Checking catalog hierarchy. |
| ** Checking volume bitmap. |
| ** Checking volume information. |
| ** The volume untitled appears to be OK. |
| |
| Signed-off-by: Viacheslav Dubeyko <slava@dubeyko.com> |
| Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> |
| Link: https://lore.kernel.org/r/20250430001211.1912533-1-slava@dubeyko.com |
| Signed-off-by: Viacheslav Dubeyko <slava@dubeyko.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/hfs/bnode.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/fs/hfs/bnode.c b/fs/hfs/bnode.c |
| index 1dac5d9c055f..e8cd1a31f247 100644 |
| --- a/fs/hfs/bnode.c |
| +++ b/fs/hfs/bnode.c |
| @@ -574,6 +574,7 @@ void hfs_bnode_put(struct hfs_bnode *node) |
| if (test_bit(HFS_BNODE_DELETED, &node->flags)) { |
| hfs_bnode_unhash(node); |
| spin_unlock(&tree->hash_lock); |
| + hfs_bnode_clear(node, 0, tree->node_size); |
| hfs_bmap_free(node); |
| hfs_bnode_free(node); |
| return; |
| -- |
| 2.39.5 |
| |