From owner-svn-src-projects@freebsd.org Sat Aug 8 11:08:07 2020 Return-Path: Delivered-To: svn-src-projects@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 683E43A8F43 for ; Sat, 8 Aug 2020 11:08:07 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4BNzwl2Pf7z3ZxS; Sat, 8 Aug 2020 11:08:07 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 362A0277FD; Sat, 8 Aug 2020 11:08:07 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 078B87Fj042054; Sat, 8 Aug 2020 11:08:07 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 078B83U5042037; Sat, 8 Aug 2020 11:08:03 GMT (envelope-from dim@FreeBSD.org) Message-Id: <202008081108.078B83U5042037@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Sat, 8 Aug 2020 11:08:03 +0000 (UTC) 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.... X-SVN-Group: projects X-SVN-Commit-Author: dim X-SVN-Commit-Paths: 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.bin/chpass usr.sbin/pwd_m... X-SVN-Commit-Revision: 364051 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 08 Aug 2020 11:08:07 -0000 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 #include #include +#include +#include #include #include @@ -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 #include #include +#include +#include +#include #include @@ -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 #include +#include #include #include /* 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 -.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