diff options
author | jhb <jhb@FreeBSD.org> | 2006-06-20 21:31:38 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2006-06-20 21:31:38 +0000 |
commit | 3f7e224385f1737d75c25b508d028a5e861a7990 (patch) | |
tree | ff143f7dfd89e19ee50e276b610ffb2807cc1964 /sys/kern/link_elf.c | |
parent | 079c3bb7eb89d208baf9213e898444aaf349be2c (diff) | |
download | FreeBSD-src-3f7e224385f1737d75c25b508d028a5e861a7990.zip FreeBSD-src-3f7e224385f1737d75c25b508d028a5e861a7990.tar.gz |
Conditionally acquire Giant around VFS operations.
Diffstat (limited to 'sys/kern/link_elf.c')
-rw-r--r-- | sys/kern/link_elf.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c index 7b3f1ab..14b9c2e 100644 --- a/sys/kern/link_elf.c +++ b/sys/kern/link_elf.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include <sys/mac.h> #include <sys/malloc.h> #include <sys/mutex.h> +#include <sys/mount.h> #include <sys/proc.h> #include <sys/namei.h> #include <sys/fcntl.h> @@ -556,17 +557,19 @@ link_elf_load_file(linker_class_t cls, const char* filename, int symstrindex; int symcnt; int strcnt; + int vfslocked; GIANT_REQUIRED; shdr = NULL; lf = NULL; - NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename, td); + NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, filename, td); flags = FREAD; error = vn_open(&nd, &flags, 0, -1); if (error) return error; + vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); #ifdef MAC error = mac_check_kld_load(curthread->td_ucred, nd.ni_vp); @@ -859,6 +862,7 @@ out: free(firstpage, M_LINKER); VOP_UNLOCK(nd.ni_vp, 0, td); vn_close(nd.ni_vp, FREAD, td->td_ucred, td); + VFS_UNLOCK_GIANT(vfslocked); return error; } |