svn commit: r187526 - in head/sys: kern nfsclient ufs/ufs

John Baldwin jhb at FreeBSD.org
Wed Jan 21 06:42:02 PST 2009


Author: jhb
Date: Wed Jan 21 14:42:00 2009
New Revision: 187526
URL: http://svn.freebsd.org/changeset/base/187526

Log:
  Move the VA_MARKATIME flag for VOP_SETATTR() out into its own VOP:
  VOP_MARKATIME() since unlike the rest of VOP_SETATTR(), VA_MARKATIME
  can be performed while holding a shared vnode lock (the same functionality
  is done internally by VOP_READ which can run with a shared vnode lock).
  Add missing locking of the vnode interlock to the ufs implementation and
  remove a special note and test from the NFS client about not supporting the
  feature.
  
  Inspired by:	ups
  Tested by:	pho

Modified:
  head/sys/kern/vfs_subr.c
  head/sys/kern/vnode_if.src
  head/sys/nfsclient/nfs_vnops.c
  head/sys/ufs/ufs/ufs_vnops.c

Modified: head/sys/kern/vfs_subr.c
==============================================================================
--- head/sys/kern/vfs_subr.c	Wed Jan 21 14:22:06 2009	(r187525)
+++ head/sys/kern/vfs_subr.c	Wed Jan 21 14:42:00 2009	(r187526)
@@ -4206,18 +4206,15 @@ vfs_read_dirent(struct vop_readdir_args 
 
 /*
  * Mark for update the access time of the file if the filesystem
- * supports VA_MARK_ATIME.  This functionality is used by execve
+ * supports VOP_MARKATIME.  This functionality is used by execve
  * and mmap, so we want to avoid the synchronous I/O implied by
  * directly setting va_atime for the sake of efficiency.
  */
 void
 vfs_mark_atime(struct vnode *vp, struct ucred *cred)
 {
-	struct vattr atimeattr;
 
 	if ((vp->v_mount->mnt_flag & (MNT_NOATIME | MNT_RDONLY)) == 0) {
-		VATTR_NULL(&atimeattr);
-		atimeattr.va_vaflags |= VA_MARK_ATIME;
-		(void)VOP_SETATTR(vp, &atimeattr, cred);
+		(void)VOP_MARKATIME(vp);
 	}
 }

Modified: head/sys/kern/vnode_if.src
==============================================================================
--- head/sys/kern/vnode_if.src	Wed Jan 21 14:22:06 2009	(r187525)
+++ head/sys/kern/vnode_if.src	Wed Jan 21 14:42:00 2009	(r187526)
@@ -171,6 +171,11 @@ vop_setattr {
 	IN struct ucred *cred;
 };
 
+%% markatime	vp	L L L
+
+vop_markatime {
+	IN struct vnode *vp;
+};
 
 %% read		vp	L L L
 

Modified: head/sys/nfsclient/nfs_vnops.c
==============================================================================
--- head/sys/nfsclient/nfs_vnops.c	Wed Jan 21 14:22:06 2009	(r187525)
+++ head/sys/nfsclient/nfs_vnops.c	Wed Jan 21 14:42:00 2009	(r187526)
@@ -707,9 +707,9 @@ nfs_setattr(struct vop_setattr_args *ap)
 #endif
 
 	/*
-	 * Setting of flags and marking of atimes are not supported.
+	 * Setting of flags is not supported.
 	 */
-	if (vap->va_flags != VNOVAL || (vap->va_vaflags & VA_MARK_ATIME))
+	if (vap->va_flags != VNOVAL)
 		return (EOPNOTSUPP);
 
 	/*

Modified: head/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- head/sys/ufs/ufs/ufs_vnops.c	Wed Jan 21 14:22:06 2009	(r187525)
+++ head/sys/ufs/ufs/ufs_vnops.c	Wed Jan 21 14:42:00 2009	(r187526)
@@ -98,6 +98,7 @@ static vop_create_t	ufs_create;
 static vop_getattr_t	ufs_getattr;
 static vop_link_t	ufs_link;
 static int ufs_makeinode(int mode, struct vnode *, struct vnode **, struct componentname *);
+static vop_markatime_t	ufs_markatime;
 static vop_mkdir_t	ufs_mkdir;
 static vop_mknod_t	ufs_mknod;
 static vop_open_t	ufs_open;
@@ -491,17 +492,6 @@ ufs_setattr(ap)
 	    ((int)vap->va_bytes != VNOVAL) || (vap->va_gen != VNOVAL)) {
 		return (EINVAL);
 	}
-	/*
-	 * Mark for update the file's access time for vfs_mark_atime().
-	 * We are doing this here to avoid some of the checks done
-	 * below -- this operation is done by request of the kernel and
-	 * should bypass some security checks.  Things like read-only
-	 * checks get handled by other levels (e.g., ffs_update()).
-	 */
-	if (vap->va_vaflags & VA_MARK_ATIME) {
-		ip->i_flag |= IN_ACCESS;
-		return (0);
-	}
 	if (vap->va_flags != VNOVAL) {
 		if (vp->v_mount->mnt_flag & MNT_RDONLY)
 			return (EROFS);
@@ -663,6 +653,25 @@ ufs_setattr(ap)
 }
 
 /*
+ * Mark this file's access time for update for vfs_mark_atime().  This
+ * is called from execve() and mmap().
+ */
+static int
+ufs_markatime(ap)
+	struct vop_markatime_args /* {
+		struct vnode *a_vp;
+	} */ *ap;
+{
+	struct vnode *vp = ap->a_vp;
+	struct inode *ip = VTOI(vp);
+
+	VI_LOCK(vp);
+	ip->i_flag |= IN_ACCESS;
+	VI_UNLOCK(vp);
+	return (0);
+}
+
+/*
  * Change the mode on a file.
  * Inode must be locked before calling.
  */
@@ -2481,6 +2490,7 @@ struct vop_vector ufs_vnodeops = {
 	.vop_rename =		ufs_rename,
 	.vop_rmdir =		ufs_rmdir,
 	.vop_setattr =		ufs_setattr,
+	.vop_markatime =	ufs_markatime,
 #ifdef MAC
 	.vop_setlabel =		vop_stdsetlabel_ea,
 #endif
@@ -2511,6 +2521,7 @@ struct vop_vector ufs_fifoops = {
 	.vop_read =		VOP_PANIC,
 	.vop_reclaim =		ufs_reclaim,
 	.vop_setattr =		ufs_setattr,
+	.vop_markatime =	ufs_markatime,
 #ifdef MAC
 	.vop_setlabel =		vop_stdsetlabel_ea,
 #endif


More information about the svn-src-head mailing list