Download raw body.
Unlock fstat(2)
sys_fstat() is implemented as a wrapper around `fo_stat'. All
implementations are ready to be called without KERNEL_LOCK() except
for vn_statfile() below.
This was part of my previous VFS unlock diff.
ok?
Index: kern/syscalls.master
===================================================================
RCS file: /cvs/src/sys/kern/syscalls.master,v
diff -u -p -r1.265 syscalls.master
--- kern/syscalls.master 2 Aug 2024 14:34:45 -0000 1.265
+++ kern/syscalls.master 5 Jan 2025 10:02:35 -0000
@@ -133,7 +133,7 @@
51 UNIMPL acct
#endif
52 STD { int sys_sigpending(void); }
-53 STD { int sys_fstat(int fd, struct stat *sb); }
+53 STD NOLOCK { int sys_fstat(int fd, struct stat *sb); }
54 STD NOLOCK { int sys_ioctl(int fd, \
u_long com, ... void *data); }
55 STD { int sys_reboot(int opt); }
Index: kern/vfs_vnops.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_vnops.c,v
diff -u -p -r1.124 vfs_vnops.c
--- kern/vfs_vnops.c 30 Dec 2024 02:46:00 -0000 1.124
+++ kern/vfs_vnops.c 5 Jan 2025 10:03:02 -0000
@@ -427,7 +427,13 @@ int
vn_statfile(struct file *fp, struct stat *sb, struct proc *p)
{
struct vnode *vp = fp->f_data;
- return vn_stat(vp, sb, p);
+ int error;
+
+ KERNEL_LOCK();
+ error = vn_stat(vp, sb, p);
+ KERNEL_UNLOCK();
+
+ return (error);
}
/*
Unlock fstat(2)