From 15322d7068e8fa453c9195c48816d6a6c4e9c1d5 Mon Sep 17 00:00:00 2001 From: anton Date: Thu, 6 May 2021 12:55:20 +0000 Subject: [PATCH] Unlock lseek(2). In August 2019 I tried to unlock lseek which failed since the vnode lock could not be acquired without holding the kernel lock back then. claudio@ recently made it possible to acquire a vnode lock without holding the kernel lock. The kernel lock is still required around VOP_GETATTR() as the underlying file system implementations are not MP-safe. ok claudio@ --- sys/kern/syscalls.master | 4 ++-- sys/kern/vfs_vnops.c | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index e3773768f34..4246004f64e 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -1,4 +1,4 @@ -; $OpenBSD: syscalls.master,v 1.210 2021/05/04 18:10:24 cheloha Exp $ +; $OpenBSD: syscalls.master,v 1.211 2021/05/06 12:55:20 anton Exp $ ; $NetBSD: syscalls.master,v 1.32 1996/04/23 10:24:21 mycroft Exp $ ; @(#)syscalls.master 8.2 (Berkeley) 1/13/94 @@ -349,7 +349,7 @@ 197 STD { void *sys_mmap(void *addr, size_t len, int prot, \ int flags, int fd, long pad, off_t pos); } 198 INDIR { quad_t sys___syscall(quad_t num, ...); } -199 STD { off_t sys_lseek(int fd, int pad, off_t offset, \ +199 STD NOLOCK { off_t sys_lseek(int fd, int pad, off_t offset, \ int whence); } 200 STD { int sys_truncate(const char *path, int pad, \ off_t length); } diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 945b40935e2..f726d72f8cb 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_vnops.c,v 1.115 2021/04/28 09:53:53 claudio Exp $ */ +/* $OpenBSD: vfs_vnops.c,v 1.116 2021/05/06 12:55:20 anton Exp $ */ /* $NetBSD: vfs_vnops.c,v 1.20 1996/02/04 02:18:41 christos Exp $ */ /* @@ -657,7 +657,9 @@ vn_seek(struct file *fp, off_t *offset, int whence, struct proc *p) newoff = fp->f_offset + *offset; break; case SEEK_END: + KERNEL_LOCK(); error = VOP_GETATTR(vp, &vattr, cred, p); + KERNEL_UNLOCK(); if (error) goto out; newoff = *offset + (off_t)vattr.va_size; -- 2.20.1