summaryrefslogtreecommitdiff
path: root/sys/msdosfs
diff options
context:
space:
mode:
authoranton <anton@cvs.openbsd.org>2019-07-10 16:43:21 +0000
committeranton <anton@cvs.openbsd.org>2019-07-10 16:43:21 +0000
commitd8bf193ec09f26b570daa057ab9961744de1794d (patch)
treefb42455d3d5d0bb3236d5a9551cade60758d5ad7 /sys/msdosfs
parentcfb2b7e76d2d97505ffb3e2ac6a43561e980f07a (diff)
Make read/write of the f_offset field belonging to struct file MP-safe;
as part of the effort to unlock the kernel. Instead of relying on the vnode lock, introduce a dedicated lock per file. Exclusive write access is granted using the new foffset_enter and foffset_leave API. A convenience function foffset_get is also available for threads that only need to read the current offset. The lock acquisition order in vn_write has been changed to match the one in vn_read in order to avoid a potential deadlock. This change also gets rid of a documented race in vn_read(). Inspired by the FreeBSD implementation. With help and ok mpi@ visa@
Diffstat (limited to 'sys/msdosfs')
-rw-r--r--sys/msdosfs/msdosfs_vnops.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/msdosfs/msdosfs_vnops.c b/sys/msdosfs/msdosfs_vnops.c
index a2e465cbb3a..d39361ce732 100644
--- a/sys/msdosfs/msdosfs_vnops.c
+++ b/sys/msdosfs/msdosfs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: msdosfs_vnops.c,v 1.122 2018/06/21 14:17:23 visa Exp $ */
+/* $OpenBSD: msdosfs_vnops.c,v 1.123 2019/07/10 16:43:19 anton Exp $ */
/* $NetBSD: msdosfs_vnops.c,v 1.63 1997/10/17 11:24:19 ws Exp $ */
/*-
@@ -2017,7 +2017,7 @@ filt_msdosfsread(struct knote *kn, long hint)
return (1);
}
- kn->kn_data = dep->de_FileSize - kn->kn_fp->f_offset;
+ kn->kn_data = dep->de_FileSize - foffset_get(kn->kn_fp);
if (kn->kn_data == 0 && kn->kn_sfflags & NOTE_EOF) {
kn->kn_fflags |= NOTE_EOF;
return (1);