Module Name:    src
Committed By:   ad
Date:           Tue May 12 23:17:42 UTC 2020

Modified Files:
        src/sys/fs/tmpfs: tmpfs_subr.c
        src/sys/kern: vfs_cache.c
        src/sys/sys: namei.src
        src/sys/ufs/ffs: ffs_vfsops.c
        src/sys/ufs/ufs: ufs_vnops.c

Log Message:
cache_enter_id(): give it a boolean parameter to indicate whether the cached
identity is valid.


To generate a diff of this commit:
cvs rdiff -u -r1.109 -r1.110 src/sys/fs/tmpfs/tmpfs_subr.c
cvs rdiff -u -r1.141 -r1.142 src/sys/kern/vfs_cache.c
cvs rdiff -u -r1.53 -r1.54 src/sys/sys/namei.src
cvs rdiff -u -r1.367 -r1.368 src/sys/ufs/ffs/ffs_vfsops.c
cvs rdiff -u -r1.252 -r1.253 src/sys/ufs/ufs/ufs_vnops.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/tmpfs/tmpfs_subr.c
diff -u src/sys/fs/tmpfs/tmpfs_subr.c:1.109 src/sys/fs/tmpfs/tmpfs_subr.c:1.110
--- src/sys/fs/tmpfs/tmpfs_subr.c:1.109	Thu Apr 23 21:47:08 2020
+++ src/sys/fs/tmpfs/tmpfs_subr.c	Tue May 12 23:17:41 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: tmpfs_subr.c,v 1.109 2020/04/23 21:47:08 ad Exp $	*/
+/*	$NetBSD: tmpfs_subr.c,v 1.110 2020/05/12 23:17:41 ad Exp $	*/
 
 /*
  * Copyright (c) 2005-2013 The NetBSD Foundation, Inc.
@@ -73,7 +73,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.109 2020/04/23 21:47:08 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.110 2020/05/12 23:17:41 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/cprng.h>
@@ -148,7 +148,7 @@ tmpfs_init_vnode(struct vnode *vp, tmpfs
 	node->tn_vnode = vp;
 	uvm_vnp_setsize(vp, node->tn_size);
 	KASSERT(node->tn_mode != VNOVAL);
-	cache_enter_id(vp, node->tn_mode, node->tn_uid, node->tn_gid);
+	cache_enter_id(vp, node->tn_mode, node->tn_uid, node->tn_gid, true);
 }
 
 /*
@@ -1041,7 +1041,7 @@ tmpfs_chmod(vnode_t *vp, mode_t mode, ka
 	node->tn_mode = (mode & ALLPERMS);
 	tmpfs_update(vp, TMPFS_UPDATE_CTIME);
 	VN_KNOTE(vp, NOTE_ATTRIB);
-	cache_enter_id(vp, node->tn_mode, node->tn_uid, node->tn_gid);
+	cache_enter_id(vp, node->tn_mode, node->tn_uid, node->tn_gid, true);
 	return 0;
 }
 
@@ -1086,7 +1086,7 @@ tmpfs_chown(vnode_t *vp, uid_t uid, gid_
 	node->tn_gid = gid;
 	tmpfs_update(vp, TMPFS_UPDATE_CTIME);
 	VN_KNOTE(vp, NOTE_ATTRIB);
-	cache_enter_id(vp, node->tn_mode, node->tn_uid, node->tn_gid);
+	cache_enter_id(vp, node->tn_mode, node->tn_uid, node->tn_gid, true);
 	return 0;
 }
 

Index: src/sys/kern/vfs_cache.c
diff -u src/sys/kern/vfs_cache.c:1.141 src/sys/kern/vfs_cache.c:1.142
--- src/sys/kern/vfs_cache.c:1.141	Thu Apr 23 22:58:36 2020
+++ src/sys/kern/vfs_cache.c	Tue May 12 23:17:41 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_cache.c,v 1.141 2020/04/23 22:58:36 ad Exp $	*/
+/*	$NetBSD: vfs_cache.c,v 1.142 2020/05/12 23:17:41 ad Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2019, 2020 The NetBSD Foundation, Inc.
@@ -172,7 +172,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.141 2020/04/23 22:58:36 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.142 2020/05/12 23:17:41 ad Exp $");
 
 #define __NAMECACHE_PRIVATE
 #ifdef _KERNEL_OPT
@@ -683,8 +683,10 @@ cache_lookup_linked(struct vnode *dvp, c
 	 * First up check if the user is allowed to look up files in this
 	 * directory.
 	 */
-	KASSERT(dvi->vi_nc_mode != VNOVAL && dvi->vi_nc_uid != VNOVAL &&
-	    dvi->vi_nc_gid != VNOVAL);
+	if (dvi->vi_nc_mode == VNOVAL) {
+		return false;
+	}
+	KASSERT(dvi->vi_nc_uid != VNOVAL && dvi->vi_nc_gid != VNOVAL);
 	error = kauth_authorize_vnode(cred, KAUTH_ACCESS_ACTION(VEXEC,
 	    dvp->v_type, dvi->vi_nc_mode & ALLPERMS), dvp, NULL,
 	    genfs_can_access(dvp->v_type, dvi->vi_nc_mode & ALLPERMS,
@@ -763,8 +765,11 @@ cache_revlookup(struct vnode *vp, struct
 		 *
 		 * I don't like it, I didn't come up with it, don't blame me!
 		 */
-		KASSERT(vi->vi_nc_mode != VNOVAL && vi->vi_nc_uid != VNOVAL &&
-		    vi->vi_nc_gid != VNOVAL);
+		if (vi->vi_nc_mode == VNOVAL) {
+			rw_exit(&vi->vi_nc_listlock);
+			return -1;
+		}
+		KASSERT(vi->vi_nc_uid != VNOVAL && vi->vi_nc_gid != VNOVAL);
 		error = kauth_authorize_vnode(curlwp->l_cred,
 		    KAUTH_ACCESS_ACTION(VEXEC, vp->v_type, vi->vi_nc_mode &
 		    ALLPERMS), vp, NULL, genfs_can_access(vp->v_type,
@@ -941,10 +946,11 @@ cache_enter(struct vnode *dvp, struct vn
 
 /*
  * Set identity info in cache for a vnode.  We only care about directories
- * so ignore other updates.
+ * so ignore other updates.  The cached info may be marked invalid if the
+ * inode has an ACL.
  */
 void
-cache_enter_id(struct vnode *vp, mode_t mode, uid_t uid, gid_t gid)
+cache_enter_id(struct vnode *vp, mode_t mode, uid_t uid, gid_t gid, bool valid)
 {
 	vnode_impl_t *vi = VNODE_TO_VIMPL(vp);
 
@@ -952,9 +958,15 @@ cache_enter_id(struct vnode *vp, mode_t 
 		/* Grab both locks, for forward & reverse lookup. */
 		rw_enter(&vi->vi_nc_lock, RW_WRITER);
 		rw_enter(&vi->vi_nc_listlock, RW_WRITER);
-		vi->vi_nc_mode = mode;
-		vi->vi_nc_uid = uid;
-		vi->vi_nc_gid = gid;
+		if (valid) {
+			vi->vi_nc_mode = mode;
+			vi->vi_nc_uid = uid;
+			vi->vi_nc_gid = gid;
+		} else {
+			vi->vi_nc_mode = VNOVAL;
+			vi->vi_nc_uid = VNOVAL;
+			vi->vi_nc_gid = VNOVAL;
+		}
 		rw_exit(&vi->vi_nc_listlock);
 		rw_exit(&vi->vi_nc_lock);
 	}
@@ -965,18 +977,15 @@ cache_enter_id(struct vnode *vp, mode_t 
  * opportunity to confirm that everything squares up.
  *
  * Because of shared code, some file systems could provide partial
- * information, missing some updates, so always check the mount flag
- * instead of looking for !VNOVAL.
+ * information, missing some updates, so check the mount flag too.
  */
 bool
 cache_have_id(struct vnode *vp)
 {
 
 	if (vp->v_type == VDIR &&
-	    (vp->v_mount->mnt_iflag & IMNT_NCLOOKUP) != 0) {
-		KASSERT(VNODE_TO_VIMPL(vp)->vi_nc_mode != VNOVAL);
-		KASSERT(VNODE_TO_VIMPL(vp)->vi_nc_uid != VNOVAL);
-		KASSERT(VNODE_TO_VIMPL(vp)->vi_nc_gid != VNOVAL);
+	    (vp->v_mount->mnt_iflag & IMNT_NCLOOKUP) != 0 &&
+	    atomic_load_relaxed(&VNODE_TO_VIMPL(vp)->vi_nc_mode) != VNOVAL) {
 		return true;
 	} else {
 		return false;

Index: src/sys/sys/namei.src
diff -u src/sys/sys/namei.src:1.53 src/sys/sys/namei.src:1.54
--- src/sys/sys/namei.src:1.53	Sat Apr  4 20:49:31 2020
+++ src/sys/sys/namei.src	Tue May 12 23:17:41 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: namei.src,v 1.53 2020/04/04 20:49:31 ad Exp $	*/
+/*	$NetBSD: namei.src,v 1.54 2020/05/12 23:17:41 ad Exp $	*/
 
 /*
  * Copyright (c) 1985, 1989, 1991, 1993
@@ -294,7 +294,7 @@ int	cache_revlookup(struct vnode *, stru
 int	cache_diraccess(struct vnode *, int);
 void	cache_enter(struct vnode *, struct vnode *,
 			const char *, size_t, uint32_t);
-void	cache_enter_id(struct vnode *, mode_t, uid_t, gid_t);
+void	cache_enter_id(struct vnode *, mode_t, uid_t, gid_t, bool);
 bool	cache_have_id(struct vnode *);
 void	cache_vnode_init(struct vnode * );
 void	cache_vnode_fini(struct vnode * );

Index: src/sys/ufs/ffs/ffs_vfsops.c
diff -u src/sys/ufs/ffs/ffs_vfsops.c:1.367 src/sys/ufs/ffs/ffs_vfsops.c:1.368
--- src/sys/ufs/ffs/ffs_vfsops.c:1.367	Sat Apr  4 20:49:31 2020
+++ src/sys/ufs/ffs/ffs_vfsops.c	Tue May 12 23:17:41 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs_vfsops.c,v 1.367 2020/04/04 20:49:31 ad Exp $	*/
+/*	$NetBSD: ffs_vfsops.c,v 1.368 2020/05/12 23:17:41 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.367 2020/04/04 20:49:31 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.368 2020/05/12 23:17:41 ad Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -2084,7 +2084,7 @@ ffs_loadvnode(struct mount *mp, struct v
 		ip->i_gid = ip->i_ffs1_ogid;			/* XXX */
 	}							/* XXX */
 	uvm_vnp_setsize(vp, ip->i_size);
-	cache_enter_id(vp, ip->i_mode, ip->i_uid, ip->i_gid);
+	cache_enter_id(vp, ip->i_mode, ip->i_uid, ip->i_gid, true);
 	*new_key = &ip->i_number;
 	return 0;
 }
@@ -2206,7 +2206,7 @@ ffs_newvnode(struct mount *mp, struct vn
 	}
 
 	uvm_vnp_setsize(vp, ip->i_size);
-	cache_enter_id(vp, ip->i_mode, ip->i_uid, ip->i_gid);
+	cache_enter_id(vp, ip->i_mode, ip->i_uid, ip->i_gid, true);
 	*new_key = &ip->i_number;
 	return 0;
 }

Index: src/sys/ufs/ufs/ufs_vnops.c
diff -u src/sys/ufs/ufs/ufs_vnops.c:1.252 src/sys/ufs/ufs/ufs_vnops.c:1.253
--- src/sys/ufs/ufs/ufs_vnops.c:1.252	Sat Apr 18 19:18:34 2020
+++ src/sys/ufs/ufs/ufs_vnops.c	Tue May 12 23:17:41 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_vnops.c,v 1.252 2020/04/18 19:18:34 christos Exp $	*/
+/*	$NetBSD: ufs_vnops.c,v 1.253 2020/05/12 23:17:41 ad Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2020 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.252 2020/04/18 19:18:34 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.253 2020/05/12 23:17:41 ad Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -621,7 +621,7 @@ ufs_setattr(void *v)
 	}
 	VN_KNOTE(vp, NOTE_ATTRIB);
 out:
-	cache_enter_id(vp, ip->i_mode, ip->i_uid, ip->i_gid);
+	cache_enter_id(vp, ip->i_mode, ip->i_uid, ip->i_gid, true);
 	return (error);
 }
 
@@ -649,7 +649,7 @@ ufs_chmod(struct vnode *vp, int mode, ka
 	ip->i_flag |= IN_CHANGE;
 	DIP_ASSIGN(ip, mode, ip->i_mode);
 	UFS_WAPBL_UPDATE(vp, NULL, NULL, 0);
-	cache_enter_id(vp, ip->i_mode, ip->i_uid, ip->i_gid);
+	cache_enter_id(vp, ip->i_mode, ip->i_uid, ip->i_gid, true);
 	return (0);
 }
 
@@ -710,7 +710,7 @@ ufs_chown(struct vnode *vp, uid_t uid, g
 #endif /* QUOTA || QUOTA2 */
 	ip->i_flag |= IN_CHANGE;
 	UFS_WAPBL_UPDATE(vp, NULL, NULL, 0);
-	cache_enter_id(vp, ip->i_mode, ip->i_uid, ip->i_gid);
+	cache_enter_id(vp, ip->i_mode, ip->i_uid, ip->i_gid, true);
 	return (0);
 }
 

Reply via email to