summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2009-02-13 18:18:14 +0000
committerjhb <jhb@FreeBSD.org>2009-02-13 18:18:14 +0000
commit26e338d6fc4cd60255a131cdf285a3c2cb66cea4 (patch)
tree059be0daffb9368cf7dc8f5d8a29ff30ea6391fb /sys
parent482df37a9ec093145af5d2f758f6e565fba7980d (diff)
downloadFreeBSD-src-26e338d6fc4cd60255a131cdf285a3c2cb66cea4.zip
FreeBSD-src-26e338d6fc4cd60255a131cdf285a3c2cb66cea4.tar.gz
Use shared vnode locks when invoking VOP_READDIR().
MFC after: 1 month
Diffstat (limited to 'sys')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c4
-rw-r--r--sys/compat/linux/linux_file.c2
-rw-r--r--sys/compat/linux/linux_getcwd.c2
-rw-r--r--sys/compat/svr4/svr4_misc.c4
-rw-r--r--sys/fs/coda/coda_vnops.c2
-rw-r--r--sys/i386/ibcs2/ibcs2_misc.c4
-rw-r--r--sys/kern/vfs_syscalls.c5
-rw-r--r--sys/nfsserver/nfs_serv.c4
8 files changed, 13 insertions, 14 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
index 0a44a83..f213d10 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
@@ -4697,8 +4697,8 @@ vop_listextattr {
return (error);
}
- NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW | LOCKLEAF | MPSAFE, UIO_SYSSPACE,
- ".", xvp, td);
+ NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW | LOCKLEAF | LOCKSHARED | MPSAFE,
+ UIO_SYSSPACE, ".", xvp, td);
error = namei(&nd);
vp = nd.ni_vp;
NDFREE(&nd, NDF_ONLY_PNBUF);
diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c
index 3f19b4c..b368429 100644
--- a/sys/compat/linux/linux_file.c
+++ b/sys/compat/linux/linux_file.c
@@ -372,7 +372,7 @@ getdents_common(struct thread *td, struct linux_getdents64_args *args,
buflen = min(buflen, MAXBSIZE);
buf = malloc(buflen, M_TEMP, M_WAITOK);
lbuf = malloc(LINUX_MAXRECLEN, M_TEMP, M_WAITOK | M_ZERO);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(vp, LK_SHARED | LK_RETRY);
again:
aiov.iov_base = buf;
diff --git a/sys/compat/linux/linux_getcwd.c b/sys/compat/linux/linux_getcwd.c
index 2ab69c5..6474d1e 100644
--- a/sys/compat/linux/linux_getcwd.c
+++ b/sys/compat/linux/linux_getcwd.c
@@ -163,7 +163,7 @@ linux_getcwd_scandir(lvpp, uvpp, bpp, bufp, td)
cn.cn_nameptr = "..";
cn.cn_namelen = 2;
cn.cn_consume = 0;
- cn.cn_lkflags = LK_EXCLUSIVE;
+ cn.cn_lkflags = LK_SHARED;
/*
* At this point, lvp is locked and will be unlocked by the lookup.
diff --git a/sys/compat/svr4/svr4_misc.c b/sys/compat/svr4/svr4_misc.c
index bb1bf3d..ad56a11 100644
--- a/sys/compat/svr4/svr4_misc.c
+++ b/sys/compat/svr4/svr4_misc.c
@@ -278,7 +278,7 @@ svr4_sys_getdents64(td, uap)
buflen = max(DIRBLKSIZ, nbytes);
buflen = min(buflen, MAXBSIZE);
buf = malloc(buflen, M_TEMP, M_WAITOK);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(vp, LK_SHARED | LK_RETRY);
again:
aiov.iov_base = buf;
aiov.iov_len = buflen;
@@ -447,7 +447,7 @@ svr4_sys_getdents(td, uap)
buflen = min(MAXBSIZE, uap->nbytes);
buf = malloc(buflen, M_TEMP, M_WAITOK);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(vp, LK_SHARED | LK_RETRY);
off = fp->f_offset;
again:
aiov.iov_base = buf;
diff --git a/sys/fs/coda/coda_vnops.c b/sys/fs/coda/coda_vnops.c
index a913bd6..c5c6cb1 100644
--- a/sys/fs/coda/coda_vnops.c
+++ b/sys/fs/coda/coda_vnops.c
@@ -1506,7 +1506,7 @@ coda_readdir(struct vop_readdir_args *ap)
*/
CODADEBUG(CODA_READDIR, myprintf(("indirect readdir: fid = %s, "
"refcnt = %d\n", coda_f2s(&cp->c_fid), vp->v_usecount)););
- vn_lock(cp->c_ovp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(cp->c_ovp, LK_SHARED | LK_RETRY);
error = VOP_READDIR(cp->c_ovp, uiop, cred, eofflag, ncookies,
cookies);
VOP_UNLOCK(cp->c_ovp, 0);
diff --git a/sys/i386/ibcs2/ibcs2_misc.c b/sys/i386/ibcs2/ibcs2_misc.c
index 18b6459..7faf675 100644
--- a/sys/i386/ibcs2/ibcs2_misc.c
+++ b/sys/i386/ibcs2/ibcs2_misc.c
@@ -356,7 +356,7 @@ ibcs2_getdents(td, uap)
buflen = max(DIRBLKSIZ, uap->nbytes);
buflen = min(buflen, MAXBSIZE);
buf = malloc(buflen, M_TEMP, M_WAITOK);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(vp, LK_SHARED | LK_RETRY);
again:
aiov.iov_base = buf;
aiov.iov_len = buflen;
@@ -518,7 +518,7 @@ ibcs2_read(td, uap)
buflen = max(DIRBLKSIZ, uap->nbytes);
buflen = min(buflen, MAXBSIZE);
buf = malloc(buflen, M_TEMP, M_WAITOK);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(vp, LK_SHARED | LK_RETRY);
again:
aiov.iov_base = buf;
aiov.iov_len = buflen;
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index be3dc76..80da9b7 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -3936,7 +3936,7 @@ unionread:
auio.uio_segflg = UIO_USERSPACE;
auio.uio_td = td;
auio.uio_resid = uap->count;
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(vp, LK_SHARED | LK_RETRY);
loff = auio.uio_offset = fp->f_offset;
#ifdef MAC
error = mac_vnode_check_readdir(td->td_ucred, vp);
@@ -4095,8 +4095,7 @@ unionread:
auio.uio_segflg = UIO_USERSPACE;
auio.uio_td = td;
auio.uio_resid = count;
- /* vn_lock(vp, LK_SHARED | LK_RETRY); */
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(vp, LK_SHARED | LK_RETRY);
AUDIT_ARG(vnode, vp, ARG_VNODE1);
loff = auio.uio_offset = fp->f_offset;
#ifdef MAC
diff --git a/sys/nfsserver/nfs_serv.c b/sys/nfsserver/nfs_serv.c
index ab09421..5c52da6 100644
--- a/sys/nfsserver/nfs_serv.c
+++ b/sys/nfsserver/nfs_serv.c
@@ -3251,7 +3251,7 @@ again:
io.uio_rw = UIO_READ;
io.uio_td = NULL;
eofflag = 0;
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(vp, LK_SHARED | LK_RETRY);
if (cookies) {
free((caddr_t)cookies, M_TEMP);
cookies = NULL;
@@ -3533,7 +3533,7 @@ again:
io.uio_rw = UIO_READ;
io.uio_td = NULL;
eofflag = 0;
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(vp, LK_SHARED | LK_RETRY);
if (cookies) {
free((caddr_t)cookies, M_TEMP);
cookies = NULL;
OpenPOWER on IntegriCloud