git: d3d1095b0db1 - stable/15 - vfs: rename vop_mmapped() to vop_update_atime()

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Sun, 28 Jun 2026 23:59:13 UTC
The branch stable/15 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=d3d1095b0db12fd17805b081aa1f93868dd4a67a

commit d3d1095b0db12fd17805b081aa1f93868dd4a67a
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-06-19 19:52:45 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-06-28 21:43:28 +0000

    vfs: rename vop_mmapped() to vop_update_atime()
    
    (cherry picked from commit 8177936ac293210251390e44d109ece0f3868df9)
---
 sys/kern/kern_exec.c      |  2 +-
 sys/kern/vnode_if.src     |  3 ++-
 sys/ufs/ffs/ffs_inode.c   |  2 +-
 sys/ufs/ffs/ffs_softdep.c |  2 +-
 sys/ufs/ufs/ufs_extern.h  |  2 +-
 sys/ufs/ufs/ufs_vnops.c   | 42 ++++++++++++++++++++++++++++--------------
 sys/vm/vm_mmap.c          |  2 +-
 7 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index b60d0c1e8b88..89141c979d07 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -1035,7 +1035,7 @@ interpret:
 	/* Set values passed into the program in registers. */
 	(*p->p_sysent->sv_setregs)(td, imgp, stack_base);
 
-	VOP_MMAPPED(imgp->vp);
+	VOP_UPDATE_ATIME(imgp->vp, NULL);
 
 	SDT_PROBE1(proc, , , exec__success, args->fname);
 
diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src
index 78ba1aa7afda..d20ff39b314e 100644
--- a/sys/kern/vnode_if.src
+++ b/sys/kern/vnode_if.src
@@ -214,8 +214,9 @@ vop_setattr {
 
 %% mmapped	vp	L L L
 
-vop_mmapped {
+vop_update_atime {
 	IN struct vnode *vp;
+	IN struct timespec *ts;
 };
 
 
diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c
index f47cfd08f75a..3b2e7846b085 100644
--- a/sys/ufs/ffs/ffs_inode.c
+++ b/sys/ufs/ffs/ffs_inode.c
@@ -100,7 +100,7 @@ ffs_update(struct vnode *vp, int waitfor)
 	int flags, error;
 
 	ASSERT_VOP_ELOCKED(vp, "ffs_update");
-	ufs_itimes(vp);
+	ufs_itimes(vp, NULL);
 	ip = VTOI(vp);
 	if ((ip->i_flag & IN_MODIFIED) == 0 && waitfor == 0)
 		return (0);
diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index b5212ce5875f..dd879b97e58c 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -6896,7 +6896,7 @@ softdep_journal_freeblocks(
 	 * from reaching the disk while we are eliminating those that
 	 * have been truncated.  This is a partially inlined ffs_update().
 	 */
-	ufs_itimes(vp);
+	ufs_itimes(vp, NULL);
 	ip->i_flag &= ~(IN_LAZYACCESS | IN_LAZYMOD | IN_MODIFIED);
 	dbn = fsbtodb(fs, ino_to_fsba(fs, ip->i_number));
 	error = ffs_breadz(ump, ump->um_devvp, dbn, dbn, (int)fs->fs_bsize,
diff --git a/sys/ufs/ufs/ufs_extern.h b/sys/ufs/ufs/ufs_extern.h
index 111fb1cb40b3..7b9215654e03 100644
--- a/sys/ufs/ufs/ufs_extern.h
+++ b/sys/ufs/ufs/ufs_extern.h
@@ -73,7 +73,7 @@ int	 ufs_lookup_ino(struct vnode *, struct vnode **, struct componentname *,
 int	 ufs_getlbns(struct vnode *, ufs2_daddr_t, struct indir *, int *);
 int	 ufs_inactive(struct vop_inactive_args *);
 int	 ufs_init(struct vfsconf *);
-void	 ufs_itimes(struct vnode *vp);
+void	 ufs_itimes(struct vnode *vp, struct timespec *tsa);
 int	 ufs_lookup(struct vop_cachedlookup_args *);
 int	 ufs_need_inactive(struct vop_need_inactive_args *);
 int	 ufs_readdir(struct vop_readdir_args *);
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 4abbd4ee807f..1d04e1b2785f 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -111,7 +111,7 @@ static vop_ioctl_t	ufs_ioctl;
 static vop_link_t	ufs_link;
 static int ufs_makeinode(int mode, struct vnode *, struct vnode **,
     struct componentname *, const char *);
-static vop_mmapped_t	ufs_mmapped;
+static vop_update_atime_t ufs_update_atime;
 static vop_mkdir_t	ufs_mkdir;
 static vop_mknod_t	ufs_mknod;
 static vop_open_t	ufs_open;
@@ -143,7 +143,7 @@ static struct odirtemplate omastertemplate = {
 };
 
 static void
-ufs_itimes_locked(struct vnode *vp)
+ufs_itimes_locked(struct vnode *vp, struct timespec *tsa)
 {
 	struct inode *ip;
 	struct timespec ts;
@@ -166,8 +166,13 @@ ufs_itimes_locked(struct vnode *vp)
 		UFS_INODE_SET_FLAG(ip, IN_LAZYACCESS);
 	vfs_timestamp(&ts);
 	if ((ip->i_flag & IN_ACCESS) != 0) {
-		DIP_SET(ip, i_atime, ts.tv_sec);
-		DIP_SET(ip, i_atimensec, ts.tv_nsec);
+		if (tsa != NULL) {
+			DIP_SET(ip, i_atime, tsa->tv_sec);
+			DIP_SET(ip, i_atimensec, tsa->tv_nsec);
+		} else {
+			DIP_SET(ip, i_atime, ts.tv_sec);
+			DIP_SET(ip, i_atimensec, ts.tv_nsec);
+		}
 	}
 	if ((ip->i_flag & IN_UPDATE) != 0) {
 		DIP_SET(ip, i_mtime, ts.tv_sec);
@@ -184,7 +189,7 @@ out:
 }
 
 void
-ufs_itimes(struct vnode *vp)
+ufs_itimes(struct vnode *vp, struct timespec *tsa)
 {
 	struct inode *ip;
 
@@ -193,7 +198,7 @@ ufs_itimes(struct vnode *vp)
 		return;
 
 	VI_LOCK(vp);
-	ufs_itimes_locked(vp);
+	ufs_itimes_locked(vp, tsa);
 	VI_UNLOCK(vp);
 }
 
@@ -356,7 +361,7 @@ ufs_close(
 {
 	struct vnode *vp = ap->a_vp;
 
-	ufs_itimes(vp);
+	ufs_itimes(vp, NULL);
 	return (0);
 }
 
@@ -523,7 +528,7 @@ ufs_stat(struct vop_stat_args *ap)
 		return (error);
 
 	VI_LOCK(vp);
-	ufs_itimes_locked(vp);
+	ufs_itimes_locked(vp, NULL);
 	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;
@@ -584,7 +589,7 @@ ufs_getattr(
 	struct vattr *vap = ap->a_vap;
 
 	VI_LOCK(vp);
-	ufs_itimes_locked(vp);
+	ufs_itimes_locked(vp, NULL);
 	if (I_IS_UFS1(ip)) {
 		vap->va_atime.tv_sec = ip->i_din1->di_atime;
 		vap->va_atime.tv_nsec = ip->i_din1->di_atimensec;
@@ -829,9 +834,10 @@ out:
 #endif /* UFS_ACL */
 
 static int
-ufs_mmapped(
-	struct vop_mmapped_args /* {
+ufs_update_atime(
+	struct vop_update_atime_args /* {
 		struct vnode *a_vp;
+		struct timespec *a_ts;
 	} */ *ap)
 {
 	struct vnode *vp;
@@ -842,8 +848,16 @@ ufs_mmapped(
 	ip = VTOI(vp);
 	mp = vp->v_mount;
 
-	if ((mp->mnt_flag & (MNT_NOATIME | MNT_RDONLY)) == 0)
-		UFS_INODE_SET_FLAG_SHARED(ip, IN_ACCESS);
+	if ((mp->mnt_flag & (MNT_NOATIME | MNT_RDONLY)) == 0) {
+		VI_LOCK(vp);
+		if ((ip->i_flag & IN_ACCESS) == 0) {
+			ip->i_flag |= IN_ACCESS;
+			vlazy(vp);
+		}
+		if (ap->a_ts != NULL)
+			ufs_itimes_locked(vp, ap->a_ts);
+		VI_UNLOCK(vp);
+	}
 	/*
 	 * XXXKIB No UFS_UPDATE(ap->a_vp, 0) there.
 	 */
@@ -3006,7 +3020,7 @@ struct vop_vector ufs_vnodeops = {
 	.vop_ioctl =		ufs_ioctl,
 	.vop_link =		ufs_link,
 	.vop_lookup =		vfs_cache_lookup,
-	.vop_mmapped =		ufs_mmapped,
+	.vop_update_atime =	ufs_update_atime,
 	.vop_mkdir =		ufs_mkdir,
 	.vop_mknod =		ufs_mknod,
 	.vop_need_inactive =	ufs_need_inactive,
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index 8d71bce67d58..6ddfa02bda9e 100644
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -1391,7 +1391,7 @@ vm_mmap_vnode(struct thread *td, vm_size_t objsize,
 	*objp = obj;
 	*flagsp = flags;
 
-	VOP_MMAPPED(vp);
+	VOP_UPDATE_ATIME(vp, NULL);
 
 done:
 	if (error != 0 && *writecounted) {