Module Name: src
Committed By: ad
Date: Sun Jan 19 21:21:56 UTC 2020
Modified Files:
src/sys/fs/cd9660 [ad-namecache]: cd9660_lookup.c cd9660_vfsops.c
src/sys/fs/msdosfs [ad-namecache]: msdosfs_lookup.c msdosfs_vfsops.c
src/sys/fs/tmpfs [ad-namecache]: tmpfs_vfsops.c
src/sys/miscfs/genfs [ad-namecache]: layer_vnops.c
src/sys/miscfs/nullfs [ad-namecache]: null_vfsops.c
src/sys/miscfs/procfs [ad-namecache]: procfs_vfsops.c
src/sys/ufs/chfs [ad-namecache]: chfs_vnops.c
src/sys/ufs/ext2fs [ad-namecache]: ext2fs_lookup.c ext2fs_vfsops.c
src/sys/ufs/ffs [ad-namecache]: ffs_vfsops.c
src/sys/ufs/lfs [ad-namecache]: lfs_vfsops.c ulfs_lookup.c
src/sys/ufs/ufs [ad-namecache]: ufs_lookup.c
Log Message:
Set IMNT_SHRLOOKUP and use it for the in-cache case. Need to check what
more can be done with tmpfs though, it can probably do the whole lookup.
To generate a diff of this commit:
cvs rdiff -u -r1.30 -r1.30.24.1 src/sys/fs/cd9660/cd9660_lookup.c
cvs rdiff -u -r1.93.18.1 -r1.93.18.2 src/sys/fs/cd9660/cd9660_vfsops.c
cvs rdiff -u -r1.35 -r1.35.24.1 src/sys/fs/msdosfs/msdosfs_lookup.c
cvs rdiff -u -r1.130.6.1 -r1.130.6.2 src/sys/fs/msdosfs/msdosfs_vfsops.c
cvs rdiff -u -r1.75.2.1 -r1.75.2.2 src/sys/fs/tmpfs/tmpfs_vfsops.c
cvs rdiff -u -r1.67 -r1.67.12.1 src/sys/miscfs/genfs/layer_vnops.c
cvs rdiff -u -r1.96 -r1.96.2.1 src/sys/miscfs/nullfs/null_vfsops.c
cvs rdiff -u -r1.101.6.1 -r1.101.6.2 src/sys/miscfs/procfs/procfs_vfsops.c
cvs rdiff -u -r1.34.4.1 -r1.34.4.2 src/sys/ufs/chfs/chfs_vnops.c
cvs rdiff -u -r1.88 -r1.88.22.1 src/sys/ufs/ext2fs/ext2fs_lookup.c
cvs rdiff -u -r1.214.4.1 -r1.214.4.2 src/sys/ufs/ext2fs/ext2fs_vfsops.c
cvs rdiff -u -r1.362.4.2 -r1.362.4.3 src/sys/ufs/ffs/ffs_vfsops.c
cvs rdiff -u -r1.367.2.1 -r1.367.2.2 src/sys/ufs/lfs/lfs_vfsops.c
cvs rdiff -u -r1.41 -r1.41.12.1 src/sys/ufs/lfs/ulfs_lookup.c
cvs rdiff -u -r1.150 -r1.150.4.1 src/sys/ufs/ufs/ufs_lookup.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/fs/cd9660/cd9660_lookup.c
diff -u src/sys/fs/cd9660/cd9660_lookup.c:1.30 src/sys/fs/cd9660/cd9660_lookup.c:1.30.24.1
--- src/sys/fs/cd9660/cd9660_lookup.c:1.30 Sat Mar 28 19:24:05 2015
+++ src/sys/fs/cd9660/cd9660_lookup.c Sun Jan 19 21:21:54 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: cd9660_lookup.c,v 1.30 2015/03/28 19:24:05 maxv Exp $ */
+/* $NetBSD: cd9660_lookup.c,v 1.30.24.1 2020/01/19 21:21:54 ad Exp $ */
/*-
* Copyright (c) 1989, 1993, 1994
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cd9660_lookup.c,v 1.30 2015/03/28 19:24:05 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cd9660_lookup.c,v 1.30.24.1 2020/01/19 21:21:54 ad Exp $");
#include <sys/param.h>
#include <sys/namei.h>
@@ -152,6 +152,9 @@ cd9660_lookup(void *v)
cnp->cn_nameiop, cnp->cn_flags, NULL, vpp)) {
return *vpp == NULLVP ? ENOENT : 0;
}
+ /* May need to restart the lookup with an exclusive lock. */
+ if (VOP_ISLOCKED(vdp) != LK_EXCLUSIVE)
+ return ENOLCK;
len = cnp->cn_namelen;
name = cnp->cn_nameptr;
Index: src/sys/fs/cd9660/cd9660_vfsops.c
diff -u src/sys/fs/cd9660/cd9660_vfsops.c:1.93.18.1 src/sys/fs/cd9660/cd9660_vfsops.c:1.93.18.2
--- src/sys/fs/cd9660/cd9660_vfsops.c:1.93.18.1 Fri Jan 17 21:47:33 2020
+++ src/sys/fs/cd9660/cd9660_vfsops.c Sun Jan 19 21:21:54 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: cd9660_vfsops.c,v 1.93.18.1 2020/01/17 21:47:33 ad Exp $ */
+/* $NetBSD: cd9660_vfsops.c,v 1.93.18.2 2020/01/19 21:21:54 ad Exp $ */
/*-
* Copyright (c) 1994
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cd9660_vfsops.c,v 1.93.18.1 2020/01/17 21:47:33 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cd9660_vfsops.c,v 1.93.18.2 2020/01/19 21:21:54 ad Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -444,7 +444,7 @@ iso_mountfs(struct vnode *devvp, struct
mp->mnt_stat.f_fsid = mp->mnt_stat.f_fsidx.__fsid_val[0];
mp->mnt_stat.f_namemax = ISO_MAXNAMLEN;
mp->mnt_flag |= MNT_LOCAL;
- mp->mnt_iflag |= IMNT_MPSAFE;
+ mp->mnt_iflag |= IMNT_MPSAFE | IMNT_SHRLOOKUP;
mp->mnt_dev_bshift = iso_bsize;
mp->mnt_fs_bshift = isomp->im_bshift;
isomp->im_mountp = mp;
Index: src/sys/fs/msdosfs/msdosfs_lookup.c
diff -u src/sys/fs/msdosfs/msdosfs_lookup.c:1.35 src/sys/fs/msdosfs/msdosfs_lookup.c:1.35.24.1
--- src/sys/fs/msdosfs/msdosfs_lookup.c:1.35 Sat Jan 30 09:59:27 2016
+++ src/sys/fs/msdosfs/msdosfs_lookup.c Sun Jan 19 21:21:54 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: msdosfs_lookup.c,v 1.35 2016/01/30 09:59:27 mlelstv Exp $ */
+/* $NetBSD: msdosfs_lookup.c,v 1.35.24.1 2020/01/19 21:21:54 ad Exp $ */
/*-
* Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@@ -52,7 +52,7 @@
#endif
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msdosfs_lookup.c,v 1.35 2016/01/30 09:59:27 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msdosfs_lookup.c,v 1.35.24.1 2020/01/19 21:21:54 ad Exp $");
#include <sys/param.h>
@@ -161,6 +161,10 @@ msdosfs_lookup(void *v)
return *vpp == NULLVP ? ENOENT: 0;
}
+ /* May need to restart the lookup with an exclusive lock. */
+ if (VOP_ISLOCKED(vdp) != LK_EXCLUSIVE)
+ return ENOLCK;
+
/*
* If they are going after the . or .. entry in the root directory,
* they won't find it. DOS filesystems don't have them in the root
Index: src/sys/fs/msdosfs/msdosfs_vfsops.c
diff -u src/sys/fs/msdosfs/msdosfs_vfsops.c:1.130.6.1 src/sys/fs/msdosfs/msdosfs_vfsops.c:1.130.6.2
--- src/sys/fs/msdosfs/msdosfs_vfsops.c:1.130.6.1 Fri Jan 17 21:47:33 2020
+++ src/sys/fs/msdosfs/msdosfs_vfsops.c Sun Jan 19 21:21:54 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: msdosfs_vfsops.c,v 1.130.6.1 2020/01/17 21:47:33 ad Exp $ */
+/* $NetBSD: msdosfs_vfsops.c,v 1.130.6.2 2020/01/19 21:21:54 ad Exp $ */
/*-
* Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.130.6.1 2020/01/17 21:47:33 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.130.6.2 2020/01/19 21:21:54 ad Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -867,6 +867,7 @@ msdosfs_mountfs(struct vnode *devvp, str
mp->mnt_stat.f_fsid = mp->mnt_stat.f_fsidx.__fsid_val[0];
mp->mnt_stat.f_namemax = MSDOSFS_NAMEMAX(pmp);
mp->mnt_flag |= MNT_LOCAL;
+ mp->mnt_iflag |= IMNT_SHRLOOKUP;
mp->mnt_dev_bshift = pmp->pm_bnshift;
mp->mnt_fs_bshift = pmp->pm_cnshift;
Index: src/sys/fs/tmpfs/tmpfs_vfsops.c
diff -u src/sys/fs/tmpfs/tmpfs_vfsops.c:1.75.2.1 src/sys/fs/tmpfs/tmpfs_vfsops.c:1.75.2.2
--- src/sys/fs/tmpfs/tmpfs_vfsops.c:1.75.2.1 Fri Jan 17 21:47:34 2020
+++ src/sys/fs/tmpfs/tmpfs_vfsops.c Sun Jan 19 21:21:54 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: tmpfs_vfsops.c,v 1.75.2.1 2020/01/17 21:47:34 ad Exp $ */
+/* $NetBSD: tmpfs_vfsops.c,v 1.75.2.2 2020/01/19 21:21:54 ad Exp $ */
/*
* Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_vfsops.c,v 1.75.2.1 2020/01/17 21:47:34 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_vfsops.c,v 1.75.2.2 2020/01/19 21:21:54 ad Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -182,7 +182,7 @@ tmpfs_mount(struct mount *mp, const char
mp->mnt_stat.f_namemax = TMPFS_MAXNAMLEN;
mp->mnt_fs_bshift = PAGE_SHIFT;
mp->mnt_dev_bshift = DEV_BSHIFT;
- mp->mnt_iflag |= IMNT_MPSAFE | IMNT_CAN_RWTORO;
+ mp->mnt_iflag |= IMNT_MPSAFE | IMNT_CAN_RWTORO | IMNT_SHRLOOKUP;
vfs_getnewfsid(mp);
/* Allocate the tmpfs mount structure and fill it. */
Index: src/sys/miscfs/genfs/layer_vnops.c
diff -u src/sys/miscfs/genfs/layer_vnops.c:1.67 src/sys/miscfs/genfs/layer_vnops.c:1.67.12.1
--- src/sys/miscfs/genfs/layer_vnops.c:1.67 Sun Jun 4 08:05:42 2017
+++ src/sys/miscfs/genfs/layer_vnops.c Sun Jan 19 21:21:54 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: layer_vnops.c,v 1.67 2017/06/04 08:05:42 hannken Exp $ */
+/* $NetBSD: layer_vnops.c,v 1.67.12.1 2020/01/19 21:21:54 ad Exp $ */
/*
* Copyright (c) 1999 National Aeronautics & Space Administration
@@ -170,7 +170,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.67 2017/06/04 08:05:42 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.67.12.1 2020/01/19 21:21:54 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -384,6 +384,7 @@ layer_lookup(void *v)
vrele(lvp);
} else if (lvp != NULL) {
/* Note: dvp and ldvp are both locked. */
+ KASSERT(error != ENOLCK);
error = layer_node_create(dvp->v_mount, lvp, ap->a_vpp);
if (error) {
vrele(lvp);
Index: src/sys/miscfs/nullfs/null_vfsops.c
diff -u src/sys/miscfs/nullfs/null_vfsops.c:1.96 src/sys/miscfs/nullfs/null_vfsops.c:1.96.2.1
--- src/sys/miscfs/nullfs/null_vfsops.c:1.96 Sun Dec 15 20:30:56 2019
+++ src/sys/miscfs/nullfs/null_vfsops.c Sun Jan 19 21:21:55 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: null_vfsops.c,v 1.96 2019/12/15 20:30:56 joerg Exp $ */
+/* $NetBSD: null_vfsops.c,v 1.96.2.1 2020/01/19 21:21:55 ad Exp $ */
/*
* Copyright (c) 1999 National Aeronautics & Space Administration
@@ -76,7 +76,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: null_vfsops.c,v 1.96 2019/12/15 20:30:56 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: null_vfsops.c,v 1.96.2.1 2020/01/19 21:21:55 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -140,7 +140,7 @@ nullfs_mount(struct mount *mp, const cha
/* Create the mount point. */
nmp = kmem_zalloc(sizeof(struct null_mount), KM_SLEEP);
mp->mnt_data = nmp;
- mp->mnt_iflag |= IMNT_MPSAFE;
+ mp->mnt_iflag |= IMNT_MPSAFE | IMNT_SHRLOOKUP;
/*
* Make sure that the mount point is sufficiently initialized
Index: src/sys/miscfs/procfs/procfs_vfsops.c
diff -u src/sys/miscfs/procfs/procfs_vfsops.c:1.101.6.1 src/sys/miscfs/procfs/procfs_vfsops.c:1.101.6.2
--- src/sys/miscfs/procfs/procfs_vfsops.c:1.101.6.1 Fri Jan 17 21:47:36 2020
+++ src/sys/miscfs/procfs/procfs_vfsops.c Sun Jan 19 21:21:55 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: procfs_vfsops.c,v 1.101.6.1 2020/01/17 21:47:36 ad Exp $ */
+/* $NetBSD: procfs_vfsops.c,v 1.101.6.2 2020/01/19 21:21:55 ad Exp $ */
/*
* Copyright (c) 1993
@@ -76,7 +76,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.101.6.1 2020/01/17 21:47:36 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.101.6.2 2020/01/19 21:21:55 ad Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -173,7 +173,7 @@ procfs_mount(
else
pmnt->pmnt_flags = 0;
- mp->mnt_iflag |= IMNT_MPSAFE;
+ mp->mnt_iflag |= IMNT_MPSAFE | IMNT_SHRLOOKUP;
return error;
}
Index: src/sys/ufs/chfs/chfs_vnops.c
diff -u src/sys/ufs/chfs/chfs_vnops.c:1.34.4.1 src/sys/ufs/chfs/chfs_vnops.c:1.34.4.2
--- src/sys/ufs/chfs/chfs_vnops.c:1.34.4.1 Fri Jan 17 21:47:37 2020
+++ src/sys/ufs/chfs/chfs_vnops.c Sun Jan 19 21:21:55 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: chfs_vnops.c,v 1.34.4.1 2020/01/17 21:47:37 ad Exp $ */
+/* $NetBSD: chfs_vnops.c,v 1.34.4.2 2020/01/19 21:21:55 ad Exp $ */
/*-
* Copyright (c) 2010 Department of Software Engineering,
@@ -90,6 +90,10 @@ chfs_lookup(void *v)
return (*vpp == NULLVP ? ENOENT : 0);
}
+ /* May need to restart the lookup with an exclusive lock. */
+ if (VOP_ISLOCKED(dvp) != LK_EXCLUSIVE)
+ return ENOLCK;
+
ip = VTOI(dvp);
ump = VFSTOUFS(dvp->v_mount);
chmp = ump->um_chfs;
Index: src/sys/ufs/ext2fs/ext2fs_lookup.c
diff -u src/sys/ufs/ext2fs/ext2fs_lookup.c:1.88 src/sys/ufs/ext2fs/ext2fs_lookup.c:1.88.22.1
--- src/sys/ufs/ext2fs/ext2fs_lookup.c:1.88 Tue Aug 23 06:40:25 2016
+++ src/sys/ufs/ext2fs/ext2fs_lookup.c Sun Jan 19 21:21:55 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_lookup.c,v 1.88 2016/08/23 06:40:25 christos Exp $ */
+/* $NetBSD: ext2fs_lookup.c,v 1.88.22.1 2020/01/19 21:21:55 ad Exp $ */
/*
* Modified for NetBSD 1.2E
@@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_lookup.c,v 1.88 2016/08/23 06:40:25 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_lookup.c,v 1.88.22.1 2020/01/19 21:21:55 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -313,14 +313,6 @@ ext2fs_lookup(void *v)
*vpp = NULL;
/*
- * Produce the auxiliary lookup results into i_crap. Increment
- * its serial number so elsewhere we can tell if we're using
- * stale results. This should not be done this way. XXX.
- */
- results = &dp->i_crap;
- dp->i_crapcounter++;
-
- /*
* Check accessiblity of directory.
*/
if ((error = VOP_ACCESS(vdp, VEXEC, cred)) != 0)
@@ -342,6 +334,18 @@ ext2fs_lookup(void *v)
return *vpp == NULLVP ? ENOENT : 0;
}
+ /* May need to restart the lookup with an exclusive lock. */
+ if (VOP_ISLOCKED(vdp) != LK_EXCLUSIVE)
+ return ENOLCK;
+
+ /*
+ * Produce the auxiliary lookup results into i_crap. Increment
+ * its serial number so elsewhere we can tell if we're using
+ * stale results. This should not be done this way. XXX.
+ */
+ results = &dp->i_crap;
+ dp->i_crapcounter++;
+
/*
* Suppress search for slots unless creating
* file and at end of pathname, in which case
Index: src/sys/ufs/ext2fs/ext2fs_vfsops.c
diff -u src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.214.4.1 src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.214.4.2
--- src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.214.4.1 Fri Jan 17 21:47:37 2020
+++ src/sys/ufs/ext2fs/ext2fs_vfsops.c Sun Jan 19 21:21:55 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_vfsops.c,v 1.214.4.1 2020/01/17 21:47:37 ad Exp $ */
+/* $NetBSD: ext2fs_vfsops.c,v 1.214.4.2 2020/01/19 21:21:55 ad Exp $ */
/*
* Copyright (c) 1989, 1991, 1993, 1994
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.214.4.1 2020/01/17 21:47:37 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.214.4.2 2020/01/19 21:21:55 ad Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -736,7 +736,7 @@ ext2fs_mountfs(struct vnode *devvp, stru
mp->mnt_flag |= MNT_LOCAL;
mp->mnt_dev_bshift = DEV_BSHIFT; /* XXX */
mp->mnt_fs_bshift = m_fs->e2fs_bshift;
- mp->mnt_iflag |= IMNT_DTYPE;
+ mp->mnt_iflag |= IMNT_DTYPE | IMNT_SHRLOOKUP;
ump->um_flags = 0;
ump->um_mountp = mp;
ump->um_dev = dev;
Index: src/sys/ufs/ffs/ffs_vfsops.c
diff -u src/sys/ufs/ffs/ffs_vfsops.c:1.362.4.2 src/sys/ufs/ffs/ffs_vfsops.c:1.362.4.3
--- src/sys/ufs/ffs/ffs_vfsops.c:1.362.4.2 Fri Jan 17 22:26:26 2020
+++ src/sys/ufs/ffs/ffs_vfsops.c Sun Jan 19 21:21:55 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: ffs_vfsops.c,v 1.362.4.2 2020/01/17 22:26:26 ad Exp $ */
+/* $NetBSD: ffs_vfsops.c,v 1.362.4.3 2020/01/19 21:21:55 ad Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.362.4.2 2020/01/17 22:26:26 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.362.4.3 2020/01/19 21:21:55 ad Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@@ -1453,7 +1453,7 @@ ffs_mountfs(struct vnode *devvp, struct
mp->mnt_fs_bshift = fs->fs_bshift;
mp->mnt_dev_bshift = DEV_BSHIFT; /* XXX */
mp->mnt_flag |= MNT_LOCAL;
- mp->mnt_iflag |= IMNT_MPSAFE | IMNT_CAN_RWTORO;
+ mp->mnt_iflag |= IMNT_MPSAFE | IMNT_CAN_RWTORO | IMNT_SHRLOOKUP;
#ifdef FFS_EI
if (needswap)
ump->um_flags |= UFS_NEEDSWAP;
Index: src/sys/ufs/lfs/lfs_vfsops.c
diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.367.2.1 src/sys/ufs/lfs/lfs_vfsops.c:1.367.2.2
--- src/sys/ufs/lfs/lfs_vfsops.c:1.367.2.1 Fri Jan 17 21:47:37 2020
+++ src/sys/ufs/lfs/lfs_vfsops.c Sun Jan 19 21:21:55 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_vfsops.c,v 1.367.2.1 2020/01/17 21:47:37 ad Exp $ */
+/* $NetBSD: lfs_vfsops.c,v 1.367.2.2 2020/01/19 21:21:55 ad Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.367.2.1 2020/01/17 21:47:37 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.367.2.2 2020/01/19 21:21:55 ad Exp $");
#if defined(_KERNEL_OPT)
#include "opt_lfs.h"
@@ -1136,6 +1136,7 @@ lfs_mountfs(struct vnode *devvp, struct
mp->mnt_stat.f_namemax = LFS_MAXNAMLEN;
mp->mnt_stat.f_iosize = lfs_sb_getbsize(fs);
mp->mnt_flag |= MNT_LOCAL;
+ mp->mnt_iflag |= IMNT_SHRLOOKUP;
mp->mnt_fs_bshift = lfs_sb_getbshift(fs);
if (fs->um_maxsymlinklen > 0)
mp->mnt_iflag |= IMNT_DTYPE;
Index: src/sys/ufs/lfs/ulfs_lookup.c
diff -u src/sys/ufs/lfs/ulfs_lookup.c:1.41 src/sys/ufs/lfs/ulfs_lookup.c:1.41.12.1
--- src/sys/ufs/lfs/ulfs_lookup.c:1.41 Sat Jun 10 05:29:36 2017
+++ src/sys/ufs/lfs/ulfs_lookup.c Sun Jan 19 21:21:55 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: ulfs_lookup.c,v 1.41 2017/06/10 05:29:36 maya Exp $ */
+/* $NetBSD: ulfs_lookup.c,v 1.41.12.1 2020/01/19 21:21:55 ad Exp $ */
/* from NetBSD: ufs_lookup.c,v 1.135 2015/07/11 11:04:48 mlelstv */
/*
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.41 2017/06/10 05:29:36 maya Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.41.12.1 2020/01/19 21:21:55 ad Exp $");
#ifdef _KERNEL_OPT
#include "opt_lfs.h"
@@ -162,14 +162,6 @@ ulfs_lookup(void *v)
endsearch = 0; /* silence compiler warning */
/*
- * Produce the auxiliary lookup results into i_crap. Increment
- * its serial number so elsewhere we can tell if we're using
- * stale results. This should not be done this way. XXX.
- */
- results = &dp->i_crap;
- dp->i_crapcounter++;
-
- /*
* Check accessiblity of directory.
*/
if ((error = VOP_ACCESS(vdp, VEXEC, cred)) != 0)
@@ -193,6 +185,19 @@ ulfs_lookup(void *v)
}
return *vpp == NULLVP ? ENOENT : 0;
}
+
+ /* May need to restart the lookup with an exclusive lock. */
+ if (VOP_ISLOCKED(vdp) != LK_EXCLUSIVE)
+ return ENOLCK;
+
+ /*
+ * Produce the auxiliary lookup results into i_crap. Increment
+ * its serial number so elsewhere we can tell if we're using
+ * stale results. This should not be done this way. XXX.
+ */
+ results = &dp->i_crap;
+ dp->i_crapcounter++;
+
if (iswhiteout) {
/*
* The namecache set iswhiteout without finding a
Index: src/sys/ufs/ufs/ufs_lookup.c
diff -u src/sys/ufs/ufs/ufs_lookup.c:1.150 src/sys/ufs/ufs/ufs_lookup.c:1.150.4.1
--- src/sys/ufs/ufs/ufs_lookup.c:1.150 Sun May 5 15:07:12 2019
+++ src/sys/ufs/ufs/ufs_lookup.c Sun Jan 19 21:21:55 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: ufs_lookup.c,v 1.150 2019/05/05 15:07:12 christos Exp $ */
+/* $NetBSD: ufs_lookup.c,v 1.150.4.1 2020/01/19 21:21:55 ad Exp $ */
/*
* Copyright (c) 1989, 1993
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_lookup.c,v 1.150 2019/05/05 15:07:12 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_lookup.c,v 1.150.4.1 2020/01/19 21:21:55 ad Exp $");
#ifdef _KERNEL_OPT
#include "opt_ffs.h"
@@ -330,14 +330,6 @@ ufs_lookup(void *v)
endsearch = 0; /* silence compiler warning */
/*
- * Produce the auxiliary lookup results into i_crap. Increment
- * its serial number so elsewhere we can tell if we're using
- * stale results. This should not be done this way. XXX.
- */
- results = &dp->i_crap;
- dp->i_crapcounter++;
-
- /*
* Check accessiblity of directory.
*/
if ((error = VOP_ACCESS(vdp, VEXEC, cred)) != 0)
@@ -361,6 +353,20 @@ ufs_lookup(void *v)
}
return *vpp == NULLVP ? ENOENT : 0;
}
+
+ /* May need to restart the lookup with an exclusive lock. */
+ if (VOP_ISLOCKED(vdp) != LK_EXCLUSIVE) {
+ return ENOLCK;
+ }
+
+ /*
+ * Produce the auxiliary lookup results into i_crap. Increment
+ * its serial number so elsewhere we can tell if we're using
+ * stale results. This should not be done this way. XXX.
+ */
+ results = &dp->i_crap;
+ dp->i_crapcounter++;
+
if (iswhiteout) {
/*
* The namecache set iswhiteout without finding a