diff options
author | jeff <jeff@FreeBSD.org> | 2002-08-22 07:26:18 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2002-08-22 07:26:18 +0000 |
commit | 120149c075e60c80ddba7f60e2a0d4b9eb1e3ce4 (patch) | |
tree | 702809da8ec87e8d9c5f9201d36ab851ab3f23b0 /sys/kern/vfs_vnops.c | |
parent | abe4a3ae2ec7800a6ed1c04e4c8cbceb0a340632 (diff) | |
download | FreeBSD-src-120149c075e60c80ddba7f60e2a0d4b9eb1e3ce4.zip FreeBSD-src-120149c075e60c80ddba7f60e2a0d4b9eb1e3ce4.tar.gz |
- Return two shared locks to exclusive locks. This was premature.
- Document the problems that prevent us from using shared locks.
Diffstat (limited to 'sys/kern/vfs_vnops.c')
-rw-r--r-- | sys/kern/vfs_vnops.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 3f00fda..5be404b 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -385,7 +385,12 @@ vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, active_cred, file_cred, return (error); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); } else { - vn_lock(vp, LK_SHARED | LK_RETRY, td); + /* + * XXX This should be LK_SHARED but I don't trust VFS + * enough to leave it like that until it has been + * reviewed further. + */ + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); } } @@ -500,7 +505,11 @@ vn_read(fp, uio, active_cred, flags, td) if (fp->f_flag & O_DIRECT) ioflag |= IO_DIRECT; VOP_LEASE(vp, td, fp->f_cred, LEASE_READ); - vn_lock(vp, LK_SHARED | LK_NOPAUSE | LK_RETRY, td); + /* + * According to McKusick the vn lock is protecting f_offset here. + * Once this field has it's own lock we can acquire this shared. + */ + vn_lock(vp, LK_EXCLUSIVE | LK_NOPAUSE | LK_RETRY, td); if ((flags & FOF_OFFSET) == 0) uio->uio_offset = fp->f_offset; |