diff options
author | anton <anton@cvs.openbsd.org> | 2019-08-12 08:17:06 +0000 |
---|---|---|
committer | anton <anton@cvs.openbsd.org> | 2019-08-12 08:17:06 +0000 |
commit | f14293d82cebc097ae6d0128c1aecca6c1565b98 (patch) | |
tree | 08cd021cc7e75e4bc9019fccb752e0ebb2fccbcd /sys/kern | |
parent | 2e877a3d1f0156128f9576e59b7dd249c5dfa72f (diff) |
Unlock lseek(2) since the file offset is MP-safe by now. Calling
VOP_GETATTR() must still be serialized using the kernel lock since the
underlying file system implementation is not MP-safe.
no objection from deraadt@ and ok mpi@ visa@
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/syscalls.master | 4 | ||||
-rw-r--r-- | 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 c5014a46ec7..85d0ccb807a 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -1,4 +1,4 @@ -; $OpenBSD: syscalls.master,v 1.195 2019/07/09 15:02:15 semarie Exp $ +; $OpenBSD: syscalls.master,v 1.196 2019/08/12 08:17:05 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 28f2e469f37..adcf3935c61 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_vnops.c,v 1.104 2019/08/05 08:35:59 anton Exp $ */ +/* $OpenBSD: vfs_vnops.c,v 1.105 2019/08/12 08:17:05 anton Exp $ */ /* $NetBSD: vfs_vnops.c,v 1.20 1996/02/04 02:18:41 christos Exp $ */ /* @@ -620,7 +620,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; |