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_obj.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_obj.c')
-rw-r--r-- | sys/kern/link_elf_obj.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c index de43b7a..5a10298 100644 --- a/sys/kern/link_elf_obj.c +++ b/sys/kern/link_elf_obj.c @@ -38,6 +38,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> @@ -393,6 +394,7 @@ link_elf_load_file(linker_class_t cls, const char *filename, int nsym; int pb, rl, ra; int alignmask; + int vfslocked; GIANT_REQUIRED; @@ -401,11 +403,12 @@ link_elf_load_file(linker_class_t cls, const char *filename, mapsize = 0; hdr = 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(td->td_ucred, nd.ni_vp); @@ -788,6 +791,7 @@ out: free(hdr, 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; } |