PERFORCE change 99881 for review
John Baldwin
jhb at FreeBSD.org
Fri Jun 23 18:34:40 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=99881
Change 99881 by jhb at jhb_mutex on 2006/06/23 18:33:38
Add conditional VFS-Giant locking to ogetdirentries().
Affected files ...
.. //depot/projects/smpng/sys/kern/vfs_syscalls.c#106 edit
Differences ...
==== //depot/projects/smpng/sys/kern/vfs_syscalls.c#106 (text+ko) ====
@@ -3569,7 +3569,7 @@
struct iovec aiov, kiov;
struct dirent *dp, *edp;
caddr_t dirbuf;
- int error, eofflag, readcnt;
+ int error, eofflag, readcnt, vfslocked;
long loff;
/* XXX arbitrary sanity limit on `count'. */
@@ -3583,7 +3583,9 @@
}
vp = fp->f_vnode;
unionread:
+ vfslocked = VFS_LOCK_GIANT(vp->v_mount);
if (vp->v_type != VDIR) {
+ VFS_UNLOCK_GIANT(vfslocked);
fdrop(fp, td);
return (EINVAL);
}
@@ -3601,6 +3603,7 @@
error = mac_check_vnode_readdir(td->td_ucred, vp);
if (error) {
VOP_UNLOCK(vp, 0, td);
+ VFS_UNLOCK_GIANT(vfslocked);
fdrop(fp, td);
return (error);
}
@@ -3658,15 +3661,19 @@
}
VOP_UNLOCK(vp, 0, td);
if (error) {
+ VFS_UNLOCK_GIANT(vfslocked);
fdrop(fp, td);
return (error);
}
if (uap->count == auio.uio_resid) {
if (union_dircheckp) {
error = union_dircheckp(td, &vp, fp);
- if (error == -1)
+ if (error == -1) {
+ VFS_UNLOCK_GIANT(vfslocked);
goto unionread;
+ }
if (error) {
+ VFS_UNLOCK_GIANT(vfslocked);
fdrop(fp, td);
return (error);
}
@@ -3685,10 +3692,12 @@
fp->f_data = vp;
fp->f_offset = 0;
vput(tvp);
+ VFS_UNLOCK_GIANT(vfslocked);
goto unionread;
}
VOP_UNLOCK(vp, 0, td);
}
+ VFS_UNLOCK_GIANT(vfslocked);
error = copyout(&loff, uap->basep, sizeof(long));
fdrop(fp, td);
td->td_retval[0] = uap->count - auio.uio_resid;
More information about the p4-projects
mailing list