Unlock lseek(2).
authoranton <anton@openbsd.org>
Thu, 6 May 2021 12:55:20 +0000 (12:55 +0000)
committeranton <anton@openbsd.org>
Thu, 6 May 2021 12:55:20 +0000 (12:55 +0000)
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
sys/kern/vfs_vnops.c

index e377376..4246004 100644 (file)
@@ -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
 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); }
index 945b409..f726d72 100644 (file)
@@ -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;