diff options
author | jeff <jeff@FreeBSD.org> | 2002-06-28 17:51:11 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2002-06-28 17:51:11 +0000 |
commit | 9fbb8d216f8792d780e5664546c331feb5a73f98 (patch) | |
tree | cbbf74a1b2b675d930412c76398382e5882041d1 | |
parent | 62d02a6b93413e38cea255ac4d89ff70ce01c5bc (diff) | |
download | FreeBSD-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.
-rw-r--r-- | sys/kern/vfs_vnops.c | 18 |
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); |