Date: Tue, 27 Jun 2006 21:08:09 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 100173 for review Message-ID: <200606272108.k5RL89wd006492@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=100173 Change 100173 by jhb@jhb_mutex on 2006/06/27 21:07:11 Add VFS Giant locking to svr4 getdents functions and mark MPSAFE. Affected files ... .. //depot/projects/smpng/sys/compat/svr4/svr4_misc.c#48 edit .. //depot/projects/smpng/sys/compat/svr4/syscalls.master#16 edit Differences ... ==== //depot/projects/smpng/sys/compat/svr4/svr4_misc.c#48 (text+ko) ==== @@ -240,7 +240,7 @@ struct iovec aiov; off_t off; struct svr4_dirent64 svr4_dirent; - int buflen, error, eofflag, nbytes, justone; + int buflen, error, eofflag, nbytes, justone, vfslocked; u_long *cookies = NULL, *cookiep; int ncookies; @@ -256,8 +256,9 @@ } vp = fp->f_vnode; - + vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { + VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (EINVAL); } @@ -394,6 +395,7 @@ td->td_retval[0] = nbytes - resid; out: VOP_UNLOCK(vp, 0, td); + VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); if (cookies) free(cookies, M_TEMP); @@ -418,7 +420,7 @@ struct iovec aiov; struct svr4_dirent idb; off_t off; /* true file offset */ - int buflen, error, eofflag; + int buflen, error, eofflag, vfslocked; u_long *cookiebuf = NULL, *cookie; int ncookies = 0, *retval = td->td_retval; @@ -434,7 +436,9 @@ } vp = fp->f_vnode; + vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { + VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (EINVAL); } @@ -524,6 +528,7 @@ *retval = uap->nbytes - resid; out: VOP_UNLOCK(vp, 0, td); + VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); if (cookiebuf) free(cookiebuf, M_TEMP); ==== //depot/projects/smpng/sys/compat/svr4/syscalls.master#16 (text+ko) ==== @@ -136,7 +136,7 @@ 78 AUE_NULL UNIMPL rfsys 79 AUE_NULL MNOPROTO { int rmdir(char *path); } 80 AUE_NULL MNOPROTO { int mkdir(char *path, int mode); } -81 AUE_NULL STD { int svr4_sys_getdents(int fd, char *buf, \ +81 AUE_NULL MSTD { int svr4_sys_getdents(int fd, char *buf, \ int nbytes); } 82 AUE_NULL UNIMPL libattach 83 AUE_NULL UNIMPL libdetach @@ -325,7 +325,7 @@ 210 AUE_NULL UNIMPL signotifywait 211 AUE_NULL UNIMPL lwp_sigredirect 212 AUE_NULL UNIMPL lwp_alarm -213 AUE_NULL STD { int svr4_sys_getdents64(int fd, \ +213 AUE_NULL MSTD { int svr4_sys_getdents64(int fd, \ struct svr4_dirent64 *dp, int nbytes); } ;213 AUE_NULL UNIMPL getdents64 214 AUE_NULL MSTD { caddr_t svr4_sys_mmap64(void *addr, \
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606272108.k5RL89wd006492>