Page MenuHomeFreeBSD

D29769.1775867385.diff
No OneTemporary

Size
1 KB
Referenced Files
None
Subscribers
None

D29769.1775867385.diff

diff --git a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
--- a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
+++ b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
@@ -781,6 +781,7 @@
znode_t *zdp = VTOZ(dvp);
znode_t *zp;
zfsvfs_t *zfsvfs = zdp->z_zfsvfs;
+ seqc_t dvp_seqc;
int error = 0;
/*
@@ -806,6 +807,8 @@
ZFS_ENTER(zfsvfs);
ZFS_VERIFY_ZP(zdp);
+ dvp_seqc = vn_seqc_read_any(dvp);
+
*vpp = NULL;
if (flags & LOOKUP_XATTR) {
@@ -975,6 +978,24 @@
}
}
+ if ((cnp->cn_flags & ISDOTDOT) != 0) {
+ /*
+ * FIXME: zfs_lookup_lock relocks vnodes and does nothing to
+ * handle races. In particular different callers may end up
+ * with different vnodes and will try to add conflicting
+ * entries to the namecache.
+ *
+ * While finding different result may be acceptable in face
+ * of concurrent modification, adding conflicting entries
+ * trips over an assert in the namecache.
+ *
+ * Ultimately let an entry through once everything settles.
+ */
+ if (!vn_seqc_consistent(dvp, dvp_seqc)) {
+ cnp->cn_flags &= ~MAKEENTRY;
+ }
+ }
+
/* Insert name into cache (as non-existent) if appropriate. */
if (zfsvfs->z_use_namecache && !zfsvfs->z_replay &&
error == ENOENT && (cnp->cn_flags & MAKEENTRY) != 0)

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 11, 12:29 AM (5 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28321074
Default Alt Text
D29769.1775867385.diff (1 KB)

Event Timeline