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

Reply via email to