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); }