diff options
author | jhb <jhb@FreeBSD.org> | 2006-07-19 19:03:03 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2006-07-19 19:03:03 +0000 |
commit | 1dccc9f17aa2ad80007dd564c30daa2292a7ae84 (patch) | |
tree | 2e07b9f7dadec408604596c4ca057b058f2ed6bb | |
parent | 3d1ab82c4816a3893e91906910592cde15970307 (diff) | |
download | FreeBSD-src-1dccc9f17aa2ad80007dd564c30daa2292a7ae84.zip FreeBSD-src-1dccc9f17aa2ad80007dd564c30daa2292a7ae84.tar.gz |
Add conditional VFS Giant locking to svr4_sys_resolvepath() and mark it
MPSAFE.
-rw-r--r-- | sys/compat/svr4/svr4_misc.c | 5 | ||||
-rw-r--r-- | sys/compat/svr4/syscalls.master | 2 |
2 files changed, 5 insertions, 2 deletions
diff --git a/sys/compat/svr4/svr4_misc.c b/sys/compat/svr4/svr4_misc.c index 953a31d..fea3608 100644 --- a/sys/compat/svr4/svr4_misc.c +++ b/sys/compat/svr4/svr4_misc.c @@ -1600,12 +1600,14 @@ svr4_sys_resolvepath(td, uap) struct nameidata nd; int error, *retval = td->td_retval; unsigned int ncopy; + int vfslocked; - NDINIT(&nd, LOOKUP, NOFOLLOW | SAVENAME, UIO_USERSPACE, + NDINIT(&nd, LOOKUP, NOFOLLOW | SAVENAME | MPSAFE, UIO_USERSPACE, uap->path, td); if ((error = namei(&nd)) != 0) return error; + vfslocked = NDHASGIANT(&nd); ncopy = min(uap->bufsiz, strlen(nd.ni_cnd.cn_pnbuf) + 1); if ((error = copyout(nd.ni_cnd.cn_pnbuf, uap->buf, ncopy)) != 0) @@ -1615,5 +1617,6 @@ svr4_sys_resolvepath(td, uap) bad: NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_vp); + VFS_UNLOCK_GIANT(vfslocked); return error; } diff --git a/sys/compat/svr4/syscalls.master b/sys/compat/svr4/syscalls.master index ba7af09..a5d6a94 100644 --- a/sys/compat/svr4/syscalls.master +++ b/sys/compat/svr4/syscalls.master @@ -320,7 +320,7 @@ 206 AUE_NULL UNIMPL schedctl 207 AUE_NULL UNIMPL pset 208 AUE_NULL UNIMPL whoknows -209 AUE_NULL STD { int svr4_sys_resolvepath(const char *path, \ +209 AUE_NULL MSTD { int svr4_sys_resolvepath(const char *path, \ char *buf, size_t bufsiz); } 210 AUE_NULL UNIMPL signotifywait 211 AUE_NULL UNIMPL lwp_sigredirect |