On Sat, May 01, 2021 at 08:19:19AM +0200, Anton Lindqvist wrote:
> Hi,
> In August 2019 I tried to unlock lseek(2) which failed since the vnode
> lock could not be acquired without holding the kernel lock back then,
> found the hard way. claudio@ recently[1] make it possible to acquire a
> vnode lock without holding the kernel lock. I therefore would like to
> give this another try. The kernel lock is still required around
> VOP_GETATTR() as the underlying file system implementations are not
> yet^W MP-safe.
> 
> Comments? OK?
> 
> [1] 
> https://github.com/openbsd/src/commit/9d6122f62b6ed32d6c956e1d5269114b2f24ea14
> 
> Index: kern/syscalls.master
> ===================================================================
> RCS file: /cvs/src/sys/kern/syscalls.master,v
> retrieving revision 1.209
> diff -u -p -r1.209 syscalls.master
> --- kern/syscalls.master      18 Mar 2021 08:43:38 -0000      1.209
> +++ kern/syscalls.master      29 Apr 2021 19:09:58 -0000
> @@ -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); }
> Index: kern/vfs_vnops.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/vfs_vnops.c,v
> retrieving revision 1.115
> diff -u -p -r1.115 vfs_vnops.c
> --- kern/vfs_vnops.c  28 Apr 2021 09:53:53 -0000      1.115
> +++ kern/vfs_vnops.c  29 Apr 2021 19:09:58 -0000
> @@ -657,7 +657,9 @@ vn_seek(struct file *fp, off_t *offset, 
>               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;
> 

Been running with this for a while. Both make build and a regress run
done.

Diff make sense. OK claudio@

-- 
:wq Claudio

Reply via email to