Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 8 Aug 2020 11:08:03 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r364051 - in projects/clang1100-import: share/man/man9 sys/cam/mmc sys/compat/linuxkpi/common/src sys/fs/tmpfs sys/kern sys/security/audit sys/sys sys/ufs/ufs tests/sys/net/routing usr....
Message-ID:  <202008081108.078B83U5042037@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Sat Aug  8 11:08:03 2020
New Revision: 364051
URL: https://svnweb.freebsd.org/changeset/base/364051

Log:
  Merge ^/head r364041 through r364050.

Added:
  projects/clang1100-import/usr.sbin/pwd_mkdb/bootstrap/
     - copied from r364050, head/usr.sbin/pwd_mkdb/bootstrap/
Deleted:
  projects/clang1100-import/usr.sbin/pwd_mkdb/pwd.h
Modified:
  projects/clang1100-import/share/man/man9/Makefile
  projects/clang1100-import/share/man/man9/VOP_ATTRIB.9
  projects/clang1100-import/sys/cam/mmc/mmc_da.c
  projects/clang1100-import/sys/compat/linuxkpi/common/src/linux_compat.c
  projects/clang1100-import/sys/fs/tmpfs/tmpfs_vnops.c
  projects/clang1100-import/sys/fs/tmpfs/tmpfs_vnops.h
  projects/clang1100-import/sys/kern/vfs_default.c
  projects/clang1100-import/sys/kern/vfs_subr.c
  projects/clang1100-import/sys/kern/vfs_syscalls.c
  projects/clang1100-import/sys/kern/vfs_vnops.c
  projects/clang1100-import/sys/kern/vnode_if.src
  projects/clang1100-import/sys/security/audit/audit_arg.c
  projects/clang1100-import/sys/sys/vnode.h
  projects/clang1100-import/sys/ufs/ufs/ufs_vnops.c
  projects/clang1100-import/tests/sys/net/routing/rtsock_common.h
  projects/clang1100-import/usr.bin/chpass/Makefile
  projects/clang1100-import/usr.sbin/pwd_mkdb/Makefile
Directory Properties:
  projects/clang1100-import/   (props changed)

Modified: projects/clang1100-import/share/man/man9/Makefile
==============================================================================
--- projects/clang1100-import/share/man/man9/Makefile	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/share/man/man9/Makefile	Sat Aug  8 11:08:03 2020	(r364051)
@@ -2308,7 +2308,8 @@ MLINKS+=vm_page_insert.9 vm_page_remove.9
 MLINKS+=vm_page_wire.9 vm_page_unwire.9
 MLINKS+=VOP_ACCESS.9 VOP_ACCESSX.9
 MLINKS+=VOP_ATTRIB.9 VOP_GETATTR.9 \
-	VOP_ATTRIB.9 VOP_SETATTR.9
+	VOP_ATTRIB.9 VOP_SETATTR.9 \
+	VOP_ATTRIB.9 VOP_STAT.9
 MLINKS+=VOP_CREATE.9 VOP_MKDIR.9 \
 	VOP_CREATE.9 VOP_MKNOD.9 \
 	VOP_CREATE.9 VOP_SYMLINK.9

Modified: projects/clang1100-import/share/man/man9/VOP_ATTRIB.9
==============================================================================
--- projects/clang1100-import/share/man/man9/VOP_ATTRIB.9	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/share/man/man9/VOP_ATTRIB.9	Sat Aug  8 11:08:03 2020	(r364051)
@@ -28,7 +28,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd August 29, 2008
+.Dd August 8, 2020
 .Dt VOP_ATTRIB 9
 .Os
 .Sh NAME
@@ -42,21 +42,51 @@
 .Fn VOP_GETATTR "struct vnode *vp" "struct vattr *vap" "struct ucred *cred"
 .Ft int
 .Fn VOP_SETATTR "struct vnode *vp" "struct vattr *vap" "struct ucred *cred"
+.Ft int
+.Fn VOP_STAT "struct vnode *vp" "struct stat *sb" "struct ucred *active_cred" \
+"struct ucred *file_cred" "struct thread *td"
 .Sh DESCRIPTION
 These entry points manipulate various attributes of a file or directory,
 including file permissions, owner, group, size,
 access time and modification time.
 .Pp
-The arguments are:
+.Fn VOP_STAT
+returns data in a format suitable for the
+.Xr stat 2
+system call and by default is implemented as a wrapper around
+.Fn VOP_GETATTR .
+Filesystems may want to implement their own variant for performance reasons.
+.Pp
+For
+.Fn VOP_GETATTR
+and
+.Fn VOP_SETATTR
+the arguments are:
 .Bl -tag -width cred
 .It Fa vp
 The vnode of the file.
 .It Fa vap
 The attributes of the file.
 .It Fa cred
-The user credentials of the calling process.
+The user credentials of the calling thread.
 .El
 .Pp
+For
+.Fn VOP_STAT
+the arguments are:
+.Bl -tag -width active_cred
+.It Fa vp
+The vnode of the file.
+.It Fa sb
+The attributes of the file.
+.It Fa active_cred
+The user credentials of the calling thread.
+.It Fa file_cred
+The credentials installed on the file description pointing to the vnode or NOCRED.
+.It Fa td
+The calling thread.
+.El
+.Pp
 Attributes which are not being modified by
 .Fn VOP_SETATTR
 should be set to the value
@@ -67,8 +97,11 @@ the contents of
 .Fa *vap
 prior to setting specific values.
 .Sh LOCKS
+Both
 .Fn VOP_GETATTR
-expects the vnode to be locked on entry and will leave the vnode locked on
+and
+.Fn VOP_STAT
+expect the vnode to be locked on entry and will leave the vnode locked on
 return.
 The lock type can be either shared or exclusive.
 .Pp
@@ -84,6 +117,10 @@ otherwise an appropriate error is returned.
 .Fn VOP_SETATTR
 returns zero if the attributes were changed successfully, otherwise an
 appropriate error is returned.
+.Fn VOP_STAT
+returns 0 if it was able to retrieve the attribute data
+.Fa *sb ,
+otherwise an appropriate error is returned.
 .Sh ERRORS
 .Bl -tag -width Er
 .It Bq Er EPERM

Modified: projects/clang1100-import/sys/cam/mmc/mmc_da.c
==============================================================================
--- projects/clang1100-import/sys/cam/mmc/mmc_da.c	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/cam/mmc/mmc_da.c	Sat Aug  8 11:08:03 2020	(r364051)
@@ -789,7 +789,6 @@ sddaregister(struct cam_periph *periph, void *arg)
 
 	softc = (struct sdda_softc *)malloc(sizeof(*softc), M_DEVBUF,
 	    M_NOWAIT|M_ZERO);
-
 	if (softc == NULL) {
 		printf("sddaregister: Unable to probe new device. "
 		    "Unable to allocate softc\n");
@@ -802,6 +801,7 @@ sddaregister(struct cam_periph *periph, void *arg)
 	if (softc->mmcdata == NULL) {
 		printf("sddaregister: Unable to probe new device. "
 		    "Unable to allocate mmcdata\n");
+		free(softc, M_DEVBUF);
 		return (CAM_REQ_CMP_ERR);
 	}
 	periph->softc = softc;

Modified: projects/clang1100-import/sys/compat/linuxkpi/common/src/linux_compat.c
==============================================================================
--- projects/clang1100-import/sys/compat/linuxkpi/common/src/linux_compat.c	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/compat/linuxkpi/common/src/linux_compat.c	Sat Aug  8 11:08:03 2020	(r364051)
@@ -1691,7 +1691,7 @@ linux_file_stat(struct file *fp, struct stat *sb, stru
 	vp = filp->f_vnode;
 
 	vn_lock(vp, LK_SHARED | LK_RETRY);
-	error = vn_stat(vp, sb, td->td_ucred, NOCRED, td);
+	error = VOP_STAT(vp, sb, td->td_ucred, NOCRED, td);
 	VOP_UNLOCK(vp);
 
 	return (error);

Modified: projects/clang1100-import/sys/fs/tmpfs/tmpfs_vnops.c
==============================================================================
--- projects/clang1100-import/sys/fs/tmpfs/tmpfs_vnops.c	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/fs/tmpfs/tmpfs_vnops.c	Sat Aug  8 11:08:03 2020	(r364051)
@@ -56,6 +56,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/unistd.h>
 #include <sys/vnode.h>
 #include <sys/smr.h>
+#include <security/audit/audit.h>
+#include <security/mac/mac_framework.h>
 
 #include <vm/vm.h>
 #include <vm/vm_param.h>
@@ -406,6 +408,52 @@ out:
 }
 
 int
+tmpfs_stat(struct vop_stat_args *v)
+{
+	struct vnode *vp = v->a_vp;
+	struct stat *sb = v->a_sb;
+	vm_object_t obj;
+	struct tmpfs_node *node;
+	int error;
+
+	node = VP_TO_TMPFS_NODE(vp);
+
+	tmpfs_update_getattr(vp);
+
+	error = vop_stat_helper_pre(v);
+	if (__predict_false(error))
+		return (error);
+
+	sb->st_dev = vp->v_mount->mnt_stat.f_fsid.val[0];
+	sb->st_ino = node->tn_id;
+	sb->st_mode = node->tn_mode | VTTOIF(vp->v_type);
+	sb->st_nlink = node->tn_links;
+	sb->st_uid = node->tn_uid;
+	sb->st_gid = node->tn_gid;
+	sb->st_rdev = (vp->v_type == VBLK || vp->v_type == VCHR) ?
+		node->tn_rdev : NODEV;
+	sb->st_size = node->tn_size;
+	sb->st_atim.tv_sec = node->tn_atime.tv_sec;
+	sb->st_atim.tv_nsec = node->tn_atime.tv_nsec;
+	sb->st_mtim.tv_sec = node->tn_mtime.tv_sec;
+	sb->st_mtim.tv_nsec = node->tn_mtime.tv_nsec;
+	sb->st_ctim.tv_sec = node->tn_ctime.tv_sec;
+	sb->st_ctim.tv_nsec = node->tn_ctime.tv_nsec;
+	sb->st_birthtim.tv_sec = node->tn_birthtime.tv_sec;
+	sb->st_birthtim.tv_nsec = node->tn_birthtime.tv_nsec;
+	sb->st_blksize = PAGE_SIZE;
+	sb->st_flags = node->tn_flags;
+	sb->st_gen = node->tn_gen;
+	if (vp->v_type == VREG) {
+		obj = node->tn_reg.tn_aobj;
+		sb->st_blocks = (u_quad_t)obj->resident_page_count * PAGE_SIZE;
+	} else
+		sb->st_blocks = node->tn_size;
+	sb->st_blocks /= S_BLKSIZE;
+	return (vop_stat_helper_post(v, error));
+}
+
+int
 tmpfs_getattr(struct vop_getattr_args *v)
 {
 	struct vnode *vp = v->a_vp;
@@ -1675,6 +1723,7 @@ struct vop_vector tmpfs_vnodeop_entries = {
 	.vop_close =			tmpfs_close,
 	.vop_fplookup_vexec =		tmpfs_fplookup_vexec,
 	.vop_access =			tmpfs_access,
+	.vop_stat =			tmpfs_stat,
 	.vop_getattr =			tmpfs_getattr,
 	.vop_setattr =			tmpfs_setattr,
 	.vop_read =			tmpfs_read,

Modified: projects/clang1100-import/sys/fs/tmpfs/tmpfs_vnops.h
==============================================================================
--- projects/clang1100-import/sys/fs/tmpfs/tmpfs_vnops.h	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/fs/tmpfs/tmpfs_vnops.h	Sat Aug  8 11:08:03 2020	(r364051)
@@ -50,6 +50,7 @@ extern struct vop_vector tmpfs_vnodeop_nonc_entries;
 
 vop_access_t	tmpfs_access;
 vop_fplookup_vexec_t tmpfs_fplookup_vexec;
+vop_stat_t	tmpfs_stat;
 vop_getattr_t	tmpfs_getattr;
 vop_setattr_t	tmpfs_setattr;
 vop_pathconf_t	tmpfs_pathconf;

Modified: projects/clang1100-import/sys/kern/vfs_default.c
==============================================================================
--- projects/clang1100-import/sys/kern/vfs_default.c	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/kern/vfs_default.c	Sat Aug  8 11:08:03 2020	(r364051)
@@ -57,6 +57,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/vnode.h>
 #include <sys/dirent.h>
 #include <sys/poll.h>
+#include <sys/stat.h>
+#include <security/audit/audit.h>
+#include <sys/priv.h>
 
 #include <security/mac/mac_framework.h>
 
@@ -87,6 +90,7 @@ static int vop_stdadd_writecount(struct vop_add_writec
 static int vop_stdcopy_file_range(struct vop_copy_file_range_args *ap);
 static int vop_stdfdatasync(struct vop_fdatasync_args *ap);
 static int vop_stdgetpages_async(struct vop_getpages_async_args *ap);
+static int vop_stdstat(struct vop_stat_args *ap);
 
 /*
  * This vnode table stores what we want to do if the filesystem doesn't
@@ -114,6 +118,7 @@ struct vop_vector default_vnodeops = {
 	.vop_bmap =		vop_stdbmap,
 	.vop_close =		VOP_NULL,
 	.vop_fsync =		VOP_NULL,
+	.vop_stat =		vop_stdstat,
 	.vop_fdatasync =	vop_stdfdatasync,
 	.vop_getpages =		vop_stdgetpages,
 	.vop_getpages_async =	vop_stdgetpages_async,
@@ -1460,4 +1465,112 @@ vop_sigdefer(struct vop_vector *vop, struct vop_generi
 	rc = bp(a);
 	sigallowstop(prev_stops);
 	return (rc);
+}
+
+static int
+vop_stdstat(struct vop_stat_args *a)
+{
+	struct vattr vattr;
+	struct vattr *vap;
+	struct vnode *vp;
+	struct stat *sb;
+	int error;
+	u_short mode;
+
+	vp = a->a_vp;
+	sb = a->a_sb;
+
+	error = vop_stat_helper_pre(a);
+	if (error != 0)
+		return (error);
+
+	vap = &vattr;
+
+	/*
+	 * Initialize defaults for new and unusual fields, so that file
+	 * systems which don't support these fields don't need to know
+	 * about them.
+	 */
+	vap->va_birthtime.tv_sec = -1;
+	vap->va_birthtime.tv_nsec = 0;
+	vap->va_fsid = VNOVAL;
+	vap->va_rdev = NODEV;
+
+	error = VOP_GETATTR(vp, vap, a->a_active_cred);
+	if (error)
+		goto out;
+
+	/*
+	 * Zero the spare stat fields
+	 */
+	bzero(sb, sizeof *sb);
+
+	/*
+	 * Copy from vattr table
+	 */
+	if (vap->va_fsid != VNOVAL)
+		sb->st_dev = vap->va_fsid;
+	else
+		sb->st_dev = vp->v_mount->mnt_stat.f_fsid.val[0];
+	sb->st_ino = vap->va_fileid;
+	mode = vap->va_mode;
+	switch (vap->va_type) {
+	case VREG:
+		mode |= S_IFREG;
+		break;
+	case VDIR:
+		mode |= S_IFDIR;
+		break;
+	case VBLK:
+		mode |= S_IFBLK;
+		break;
+	case VCHR:
+		mode |= S_IFCHR;
+		break;
+	case VLNK:
+		mode |= S_IFLNK;
+		break;
+	case VSOCK:
+		mode |= S_IFSOCK;
+		break;
+	case VFIFO:
+		mode |= S_IFIFO;
+		break;
+	default:
+		error = EBADF;
+		goto out;
+	}
+	sb->st_mode = mode;
+	sb->st_nlink = vap->va_nlink;
+	sb->st_uid = vap->va_uid;
+	sb->st_gid = vap->va_gid;
+	sb->st_rdev = vap->va_rdev;
+	if (vap->va_size > OFF_MAX) {
+		error = EOVERFLOW;
+		goto out;
+	}
+	sb->st_size = vap->va_size;
+	sb->st_atim.tv_sec = vap->va_atime.tv_sec;
+	sb->st_atim.tv_nsec = vap->va_atime.tv_nsec;
+	sb->st_mtim.tv_sec = vap->va_mtime.tv_sec;
+	sb->st_mtim.tv_nsec = vap->va_mtime.tv_nsec;
+	sb->st_ctim.tv_sec = vap->va_ctime.tv_sec;
+	sb->st_ctim.tv_nsec = vap->va_ctime.tv_nsec;
+	sb->st_birthtim.tv_sec = vap->va_birthtime.tv_sec;
+	sb->st_birthtim.tv_nsec = vap->va_birthtime.tv_nsec;
+
+	/*
+	 * According to www.opengroup.org, the meaning of st_blksize is
+	 *   "a filesystem-specific preferred I/O block size for this
+	 *    object.  In some filesystem types, this may vary from file
+	 *    to file"
+	 * Use minimum/default of PAGE_SIZE (e.g. for VCHR).
+	 */
+
+	sb->st_blksize = max(PAGE_SIZE, vap->va_blocksize);
+	sb->st_flags = vap->va_flags;
+	sb->st_blocks = vap->va_bytes / S_BLKSIZE;
+	sb->st_gen = vap->va_gen;
+out:
+	return (vop_stat_helper_post(a, error));
 }

Modified: projects/clang1100-import/sys/kern/vfs_subr.c
==============================================================================
--- projects/clang1100-import/sys/kern/vfs_subr.c	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/kern/vfs_subr.c	Sat Aug  8 11:08:03 2020	(r364051)
@@ -3683,19 +3683,24 @@ vdropl(struct vnode *vp)
 	}
 	if (!VN_IS_DOOMED(vp)) {
 		vdrop_deactivate(vp);
+		/*
+		 * Also unlocks the interlock. We can't assert on it as we
+		 * released our hold and by now the vnode might have been
+		 * freed.
+		 */
 		return;
 	}
 	/*
-	 * We may be racing against vhold_smr.
+	 * Set the VHOLD_NO_SMR flag.
 	 *
-	 * If they win we can just pretend we never got this far, they will
-	 * vdrop later.
+	 * We may be racing against vhold_smr. If they win we can just pretend
+	 * we never got this far, they will vdrop later.
 	 */
 	if (!atomic_cmpset_int(&vp->v_holdcnt, 0, VHOLD_NO_SMR)) {
+		VI_UNLOCK(vp);
 		/*
-		 * We lost the aforementioned race. Note that any subsequent
-		 * access is invalid as they might have managed to vdropl on
-		 * their own.
+		 * We lost the aforementioned race. Any subsequent access is
+		 * invalid as they might have managed to vdropl on their own.
 		 */
 		return;
 	}

Modified: projects/clang1100-import/sys/kern/vfs_syscalls.c
==============================================================================
--- projects/clang1100-import/sys/kern/vfs_syscalls.c	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/kern/vfs_syscalls.c	Sat Aug  8 11:08:03 2020	(r364051)
@@ -1867,7 +1867,7 @@ restart:
 	if (vp->v_type == VDIR && oldinum == 0) {
 		error = EPERM;		/* POSIX */
 	} else if (oldinum != 0 &&
-		  ((error = vn_stat(vp, &sb, td->td_ucred, NOCRED, td)) == 0) &&
+		  ((error = VOP_STAT(vp, &sb, td->td_ucred, NOCRED, td)) == 0) &&
 		  sb.st_ino != oldinum) {
 		error = EIDRM;	/* Identifier removed */
 	} else if (fp != NULL && fp->f_vnode != vp) {
@@ -2381,7 +2381,7 @@ kern_statat(struct thread *td, int flag, int fd, const
 
 	if ((error = namei(&nd)) != 0)
 		return (error);
-	error = vn_stat(nd.ni_vp, sbp, td->td_ucred, NOCRED, td);
+	error = VOP_STAT(nd.ni_vp, sbp, td->td_ucred, NOCRED, td);
 	if (error == 0) {
 		SDT_PROBE2(vfs, , stat, mode, path, sbp->st_mode);
 		if (S_ISREG(sbp->st_mode))
@@ -4566,7 +4566,7 @@ kern_fhstat(struct thread *td, struct fhandle fh, stru
 	vfs_unbusy(mp);
 	if (error != 0)
 		return (error);
-	error = vn_stat(vp, sb, td->td_ucred, NOCRED, td);
+	error = VOP_STAT(vp, sb, td->td_ucred, NOCRED, td);
 	vput(vp);
 	return (error);
 }

Modified: projects/clang1100-import/sys/kern/vfs_vnops.c
==============================================================================
--- projects/clang1100-import/sys/kern/vfs_vnops.c	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/kern/vfs_vnops.c	Sat Aug  8 11:08:03 2020	(r364051)
@@ -1455,121 +1455,10 @@ vn_statfile(struct file *fp, struct stat *sb, struct u
 	int error;
 
 	vn_lock(vp, LK_SHARED | LK_RETRY);
-	error = vn_stat(vp, sb, active_cred, fp->f_cred, td);
+	error = VOP_STAT(vp, sb, active_cred, fp->f_cred, td);
 	VOP_UNLOCK(vp);
 
 	return (error);
-}
-
-/*
- * Stat a vnode; implementation for the stat syscall
- */
-int
-vn_stat(struct vnode *vp, struct stat *sb, struct ucred *active_cred,
-    struct ucred *file_cred, struct thread *td)
-{
-	struct vattr vattr;
-	struct vattr *vap;
-	int error;
-	u_short mode;
-
-	AUDIT_ARG_VNODE1(vp);
-#ifdef MAC
-	error = mac_vnode_check_stat(active_cred, file_cred, vp);
-	if (error)
-		return (error);
-#endif
-
-	vap = &vattr;
-
-	/*
-	 * Initialize defaults for new and unusual fields, so that file
-	 * systems which don't support these fields don't need to know
-	 * about them.
-	 */
-	vap->va_birthtime.tv_sec = -1;
-	vap->va_birthtime.tv_nsec = 0;
-	vap->va_fsid = VNOVAL;
-	vap->va_rdev = NODEV;
-
-	error = VOP_GETATTR(vp, vap, active_cred);
-	if (error)
-		return (error);
-
-	/*
-	 * Zero the spare stat fields
-	 */
-	bzero(sb, sizeof *sb);
-
-	/*
-	 * Copy from vattr table
-	 */
-	if (vap->va_fsid != VNOVAL)
-		sb->st_dev = vap->va_fsid;
-	else
-		sb->st_dev = vp->v_mount->mnt_stat.f_fsid.val[0];
-	sb->st_ino = vap->va_fileid;
-	mode = vap->va_mode;
-	switch (vap->va_type) {
-	case VREG:
-		mode |= S_IFREG;
-		break;
-	case VDIR:
-		mode |= S_IFDIR;
-		break;
-	case VBLK:
-		mode |= S_IFBLK;
-		break;
-	case VCHR:
-		mode |= S_IFCHR;
-		break;
-	case VLNK:
-		mode |= S_IFLNK;
-		break;
-	case VSOCK:
-		mode |= S_IFSOCK;
-		break;
-	case VFIFO:
-		mode |= S_IFIFO;
-		break;
-	default:
-		return (EBADF);
-	}
-	sb->st_mode = mode;
-	sb->st_nlink = vap->va_nlink;
-	sb->st_uid = vap->va_uid;
-	sb->st_gid = vap->va_gid;
-	sb->st_rdev = vap->va_rdev;
-	if (vap->va_size > OFF_MAX)
-		return (EOVERFLOW);
-	sb->st_size = vap->va_size;
-	sb->st_atim.tv_sec = vap->va_atime.tv_sec;
-	sb->st_atim.tv_nsec = vap->va_atime.tv_nsec;
-	sb->st_mtim.tv_sec = vap->va_mtime.tv_sec;
-	sb->st_mtim.tv_nsec = vap->va_mtime.tv_nsec;
-	sb->st_ctim.tv_sec = vap->va_ctime.tv_sec;
-	sb->st_ctim.tv_nsec = vap->va_ctime.tv_nsec;
-	sb->st_birthtim.tv_sec = vap->va_birthtime.tv_sec;
-	sb->st_birthtim.tv_nsec = vap->va_birthtime.tv_nsec;
-
-	/*
-	 * According to www.opengroup.org, the meaning of st_blksize is 
-	 *   "a filesystem-specific preferred I/O block size for this 
-	 *    object.  In some filesystem types, this may vary from file
-	 *    to file"
-	 * Use minimum/default of PAGE_SIZE (e.g. for VCHR).
-	 */
-
-	sb->st_blksize = max(PAGE_SIZE, vap->va_blocksize);
-
-	sb->st_flags = vap->va_flags;
-	if (priv_check_cred_vfs_generation(td->td_ucred))
-		sb->st_gen = 0;
-	else
-		sb->st_gen = vap->va_gen;
-
-	sb->st_blocks = vap->va_bytes / S_BLKSIZE;
-	return (0);
 }
 
 /*

Modified: projects/clang1100-import/sys/kern/vnode_if.src
==============================================================================
--- projects/clang1100-import/sys/kern/vnode_if.src	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/kern/vnode_if.src	Sat Aug  8 11:08:03 2020	(r364051)
@@ -177,6 +177,17 @@ vop_accessx {
 };
 
 
+%% stat	vp	L L L
+
+vop_stat {
+	IN struct vnode *vp;
+	OUT struct stat *sb;
+	IN struct ucred *active_cred;
+	IN struct ucred *file_cred;
+	IN struct thread *td;
+};
+
+
 %% getattr	vp	L L L
 
 vop_getattr {

Modified: projects/clang1100-import/sys/security/audit/audit_arg.c
==============================================================================
--- projects/clang1100-import/sys/security/audit/audit_arg.c	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/security/audit/audit_arg.c	Sat Aug  8 11:08:03 2020	(r364051)
@@ -854,7 +854,7 @@ audit_arg_upath2_canon(char *upath)
  * It is assumed that the caller will hold any vnode locks necessary to
  * perform a VOP_GETATTR() on the passed vnode.
  *
- * XXX: The attr code is very similar to vfs_vnops.c:vn_stat(), but always
+ * XXX: The attr code is very similar to vfs_default.c:vop_stdstat(), but always
  * provides access to the generation number as we need that to construct the
  * BSM file ID.
  *

Modified: projects/clang1100-import/sys/sys/vnode.h
==============================================================================
--- projects/clang1100-import/sys/sys/vnode.h	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/sys/vnode.h	Sat Aug  8 11:08:03 2020	(r364051)
@@ -737,8 +737,6 @@ int	vn_rdwr_inchunks(enum uio_rw rw, struct vnode *vp,
 	    struct thread *td);
 int	vn_rlimit_fsize(const struct vnode *vn, const struct uio *uio,
 	    struct thread *td);
-int	vn_stat(struct vnode *vp, struct stat *sb, struct ucred *active_cred,
-	    struct ucred *file_cred, struct thread *td);
 int	vn_start_write(struct vnode *vp, struct mount **mpp, int flags);
 int	vn_start_secondary_write(struct vnode *vp, struct mount **mpp,
 	    int flags);
@@ -892,6 +890,22 @@ void	vop_need_inactive_debugpost(void *a, int rc);
 #endif
 
 void	vop_rename_fail(struct vop_rename_args *ap);
+
+#define	vop_stat_helper_pre(ap)	({						\
+	int _error;								\
+	AUDIT_ARG_VNODE1(ap->a_vp);						\
+	_error = mac_vnode_check_stat(ap->a_active_cred, ap->a_file_cred, ap->a_vp);\
+	if (__predict_true(_error == 0))					\
+		bzero(ap->a_sb, sizeof(*ap->a_sb));				\
+	_error;									\
+})
+
+#define	vop_stat_helper_post(ap, error)	({					\
+	int _error = (error);							\
+	if (priv_check_cred_vfs_generation(ap->a_td->td_ucred))			\
+		ap->a_sb->st_gen = 0;						\
+	_error;									\
+})
 
 #define	VOP_WRITE_PRE(ap)						\
 	struct vattr va;						\

Modified: projects/clang1100-import/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- projects/clang1100-import/sys/ufs/ufs/ufs_vnops.c	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/sys/ufs/ufs/ufs_vnops.c	Sat Aug  8 11:08:03 2020	(r364051)
@@ -65,6 +65,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/acl.h>
 #include <sys/smr.h>
 
+#include <security/audit/audit.h>
 #include <security/mac/mac_framework.h>
 
 #include <sys/file.h>		/* XXX */
@@ -107,6 +108,7 @@ static int ufs_chmod(struct vnode *, int, struct ucred
 static int ufs_chown(struct vnode *, uid_t, gid_t, struct ucred *, struct thread *);
 static vop_close_t	ufs_close;
 static vop_create_t	ufs_create;
+static vop_stat_t	ufs_stat;
 static vop_getattr_t	ufs_getattr;
 static vop_ioctl_t	ufs_ioctl;
 static vop_link_t	ufs_link;
@@ -467,6 +469,65 @@ ufs_fplookup_vexec(ap)
 
 /* ARGSUSED */
 static int
+ufs_stat(struct vop_stat_args *ap)
+{
+	struct vnode *vp = ap->a_vp;
+	struct inode *ip = VTOI(vp);
+	struct stat *sb = ap->a_sb;
+	int error;
+
+	error = vop_stat_helper_pre(ap);
+	if (__predict_false(error))
+		return (error);
+
+	VI_LOCK(vp);
+	ufs_itimes_locked(vp);
+	if (I_IS_UFS1(ip)) {
+		sb->st_atim.tv_sec = ip->i_din1->di_atime;
+		sb->st_atim.tv_nsec = ip->i_din1->di_atimensec;
+	} else {
+		sb->st_atim.tv_sec = ip->i_din2->di_atime;
+		sb->st_atim.tv_nsec = ip->i_din2->di_atimensec;
+	}
+	VI_UNLOCK(vp);
+
+	sb->st_dev = vp->v_mount->mnt_stat.f_fsid.val[0];
+	sb->st_ino = ip->i_number;
+	sb->st_mode = (ip->i_mode & ~IFMT) | VTTOIF(vp->v_type);
+	sb->st_nlink = ip->i_effnlink;
+	sb->st_uid = ip->i_uid;
+	sb->st_gid = ip->i_gid;
+	if (I_IS_UFS1(ip)) {
+		sb->st_rdev = ip->i_din1->di_rdev;
+		sb->st_size = ip->i_din1->di_size;
+		sb->st_mtim.tv_sec = ip->i_din1->di_mtime;
+		sb->st_mtim.tv_nsec = ip->i_din1->di_mtimensec;
+		sb->st_ctim.tv_sec = ip->i_din1->di_ctime;
+		sb->st_ctim.tv_nsec = ip->i_din1->di_ctimensec;
+		sb->st_birthtim.tv_sec = -1;
+		sb->st_birthtim.tv_nsec = 0;
+		sb->st_blocks = dbtob((u_quad_t)ip->i_din1->di_blocks) / S_BLKSIZE;
+	} else {
+		sb->st_rdev = ip->i_din2->di_rdev;
+		sb->st_size = ip->i_din2->di_size;
+		sb->st_mtim.tv_sec = ip->i_din2->di_mtime;
+		sb->st_mtim.tv_nsec = ip->i_din2->di_mtimensec;
+		sb->st_ctim.tv_sec = ip->i_din2->di_ctime;
+		sb->st_ctim.tv_nsec = ip->i_din2->di_ctimensec;
+		sb->st_birthtim.tv_sec = ip->i_din2->di_birthtime;
+		sb->st_birthtim.tv_nsec = ip->i_din2->di_birthnsec;
+		sb->st_blocks = dbtob((u_quad_t)ip->i_din2->di_blocks) / S_BLKSIZE;
+	}
+
+	sb->st_blksize = max(PAGE_SIZE, vp->v_mount->mnt_stat.f_iosize);
+	sb->st_flags = ip->i_flags;
+	sb->st_gen = ip->i_gen;
+
+	return (vop_stat_helper_post(ap, error));
+}
+
+/* ARGSUSED */
+static int
 ufs_getattr(ap)
 	struct vop_getattr_args /* {
 		struct vnode *a_vp;
@@ -2822,6 +2883,7 @@ struct vop_vector ufs_vnodeops = {
 	.vop_cachedlookup =	ufs_lookup,
 	.vop_close =		ufs_close,
 	.vop_create =		ufs_create,
+	.vop_stat =		ufs_stat,
 	.vop_getattr =		ufs_getattr,
 	.vop_inactive =		ufs_inactive,
 	.vop_ioctl =		ufs_ioctl,

Modified: projects/clang1100-import/tests/sys/net/routing/rtsock_common.h
==============================================================================
--- projects/clang1100-import/tests/sys/net/routing/rtsock_common.h	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/tests/sys/net/routing/rtsock_common.h	Sat Aug  8 11:08:03 2020	(r364051)
@@ -204,7 +204,7 @@ iface_open(char *ifname)
  * Sets primary IPv4 addr.
  * Returns 0 on success.
  */
-inline int
+static inline int
 iface_setup_addr(char *ifname, char *addr, int plen)
 {
 	char cmd[512];
@@ -225,7 +225,7 @@ iface_setup_addr(char *ifname, char *addr, int plen)
  * Removes primary IPv4 prefix.
  * Returns 0 on success.
  */
-inline int
+static inline int
 iface_delete_addr(char *ifname, char *addr)
 {
 	char cmd[512];

Modified: projects/clang1100-import/usr.bin/chpass/Makefile
==============================================================================
--- projects/clang1100-import/usr.bin/chpass/Makefile	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/usr.bin/chpass/Makefile	Sat Aug  8 11:08:03 2020	(r364051)
@@ -3,7 +3,7 @@
 
 .include <src.opts.mk>
 
-.PATH: ${SRCTOP}/usr.sbin/pwd_mkdb ${SRCTOP}/lib/libc/gen
+.PATH: ${SRCTOP}/lib/libc/gen
 
 PROG=	chpass
 SRCS=	chpass.c edit.c field.c pw_scan.c table.c util.c
@@ -15,7 +15,7 @@ CFLAGS+= -DYP
 .endif
 #Some people need this, uncomment to activate
 #CFLAGS+=-DRESTRICT_FULLNAME_CHANGE
-CFLAGS+=-I${SRCTOP}/usr.sbin/pwd_mkdb -I${SRCTOP}/lib/libc/gen -I.
+CFLAGS+=-I${SRCTOP}/lib/libc/gen -I.
 
 LIBADD=	crypt util
 .if ${MK_NIS} != "no"

Modified: projects/clang1100-import/usr.sbin/pwd_mkdb/Makefile
==============================================================================
--- projects/clang1100-import/usr.sbin/pwd_mkdb/Makefile	Sat Aug  8 11:06:27 2020	(r364050)
+++ projects/clang1100-import/usr.sbin/pwd_mkdb/Makefile	Sat Aug  8 11:08:03 2020	(r364051)
@@ -10,7 +10,7 @@ SRCS=	pw_scan.c pwd_mkdb.c
 
 CFLAGS+= -I${SRCTOP}/lib/libc/gen		# for pw_scan.h
 .if defined(BOOTSTRAPPING)
-CFLAGS+=-I${.CURDIR}
+CFLAGS+=-I${.CURDIR}/bootstrap
 .endif
 
 .include <bsd.prog.mk>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202008081108.078B83U5042037>