aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2022-05-16 01:28:22 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2022-05-20 17:25:51 +0000
commitec3c225711ae7d5b8e71ed036aada09ef91149ec (patch)
tree119bede9cd46f8a8c19e1a7fe83034990ff57e82
parent6b715687bd441f2815ec93dad7efd156fb3b591d (diff)
downloadsrc-ec3c225711ae7d5b8e71ed036aada09ef91149ec.tar.gz
src-ec3c225711ae7d5b8e71ed036aada09ef91149ec.zip
vfs: call vn_truncate_locked from kern_truncate
This fixes a bug where the syscall would not bump writecount. PR: 263999
-rw-r--r--sys/kern/vfs_syscalls.c22
1 files 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);