git: ec3c225711ae - main - vfs: call vn_truncate_locked from kern_truncate

From: Mateusz Guzik <mjg_at_FreeBSD.org>
Date: Fri, 20 May 2022 17:25:59 UTC
The branch main has been updated by mjg:

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

commit ec3c225711ae7d5b8e71ed036aada09ef91149ec
Author:     Mateusz Guzik <mjg@FreeBSD.org>
AuthorDate: 2022-05-16 01:28:22 +0000
Commit:     Mateusz Guzik <mjg@FreeBSD.org>
CommitDate: 2022-05-20 17:25:51 +0000

    vfs: call vn_truncate_locked from kern_truncate
    
    This fixes a bug where the syscall would not bump writecount.
    
    PR:     263999
---
 sys/kern/vfs_syscalls.c | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 86ef3fc7a095..600299fbe6eb 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -3460,7 +3460,6 @@ kern_truncate(struct thread *td, const char *path, enum uio_seg pathseg,
 	struct mount *mp;
 	struct vnode *vp;
 	void *rl_cookie;
-	struct vattr vattr;
 	struct nameidata nd;
 	int error;
 
@@ -3480,18 +3479,21 @@ retry:
 		return (error);
 	}
 	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
-	if (vp->v_type == VDIR)
+	if (vp->v_type == VDIR) {
 		error = EISDIR;
-#ifdef MAC
-	else if ((error = mac_vnode_check_write(td->td_ucred, NOCRED, vp))) {
+		goto out;
 	}
+#ifdef MAC
+	error = mac_vnode_check_write(td->td_ucred, NOCRED, vp);
+	if (error != 0)
+		goto out;
 #endif
-	else if ((error = vn_writechk(vp)) == 0 &&
-	    (error = VOP_ACCESS(vp, VWRITE, td->td_ucred, td)) == 0) {
-		VATTR_NULL(&vattr);
-		vattr.va_size = length;
-		error = VOP_SETATTR(vp, &vattr, td->td_ucred);
-	}
+	error = VOP_ACCESS(vp, VWRITE, td->td_ucred, td);
+	if (error != 0)
+		goto out;
+
+	error = vn_truncate_locked(vp, 0, false, td->td_ucred);
+out:
 	VOP_UNLOCK(vp);
 	vn_finished_write(mp);
 	vn_rangelock_unlock(vp, rl_cookie);