Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Jul 2019 20:41:44 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r349582 - in head/sys: kern sys
Message-ID:  <201907012041.x61KfiMD095201@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Mon Jul  1 20:41:43 2019
New Revision: 349582
URL: https://svnweb.freebsd.org/changeset/base/349582

Log:
  Factor out the code that does a VOP_SETATTR(size) from vn_truncate().
  
  This patch factors the code in vn_truncate() that does the actual
  VOP_SETATTR() of size into a separate function called vn_truncate_locked().
  This will allow the NFS server and the patch that adds a
  copy_file_range(2) syscall to call this function instead of duplicating
  the code and carrying over changes, such as the recent r347151.
  
  Reviewed by:	kib
  Differential Revision:	https://reviews.freebsd.org/D20808

Modified:
  head/sys/kern/vfs_vnops.c
  head/sys/sys/vnode.h

Modified: head/sys/kern/vfs_vnops.c
==============================================================================
--- head/sys/kern/vfs_vnops.c	Mon Jul  1 20:37:35 2019	(r349581)
+++ head/sys/kern/vfs_vnops.c	Mon Jul  1 20:41:43 2019	(r349582)
@@ -1289,7 +1289,6 @@ static int
 vn_truncate(struct file *fp, off_t length, struct ucred *active_cred,
     struct thread *td)
 {
-	struct vattr vattr;
 	struct mount *mp;
 	struct vnode *vp;
 	void *rl_cookie;
@@ -1316,20 +1315,35 @@ vn_truncate(struct file *fp, off_t length, struct ucre
 	if (error)
 		goto out;
 #endif
+	error = vn_truncate_locked(vp, length, (fp->f_flag & O_FSYNC) != 0,
+	    fp->f_cred);
+out:
+	VOP_UNLOCK(vp, 0);
+	vn_finished_write(mp);
+out1:
+	vn_rangelock_unlock(vp, rl_cookie);
+	return (error);
+}
+
+/*
+ * Truncate a file that is already locked.
+ */
+int
+vn_truncate_locked(struct vnode *vp, off_t length, bool sync,
+    struct ucred *cred)
+{
+	struct vattr vattr;
+	int error;
+
 	error = VOP_ADD_WRITECOUNT(vp, 1);
 	if (error == 0) {
 		VATTR_NULL(&vattr);
 		vattr.va_size = length;
-		if ((fp->f_flag & O_FSYNC) != 0)
+		if (sync)
 			vattr.va_vaflags |= VA_SYNC;
-		error = VOP_SETATTR(vp, &vattr, fp->f_cred);
+		error = VOP_SETATTR(vp, &vattr, cred);
 		VOP_ADD_WRITECOUNT_CHECKED(vp, -1);
 	}
-out:
-	VOP_UNLOCK(vp, 0);
-	vn_finished_write(mp);
-out1:
-	vn_rangelock_unlock(vp, rl_cookie);
 	return (error);
 }
 

Modified: head/sys/sys/vnode.h
==============================================================================
--- head/sys/sys/vnode.h	Mon Jul  1 20:37:35 2019	(r349581)
+++ head/sys/sys/vnode.h	Mon Jul  1 20:41:43 2019	(r349582)
@@ -695,6 +695,8 @@ int	vn_stat(struct vnode *vp, struct stat *sb, struct 
 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);
+int	vn_truncate_locked(struct vnode *vp, off_t length, bool sync,
+	    struct ucred *cred);
 int	vn_writechk(struct vnode *vp);
 int	vn_extattr_get(struct vnode *vp, int ioflg, int attrnamespace,
 	    const char *attrname, int *buflen, char *buf, struct thread *td);



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