On Mon, Jul 17, 2023 at 08:26:29AM -0700, Darrick J. Wong wrote: > On Mon, Jul 17, 2023 at 10:44:13AM +0800, Zorro Lang wrote: > > On Fri, Jul 14, 2023 at 07:57:05AM -0700, Darrick J. Wong wrote: > > > From: Darrick J. Wong <djwong@xxxxxxxxxx> > > > > > > Add some tests to make sure that userspace and the kernel actually > > > agree on how to do ascii case-insensitive directory lookups, and that > > > metadump can actually obfuscate such filesystems. > > > > > > Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> > > > --- > > > v2: cleanup cruft and dont mess with LANG= per zlang > > > --- > > > > This version looks good to me, just one question, the xfs/860 hit below error [1] > > when I tried to run it on my Fedora system ( with 6.5-rc1 kernel and latest > > upstream xfsprogs). Is that as expected? > > Yes, that's an unrelated bug, which is that the kernel static checking > folks turned on stricter memory checking without fully fixing everything > that would break. > > https://lore.kernel.org/linux-xfs/168934573961.3353217.18139786322840965874.stgit@frogsfrogsfrogs/ > > https://lore.kernel.org/linux-xfs/ZI+3QXDHiohgv%2FPb@xxxxxxxxxxxxxxxxxxx/ > https://lore.kernel.org/linux-xfs/bug-217522-201763-D34HpuP9xe@xxxxxxxxxxxxxxxxxxxxxxxxx%2F/ > https://lore.kernel.org/linux-xfs/Y9xiYmVLRIKdpJcC@work/ Thanks Darrick, if it's known issue, I'm good to have this patch :) Reviewed-by: Zorro Lang <zlang@xxxxxxxxxx> > > --D > > > Due to I only saw a xfsprogs known issue you marked in xfs/860, but this error is > > from kernel. > > > > Thanks, > > Zorro > > > > [ 1579.216692] run fstests xfs/860 at 2023-07-17 10:35:29 > > [ 1579.764224] XFS (sda5): Mounting V5 Filesystem de80b0bc-dfa9-4e15-80f1-2a72ead79a81 > > [ 1579.814136] XFS (sda5): Ending clean mount > > [ 1579.983363] XFS (sda3): Mounting V5 Filesystem 6d0a233b-7f98-43c1-a6a2-9e1218623ec6 > > [ 1580.010365] XFS (sda3): Ending clean mount > > [ 1580.167032] ------------[ cut here ]------------ > > [ 1580.167683] memcpy: detected field-spanning write (size 250) of single field "(char *)name_loc->nameval" at fs/xfs/libxfs/xfs_attr_leaf.c:1559 (size 1) > > [ 1580.168457] WARNING: CPU: 8 PID: 4187 at fs/xfs/libxfs/xfs_attr_leaf.c:1559 xfs_attr3_leaf_add_work+0x4ee/0x530 [xfs] > > [ 1580.169385] Modules linked in: nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 ip_set rfkill nf_tables nfnetlink qrtr intel_rapl_msr intel_rapl_common sb_edac x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel ipmi_ssif kvm pktcdvd nd_pmem irqbypass iTCO_wdt rapl intel_cstate acpi_ipmi ipmi_si intel_uncore nd_btt intel_pmc_bxt iTCO_vendor_support ipmi_devintf ioatdma dax_pmem ipmi_msghandler lpc_ich hpilo acpi_power_meter dca loop fuse zram xfs crct10dif_pclmul crc32_pclmul crc32c_intel polyval_clmulni nd_e820 polyval_generic libnvdimm ghash_clmulni_intel sha512_ssse3 hpsa serio_raw tg3 mgag200 i2c_algo_bit hpwdt scsi_transport_sas ata_generic pata_acpi scsi_dh_rdac scsi_dh_emc scsi_dh_alua dm_multipath > > [ 1580.173667] CPU: 8 PID: 4187 Comm: setfattr Tainted: G S I ------- --- 6.5.0-0.rc1.20230711git3f01e9fed845.12.fc39.x86_64 #1 > > [ 1580.174327] Hardware name: HP ProLiant DL380p Gen8, BIOS P70 08/02/2014 > > [ 1580.174712] RIP: 0010:xfs_attr3_leaf_add_work+0x4ee/0x530 [xfs] > > [ 1580.175938] Code: fe ff ff b9 01 00 00 00 4c 89 fe 48 c7 c2 08 27 ba c0 48 c7 c7 50 27 ba c0 48 89 44 24 08 c6 05 d4 d5 10 00 01 e8 d2 c6 75 cf <0f> 0b 48 8b 44 24 08 e9 88 fe ff ff 80 3d bb d5 10 00 00 0f 85 bd > > [ 1580.177664] RSP: 0018:ffffb61ec631f820 EFLAGS: 00010282 > > [ 1580.177967] RAX: 0000000000000000 RBX: ffffb61ec631f8f0 RCX: 0000000000000000 > > [ 1580.178741] RDX: ffff906e7162e580 RSI: ffff906e71621540 RDI: ffff906e71621540 > > [ 1580.179551] RBP: ffffb61ec631f884 R08: 0000000000000000 R09: ffffb61ec631f6b0 > > [ 1580.180343] R10: 0000000000000003 R11: ffff906e7ff45128 R12: ffff906b286bc050 > > [ 1580.181156] R13: ffff906b286bc000 R14: ffff906b286bcf00 R15: 00000000000000fa > > [ 1580.181969] FS: 00007f7fe6b11680(0000) GS:ffff906e71600000(0000) knlGS:0000000000000000 > > [ 1580.182407] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > > [ 1580.183132] CR2: 00007f7fe6a27a50 CR3: 00000004c2e22001 CR4: 00000000001706e0 > > [ 1580.183896] Call Trace: > > [ 1580.239654] <TASK> > > [ 1580.284489] ? xfs_attr3_leaf_add_work+0x4ee/0x530 [xfs] > > [ 1580.285103] ? __warn+0x81/0x130 > > [ 1580.285663] ? xfs_attr3_leaf_add_work+0x4ee/0x530 [xfs] > > [ 1580.286276] ? report_bug+0x171/0x1a0 > > [ 1580.286515] ? prb_read_valid+0x1b/0x30 > > [ 1580.286731] ? handle_bug+0x3c/0x80 > > [ 1580.287289] ? exc_invalid_op+0x17/0x70 > > [ 1580.287493] ? asm_exc_invalid_op+0x1a/0x20 > > [ 1580.287707] ? xfs_attr3_leaf_add_work+0x4ee/0x530 [xfs] > > [ 1580.288320] xfs_attr3_leaf_add+0x1a3/0x210 [xfs] > > [ 1580.289267] xfs_attr_shortform_to_leaf+0x23f/0x250 [xfs] > > [ 1580.289883] xfs_attr_set_iter+0x772/0x910 [xfs] > > [ 1580.290829] xfs_xattri_finish_update+0x18/0x50 [xfs] > > [ 1580.291475] xfs_attr_finish_item+0x1e/0xb0 [xfs] > > [ 1580.292430] xfs_defer_finish_noroll+0x196/0x6e0 [xfs] > > [ 1580.321763] __xfs_trans_commit+0x242/0x360 [xfs] > > [ 1580.463165] xfs_attr_set+0x48a/0x6a0 [xfs] > > [ 1580.575201] xfs_xattr_set+0x8d/0xe0 [xfs] > > [ 1580.687468] __vfs_setxattr+0x99/0xd0 > > [ 1580.693573] __vfs_setxattr_noperm+0x77/0x1d0 > > [ 1580.694224] vfs_setxattr+0x9f/0x180 > > [ 1580.694449] setxattr+0x9e/0xc0 > > [ 1580.695211] path_setxattr+0xd9/0xf0 > > [ 1580.695616] __x64_sys_setxattr+0x2b/0x40 > > [ 1580.695857] do_syscall_64+0x60/0x90 > > [ 1580.696060] ? handle_mm_fault+0x9e/0x350 > > [ 1580.696268] ? do_user_addr_fault+0x225/0x640 > > [ 1580.696924] ? exc_page_fault+0x7f/0x180 > > [ 1580.697161] entry_SYSCALL_64_after_hwframe+0x6e/0xd8 > > [ 1580.697449] RIP: 0033:0x7f7fe6a3edde > > [ 1580.697696] Code: 48 8b 0d 2d 70 0c 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 49 89 ca b8 bc 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d fa 6f 0c 00 f7 d8 64 89 01 48 > > [ 1580.699044] RSP: 002b:00007ffd07e29b98 EFLAGS: 00000246 ORIG_RAX: 00000000000000bc > > [ 1580.699839] RAX: ffffffffffffffda RBX: 000055bdac5a62f0 RCX: 00007f7fe6a3edde > > [ 1580.700631] RDX: 000055bdac5a62f0 RSI: 00007ffd07e2be79 RDI: 00007ffd07e2bf7e > > [ 1580.701417] RBP: 00007ffd07e29be0 R08: 0000000000000000 R09: 0000000000000001 > > [ 1580.786259] R10: 0000000000000001 R11: 0000000000000246 R12: 00007ffd07e2bf7e > > [ 1580.981664] R13: 000055bdac5a62f1 R14: 00007ffd07e2be79 R15: 0000000000000100 > > [ 1581.177424] </TASK> > > [ 1581.202206] ---[ end trace 0000000000000000 ]--- > > [ 1581.307610] XFS (sda3): Unmounting Filesystem 6d0a233b-7f98-43c1-a6a2-9e1218623ec6 > > [ 1588.032401] XFS (sda3): Mounting V5 Filesystem 6d0a233b-7f98-43c1-a6a2-9e1218623ec6 > > [ 1588.054500] XFS (sda3): Ending clean mount > > [ 1588.078504] XFS (sda3): EXPERIMENTAL online scrub feature in use. Use at your own risk! > > [ 1588.102942] ------------[ cut here ]------------ > > ... > > ... > > [ 1588.103598] memcpy: detected field-spanning write (size 250) of single field "aep->a_name" at fs/xfs/xfs_ioctl.c:343 (size 1) > > [ 1588.104700] WARNING: CPU: 22 PID: 4300 at fs/xfs/xfs_ioctl.c:343 xfs_ioc_attr_put_listent+0x176/0x180 [xfs] > > [ 1588.105551] Modules linked in: nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 ip_set rfkill nf_tables nfnetlink qrtr intel_rapl_msr intel_rapl_common sb_edac x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel ipmi_ssif kvm pktcdvd nd_pmem irqbypass iTCO_wdt rapl intel_cstate acpi_ipmi ipmi_si intel_uncore nd_btt intel_pmc_bxt iTCO_vendor_support ipmi_devintf ioatdma dax_pmem ipmi_msghandler lpc_ich hpilo acpi_power_meter dca loop fuse zram xfs crct10dif_pclmul crc32_pclmul crc32c_intel polyval_clmulni nd_e820 polyval_generic libnvdimm ghash_clmulni_intel sha512_ssse3 hpsa serio_raw tg3 mgag200 i2c_algo_bit hpwdt scsi_transport_sas ata_generic pata_acpi scsi_dh_rdac scsi_dh_emc scsi_dh_alua dm_multipath > > [ 1588.110098] CPU: 22 PID: 4300 Comm: xfs_scrub Tainted: G S W I ------- --- 6.5.0-0.rc1.20230711git3f01e9fed845.12.fc39.x86_64 #1 > > [ 1588.111378] Hardware name: HP ProLiant DL380p Gen8, BIOS P70 08/02/2014 > > [ 1588.111743] RIP: 0010:xfs_ioc_attr_put_listent+0x176/0x180 [xfs] > > [ 1588.112815] Code: 00 00 0f 85 0e ff ff ff b9 01 00 00 00 48 c7 c2 48 46 ba c0 4c 89 f6 48 c7 c7 78 46 ba c0 c6 05 1f 9e 0a 00 01 e8 1a 8f 6f cf <0f> 0b e9 e5 fe ff ff 0f 1f 00 90 90 90 90 90 90 90 90 90 90 90 90 > > [ 1588.114203] RSP: 0018:ffffb61ecf11fb20 EFLAGS: 00010282 > > [ 1588.114498] RAX: 0000000000000000 RBX: ffffb61ecf11fc68 RCX: 0000000000000000 > > [ 1588.115265] RDX: ffff9066fa7ae580 RSI: ffff9066fa7a1540 RDI: ffff9066fa7a1540 > > [ 1588.116230] RBP: ffff90666adeff00 R08: 0000000000000000 R09: ffffb61ecf11f9b0 > > [ 1588.117052] R10: 0000000000000003 R11: ffff906e7ff45128 R12: ffff906649fe3f03 > > [ 1588.117855] R13: ffff90666ade0000 R14: 00000000000000fa R15: ffff90666adeff04 > > [ 1588.118678] FS: 00007f5e70701900(0000) GS:ffff9066fa780000(0000) knlGS:0000000000000000 > > [ 1588.204720] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > > [ 1588.219762] CR2: 00007ffddc8e8000 CR3: 000000000b2ba002 CR4: 00000000001706e0 > > [ 1588.220543] Call Trace: > > [ 1588.220688] <TASK> > > [ 1588.221163] ? xfs_ioc_attr_put_listent+0x176/0x180 [xfs] > > [ 1588.221661] ? __warn+0x81/0x130 > > [ 1588.222222] ? xfs_ioc_attr_put_listent+0x176/0x180 [xfs] > > [ 1588.222724] ? report_bug+0x171/0x1a0 > > [ 1588.222942] ? prb_read_valid+0x1b/0x30 > > [ 1588.223184] ? handle_bug+0x3c/0x80 > > [ 1588.223728] ? exc_invalid_op+0x17/0x70 > > [ 1588.223939] ? asm_exc_invalid_op+0x1a/0x20 > > [ 1588.224181] ? xfs_ioc_attr_put_listent+0x176/0x180 [xfs] > > [ 1588.224678] xfs_attr3_leaf_list_int+0x18c/0x370 [xfs] > > [ 1588.225172] xfs_attr_node_list+0x104/0x300 [xfs] > > [ 1588.226019] xfs_attr_list+0x7a/0xa0 [xfs] > > [ 1588.226463] xfs_ioc_attr_list+0x129/0x1c0 [xfs] > > [ 1588.227302] ? __pfx_xfs_ioc_attr_put_listent+0x10/0x10 [xfs] > > [ 1588.228211] xfs_attrlist_by_handle+0x91/0xe0 [xfs] > > [ 1588.229053] xfs_file_ioctl+0x499/0xd60 [xfs] > > [ 1588.229915] ? ioctl_has_perm.constprop.0.isra.0+0xda/0x130 > > [ 1588.230237] __x64_sys_ioctl+0x97/0xd0 > > [ 1588.312830] do_syscall_64+0x60/0x90 > > [ 1588.422274] ? exc_page_fault+0x7f/0x180 > > [ 1588.531007] entry_SYSCALL_64_after_hwframe+0x6e/0xd8 > > [ 1588.630650] RIP: 0033:0x7f5e70812cbd > > [ 1588.630898] Code: 04 25 28 00 00 00 48 89 45 c8 31 c0 48 8d 45 10 c7 45 b0 10 00 00 00 48 89 45 b8 48 8d 45 d0 48 89 45 c0 b8 10 00 00 00 0f 05 <89> c2 3d 00 f0 ff ff 77 1a 48 8b 45 c8 64 > > 48 2b 04 25 28 00 00 00 > > [ 1588.632258] RSP: 002b:00007ffddc8dd3e0 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 > > [ 1588.633062] RAX: ffffffffffffffda RBX: 00007ffddc8dd4d0 RCX: 00007f5e70812cbd > > [ 1588.634069] RDX: 00007ffddc8dd440 RSI: 000000004058587a RDI: 0000000000000004 > > [ 1588.635128] RBP: 00007ffddc8dd430 R08: 0000000000000000 R09: 00007ffddc8dd4d0 > > [ 1588.635974] R10: 00007ffddc8ed6c0 R11: 0000000000000246 R12: 0000000000414a80 > > [ 1588.636768] R13: 00007ffddc8edd70 R14: 00007ffddc8ed620 R15: 00007ffddc8edabf > > [ 1588.637591] </TASK> > > [ 1588.637742] ---[ end trace 0000000000000000 ]--- > > [ 1588.784337] XFS (sda3): Unmounting Filesystem 6d0a233b-7f98-43c1-a6a2-9e1218623ec6 > > [ 1588.926686] XFS (sda3): Mounting V5 Filesystem 6d0a233b-7f98-43c1-a6a2-9e1218623ec6 > > [ 1588.948787] XFS (sda3): Ending clean mount > > ... > > ... > > > > > tests/xfs/859 | 56 +++++++++++++++++++++++++++++ > > > tests/xfs/859.out | 24 +++++++++++++ > > > tests/xfs/860 | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > > > tests/xfs/860.out | 9 +++++ > > > tests/xfs/861 | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ > > > tests/xfs/861.out | 2 + > > > 6 files changed, 283 insertions(+) > > > create mode 100755 tests/xfs/859 > > > create mode 100644 tests/xfs/859.out > > > create mode 100755 tests/xfs/860 > > > create mode 100644 tests/xfs/860.out > > > create mode 100755 tests/xfs/861 > > > create mode 100644 tests/xfs/861.out > > > > > > diff --git a/tests/xfs/859 b/tests/xfs/859 > > > new file mode 100755 > > > index 0000000000..14f645310d > > > --- /dev/null > > > +++ b/tests/xfs/859 > > > @@ -0,0 +1,56 @@ > > > +#! /bin/bash > > > +# SPDX-License-Identifier: GPL-2.0 > > > +# Copyright (c) 2023 Oracle. All Rights Reserved. > > > +# > > > +# FS QA Test 859 > > > +# > > > +# Make sure that the kernel and userspace agree on which byte sequences are > > > +# ASCII uppercase letters, and how to convert them. > > > +# > > > +. ./common/preamble > > > +_begin_fstest auto ci dir > > > + > > > +# Import common functions. > > > +. ./common/filter > > > + > > > +_fixed_by_kernel_commit a9248538facc \ > > > + "xfs: stabilize the dirent name transformation function used for ascii-ci dir hash computation" > > > +_fixed_by_kernel_commit 9dceccc5822f \ > > > + "xfs: use the directory name hash function for dir scrubbing" > > > + > > > +_supported_fs xfs > > > +_require_scratch > > > +_require_xfs_mkfs_ciname > > > + > > > +_scratch_mkfs -n version=ci > $seqres.full > > > +_scratch_mount > > > + > > > +# Create a two-block directory to force leaf format > > > +mkdir "$SCRATCH_MNT/lol" > > > +touch "$SCRATCH_MNT/lol/autoexec.bat" > > > +i=0 > > > +dblksz=$(_xfs_get_dir_blocksize "$SCRATCH_MNT") > > > +nr_dirents=$((dblksz * 2 / 256)) > > > + > > > +for ((i = 0; i < nr_dirents; i++)); do > > > + name="$(printf "y%0254d" $i)" > > > + ln "$SCRATCH_MNT/lol/autoexec.bat" "$SCRATCH_MNT/lol/$name" > > > +done > > > + > > > +dirsz=$(stat -c '%s' $SCRATCH_MNT/lol) > > > +test $dirsz -gt $dblksz || echo "dir size $dirsz, expected at least $dblksz?" > > > +stat $SCRATCH_MNT/lol >> $seqres.full > > > + > > > +# Create names with extended ascii characters in them to exploit the fact > > > +# that the Linux kernel will transform extended ASCII uppercase characters > > > +# but libc won't. Need to force LANG=C here so that awk doesn't spit out utf8 > > > +# sequences. > > > +test "$LANG" = "C" || _notrun "LANG=C required" > > > +awk 'END { for (i = 192; i < 247; i++) printf("%c\n", i); }' < /dev/null | while read name; do > > > + ln "$SCRATCH_MNT/lol/autoexec.bat" "$SCRATCH_MNT/lol/$name" 2>&1 | _filter_scratch > > > +done > > > + > > > +# Now just let repair run > > > + > > > +status=0 > > > +exit > > > diff --git a/tests/xfs/859.out b/tests/xfs/859.out > > > new file mode 100644 > > > index 0000000000..a4939ba670 > > > --- /dev/null > > > +++ b/tests/xfs/859.out > > > @@ -0,0 +1,24 @@ > > > +QA output created by 859 > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\340': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\341': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\342': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\343': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\344': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\345': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\346': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\347': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\350': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\351': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\352': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\353': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\354': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\355': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\356': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\357': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\360': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\361': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\362': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\363': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\364': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\365': File exists > > > +ln: failed to create hard link 'SCRATCH_MNT/lol/'$'\366': File exists > > > diff --git a/tests/xfs/860 b/tests/xfs/860 > > > new file mode 100755 > > > index 0000000000..9a934bb33d > > > --- /dev/null > > > +++ b/tests/xfs/860 > > > @@ -0,0 +1,101 @@ > > > +#! /bin/bash > > > +# SPDX-License-Identifier: GPL-2.0 > > > +# Copyright (c) 2023 Oracle. All Rights Reserved. > > > +# > > > +# FS QA Test 860 > > > +# > > > +# Make sure that metadump obfuscation works for filesystems with ascii-ci > > > +# enabled. > > > +# > > > +. ./common/preamble > > > +_begin_fstest auto dir ci > > > + > > > +_cleanup() > > > +{ > > > + cd / > > > + rm -r -f $tmp.* $testdir > > > +} > > > + > > > +_fixed_by_git_commit xfsprogs 10a01bcd \ > > > + "xfs_db: fix metadump name obfuscation for ascii-ci filesystems" > > > + > > > +_supported_fs xfs > > > +_require_test > > > +_require_scratch > > > +_require_xfs_mkfs_ciname > > > + > > > +_scratch_mkfs -n version=ci > $seqres.full > > > +_scratch_mount > > > + > > > +# Create a two-block directory to force leaf format > > > +mkdir "$SCRATCH_MNT/lol" > > > +touch "$SCRATCH_MNT/lol/autoexec.bat" > > > +i=0 > > > +dblksz=$(_xfs_get_dir_blocksize "$SCRATCH_MNT") > > > +nr_dirents=$((dblksz * 2 / 256)) > > > + > > > +for ((i = 0; i < nr_dirents; i++)); do > > > + name="$(printf "y%0254d" $i)" > > > + ln "$SCRATCH_MNT/lol/autoexec.bat" "$SCRATCH_MNT/lol/$name" > > > +done > > > + > > > +dirsz=$(stat -c '%s' $SCRATCH_MNT/lol) > > > +test $dirsz -gt $dblksz || echo "dir size $dirsz, expected at least $dblksz?" > > > +stat $SCRATCH_MNT/lol >> $seqres.full > > > + > > > +# Create a two-block attr to force leaf format > > > +i=0 > > > +for ((i = 0; i < nr_dirents; i++)); do > > > + name="$(printf "user.%0250d" $i)" > > > + $SETFATTR_PROG -n "$name" -v 1 "$SCRATCH_MNT/lol/autoexec.bat" > > > +done > > > +stat $SCRATCH_MNT/lol/autoexec.bat >> $seqres.full > > > + > > > +_scratch_unmount > > > + > > > +testdir=$TEST_DIR/$seq.metadumps > > > +mkdir -p $testdir > > > +metadump_file=$testdir/scratch.md > > > +metadump_file_a=${metadump_file}.a > > > +metadump_file_o=${metadump_file}.o > > > +metadump_file_ao=${metadump_file}.ao > > > + > > > +echo metadump > > > +_scratch_xfs_metadump $metadump_file >> $seqres.full > > > + > > > +echo metadump a > > > +_scratch_xfs_metadump $metadump_file_a -a >> $seqres.full > > > + > > > +echo metadump o > > > +_scratch_xfs_metadump $metadump_file_o -o >> $seqres.full > > > + > > > +echo metadump ao > > > +_scratch_xfs_metadump $metadump_file_ao -a -o >> $seqres.full > > > + > > > +echo mdrestore > > > +_scratch_xfs_mdrestore $metadump_file > > > +_scratch_mount > > > +_check_scratch_fs > > > +_scratch_unmount > > > + > > > +echo mdrestore a > > > +_scratch_xfs_mdrestore $metadump_file_a > > > +_scratch_mount > > > +_check_scratch_fs > > > +_scratch_unmount > > > + > > > +echo mdrestore o > > > +_scratch_xfs_mdrestore $metadump_file_o > > > +_scratch_mount > > > +_check_scratch_fs > > > +_scratch_unmount > > > + > > > +echo mdrestore ao > > > +_scratch_xfs_mdrestore $metadump_file_ao > > > +_scratch_mount > > > +_check_scratch_fs > > > +_scratch_unmount > > > + > > > +# success, all done > > > +status=0 > > > +exit > > > diff --git a/tests/xfs/860.out b/tests/xfs/860.out > > > new file mode 100644 > > > index 0000000000..136fc5f7d6 > > > --- /dev/null > > > +++ b/tests/xfs/860.out > > > @@ -0,0 +1,9 @@ > > > +QA output created by 860 > > > +metadump > > > +metadump a > > > +metadump o > > > +metadump ao > > > +mdrestore > > > +mdrestore a > > > +mdrestore o > > > +mdrestore ao > > > diff --git a/tests/xfs/861 b/tests/xfs/861 > > > new file mode 100755 > > > index 0000000000..d692719697 > > > --- /dev/null > > > +++ b/tests/xfs/861 > > > @@ -0,0 +1,91 @@ > > > +#! /bin/bash > > > +# SPDX-License-Identifier: GPL-2.0 > > > +# Copyright (c) 2023 Oracle. All Rights Reserved. > > > +# > > > +# FS QA Test 861 > > > +# > > > +# Make sure that the kernel and utilities can handle large numbers of dirhash > > > +# collisions in both the directory and extended attribute structures. > > > +# > > > +# This started as a regression test for the new 'hashcoll' function in xfs_db, > > > +# but became a regression test for an xfs_repair bug affecting hashval checks > > > +# applied to the second and higher node levels of a dabtree. > > > +# > > > +. ./common/preamble > > > +_begin_fstest auto dir > > > + > > > +_fixed_by_git_commit xfsprogs b7b81f336ac \ > > > + "xfs_repair: fix incorrect dabtree hashval comparison" > > > + > > > +_supported_fs xfs > > > +_require_xfs_db_command "hashcoll" > > > +_require_xfs_db_command "path" > > > +_require_scratch > > > + > > > +_scratch_mkfs > $seqres.full > > > +_scratch_mount > > > + > > > +crash_dir=$SCRATCH_MNT/lol/ > > > +crash_attrs=$SCRATCH_MNT/hah > > > + > > > +mkdir -p "$crash_dir" > > > +touch "$crash_attrs" > > > + > > > +# Create enough dirents to fill two dabtree node blocks with names that all > > > +# hash to the same value. Each dirent gets its own record in the dabtree, > > > +# so we must create enough dirents to get a dabtree of at least height 2. > > > +dblksz=$(_xfs_get_dir_blocksize "$SCRATCH_MNT") > > > + > > > +da_records_per_block=$((dblksz / 8)) # 32-bit hash and 32-bit before > > > +nr_dirents=$((da_records_per_block * 2)) > > > + > > > +longname="$(mktemp --dry-run "$(perl -e 'print "X" x 255;')" | tr ' ' 'X')" > > > +echo "creating $nr_dirents dirents from '$longname'" >> $seqres.full > > > +_scratch_xfs_db -r -c "hashcoll -n $nr_dirents -p $crash_dir $longname" > > > + > > > +# Create enough xattrs to fill two dabtree nodes. Each attribute leaf block > > > +# gets its own record in the dabtree, so we have to create enough attr blocks > > > +# (each full of attrs) to get a dabtree of at least height 2. > > > +blksz=$(_get_block_size "$SCRATCH_MNT") > > > + > > > +attr_records_per_block=$((blksz / 255)) > > > +da_records_per_block=$((blksz / 8)) # 32-bit hash and 32-bit before > > > +nr_attrs=$((da_records_per_block * attr_records_per_block * 2)) > > > + > > > +longname="$(mktemp --dry-run "$(perl -e 'print "X" x 249;')" | tr ' ' 'X')" > > > +echo "creating $nr_attrs attrs from '$longname'" >> $seqres.full > > > +_scratch_xfs_db -r -c "hashcoll -a -n $nr_attrs -p $crash_attrs $longname" > > > + > > > +_scratch_unmount > > > + > > > +# Make sure that there's one hash value dominating the dabtree block. > > > +# We don't require 100% because directories create dabtree records for dot > > > +# and dotdot. > > > +filter_hashvals() { > > > + uniq -c | awk -v seqres_full="$seqres.full" \ > > > + '{print $0 >> seqres_full; tot += $1; if ($1 > biggest) biggest = $1;} END {if (biggest >= (tot - 2)) exit(0); exit(1);}' > > > + test "${PIPESTATUS[1]}" -eq 0 || \ > > > + echo "Scattered dabtree hashes? See seqres.full" > > > +} > > > + > > > +# Did we actually get a two-level dabtree for the directory? Does it contain a > > > +# long run of hashes? > > > +echo "dir check" >> $seqres.full > > > +da_node_block_offset=$(( (2 ** 35) / blksz )) > > > +dir_db_args=(-c 'path /lol/' -c "dblock $da_node_block_offset" -c 'addr nbtree[0].before') > > > +dir_count="$(_scratch_xfs_db "${dir_db_args[@]}" -c 'print lhdr.count' | awk '{print $3}')" > > > +_scratch_xfs_db "${dir_db_args[@]}" -c "print lents[0-$((dir_count - 1))].hashval" | sed -e 's/lents\[[0-9]*\]/lents[NN]/g' | filter_hashvals > > > + > > > +# Did we actually get a two-level dabtree for the attrs? Does it contain a > > > +# long run of hashes? > > > +echo "attr check" >> $seqres.full > > > +attr_db_args=(-c 'path /hah' -c "ablock 0" -c 'addr btree[0].before') > > > +attr_count="$(_scratch_xfs_db "${attr_db_args[@]}" -c 'print hdr.count' | awk '{print $3}')" > > > +_scratch_xfs_db "${attr_db_args[@]}" -c "print btree[0-$((attr_count - 1))].hashval" | sed -e 's/btree\[[0-9]*\]/btree[NN]/g' | filter_hashvals > > > + > > > +# Remount to get some coverage of xfs_scrub before seeing if xfs_repair > > > +# will trip over the large dabtrees. > > > +echo Silence is golden > > > +_scratch_mount > > > +status=0 > > > +exit > > > diff --git a/tests/xfs/861.out b/tests/xfs/861.out > > > new file mode 100644 > > > index 0000000000..d11b76c82e > > > --- /dev/null > > > +++ b/tests/xfs/861.out > > > @@ -0,0 +1,2 @@ > > > +QA output created by 861 > > > +Silence is golden > > > > > >