summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2002-06-28 17:51:11 +0000
committerjeff <jeff@FreeBSD.org>2002-06-28 17:51:11 +0000
commit9fbb8d216f8792d780e5664546c331feb5a73f98 (patch)
treecbbf74a1b2b675d930412c76398382e5882041d1 /sys
parent62d02a6b93413e38cea255ac4d89ff70ce01c5bc (diff)
downloadFreeBSD-src-9fbb8d216f8792d780e5664546c331feb5a73f98.zip
FreeBSD-src-9fbb8d216f8792d780e5664546c331feb5a73f98.tar.gz
Clean up vn_rdwr locking.
- Do shared locks on read. - Only do vn_{start,finished}_write when writing.
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/vfs_vnops.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 5687bac..77568c2 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -356,11 +356,16 @@ vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, cred, aresid, td)
if ((ioflg & IO_NODELOCKED) == 0) {
mp = NULL;
- if (rw == UIO_WRITE &&
- vp->v_type != VCHR &&
- (error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0)
- return (error);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
+ if (rw == UIO_WRITE) {
+ if (vp->v_type != VCHR &&
+ (error = vn_start_write(vp, &mp, V_WAIT | PCATCH))
+ != 0)
+ return (error);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
+ } else {
+ vn_lock(vp, LK_SHARED | LK_RETRY, td);
+ }
+
}
auio.uio_iov = &aiov;
auio.uio_iovcnt = 1;
@@ -382,7 +387,8 @@ vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, cred, aresid, td)
if (auio.uio_resid && error == 0)
error = EIO;
if ((ioflg & IO_NODELOCKED) == 0) {
- vn_finished_write(mp);
+ if (rw == UIO_WRITE)
+ vn_finished_write(mp);
VOP_UNLOCK(vp, 0, td);
}
return (error);
OpenPOWER on IntegriCloud