ppen to be >>> * on a non-normalizing, mixed sensitivity file system IF we >>> * are looking for the exact name (which is always the case on >>> * FreeBSD). >>> */ >>> zfsvfs->z_use_namecache =3D !zfsvfs->z_norm || >>> ((zfsvfs->z_case =3D=3D ZFS_CASE_MIXED) && >>> !(zfsvfs->z_norm & ~U8_TEXTPREP_TOUPPER)); >>>=20 >>>=20 >>> The call to cache_vop_rename() which causes the panic is not = protected by an =E2=80=9Cif (zfsvfs->z_use_namecache)=E2=80=9D, unlike = the rest of the code that uses that to decide whether or not to use the = namecache. >>>=20 >>> Elsewhere in zfs_vnops_os.c, there is another call to a cache_vop* = function, which is protected by a test: >>>=20 >>> if (zfsvfs->z_use_namecache) >>> cache_vop_rmdir(dvp, vp); >>>=20 >>> It seems to me that this patch could resolve the problem. Does this = seem reasonable? >>>=20 >>> --- a/src/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c = 2026-03-28 20:55:06.000000000 1100 >>> +++ b/src/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c = 2026-03-28 20:55:06.000000000 1100 >>> @@ -3524,7 +3524,7 @@ >>> ZRENAMING, NULL)); >>> } >>> } >>> - if (error =3D=3D 0) { >>> + if (error =3D=3D 0 && zfsvfs->z_use_namecache) { >>> cache_vop_rename(sdvp, *svpp, tdvp, *tvpp, scnp, = tcnp); >>> } >>> } >>>=20 >>=20 >> Yes, but please test. >> If works for you, please either create a Github PR or a review on the >> FreeBSD' phab. >=20 > That does seem to fix the panic. I=E2=80=99ll do a GitHub PR. Thanks = for your help. https://github.com/openzfs/zfs/pull/18430 --Apple-Mail=_2599E8D2-7F1C-46BE-B974-E34D442877AA Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8
On= 14. Apr 2026, at 17:57, Jan Martin Mikkelsen = <janm@transactionware.com> wrote:


On 14 Apr 2026, at 11:52, Konstantin Belousov = <kib@freebsd.org> wrote:

On Tue, Apr 14, 2026 at 11:45:08AM = +0200, Jan Martin Mikkelsen wrote:

On 13 Apr 2026, at 22:13, = Konstantin Belousov <kib@freebsd.org> wrote:

On Mon, Apr = 13, 2026 at 07:12:32PM +0200, Jan Martin Mikkelsen wrote:

On 7 Apr 2026, at 20:20, Jan = Martin Mikkelsen <janm@transactionware.com> wrote:

On 7 Apr = 2026, at 18:53, Konstantin Belousov <kib@freebsd.org> = wrote:

On Tue, Apr 07, 2026 at = 05:02:05PM +0200, Jan Martin Mikkelsen wrote:
Hi,

I am consistently getting the panic below while = building lang/perl5.42. This is the command from the perl build that = triggers the panic:

/usr/bin/strip = /ports-work/usr/ports/lang/perl5.42/work/stage/usr/local/bin/perl5.42.0
CURRENT on aarch64, with a kernel from last week, also with a later = one from the  weekend. A kernel from mid-January worked = fine.

I can reproduce on demand, no parallelism in the build = required.

Does this look familiar to anyone?

panic: = cache_vop_rename: lingering negative entry
cpuid =3D 4
time =3D = 1775410763
KDB: stack backtrace:
db_trace_self() at = db_trace_self
db_trace_self_wrapper() at = db_trace_self_wrapper+0x38
vpanic() at vpanic+0x1a0
panic() at = panic+0x48
cache_vop_rename() at = cache_vop_rename+0xb0
zfs_do_rename() at = zfs_do_rename+0xafc
zfs_freebsd_rename() at = zfs_freebsd_rename+0x5c
VOP_RENAME_APV() at = VOP_RENAME_APV+0x44
kern_renameat () at = kern_renameat+0x574
do_el0_sync() at = do_el0_sync+0x5f8
handle_el0_sync() at handle_el0_sync+0x4c
--- = exception, esr 0x56000000
KDB: enter: panic
[ thread pid 81230 tid = 101738 ]
Stopped at kdb_enter+0x48: str xzr, [x19, = #3072]

Is it reproducable on UFS and/or = tmpfs?

Successful completion (no panic) when the = work directory is on UFS, and when the work directory is on tmpfs. I = didn=E2=80=99t try multiple times, but it never works on = ZFS.

The panic consistently reproduces on a ZFS = filesystem with the properties  =E2=80=9Cutf8only=3Don=E2=80=9D and = "normalization=3DformD=E2=80=9D.

A ZFS file system with = =E2=80=9Cutf8only=3Doff=E2=80=9D and "normalization=3Dnone=E2=80=9D = works fine.

As far as I can see, strip makes a simple rename(2) = call, and testing rename(2) works fine (as expected). Running the same = strip command on the same files on a fresh system works fine.

The = smallest reproducer I have at the moment is building lang/perl5.42.0 = with a workdir on a ZFS filesystem enforcing UTF8.

I = am now sure that the reason is that the options you used cause the = same
inode to have more than one name (but not hardlinks).  I = remember that
zfs had option to be case-insensitive, but I may = mis-remember.

The solution, in any case, is to either stop using = namecache when these
options are activated, or at least purge all = cached entries that has the
given dst when the dst vnode is renamed = or deleted.

Somebody who knows zfs would be needed to make the = change.

I had a look at the ZFS source, and found = this:

      /*
=        * Only use the name cache if = we are looking for a
       * = name on a file system that does not require normalization
=        * or case folding.  We = can also look there if we happen to be
=        * on a non-normalizing, mixed = sensitivity file system IF we
=        * are looking for the exact = name (which is always the case on
=        * FreeBSD).
=        */
=       zfsvfs->z_use_namecache =3D = !zfsvfs->z_norm ||
=           ((zfsvfs->z= _case =3D=3D ZFS_CASE_MIXED) &&
=           !(zfsvfs->z= _norm & ~U8_TEXTPREP_TOUPPER));


The call to = cache_vop_rename() which causes the panic is not protected by an =E2=80=9C= if (zfsvfs->z_use_namecache)=E2=80=9D, unlike the rest of the code = that uses that to decide whether or not to use the = namecache.

Elsewhere in zfs_vnops_os.c, there is another call to = a cache_vop* function, which is protected by a test:

=       if (zfsvfs->z_use_namecache)
=             &n= bsp; cache_vop_rmdir(dvp, vp);

It seems to me that this = patch could resolve the problem. Does this seem reasonable?

--- = a/src/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c = 2026-03-28 20:55:06.000000000 1100
+++ = b/src/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c = 2026-03-28 20:55:06.000000000 1100
@@ -3524,7 +3524,7 = @@
= = = =    ZRENAMING, NULL));
= }
= = }
- = = if (error =3D=3D 0) {
+ if (error =3D=3D 0 && = zfsvfs->z_use_namecache) {
cache_vop_rename(sdvp, *svpp, = tdvp, *tvpp, scnp, tcnp);
}
}


Yes, = but please test.
If works for you, please either create a Github PR = or a review on the
FreeBSD' phab.

That does seem = to fix the panic. I=E2=80=99ll do a GitHub PR. Thanks for your = help.

https://github.com/open= zfs/zfs/pull/18430


= --Apple-Mail=_2599E8D2-7F1C-46BE-B974-E34D442877AA--