diff options
author | jhb <jhb@FreeBSD.org> | 2009-02-05 23:01:36 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2009-02-05 23:01:36 +0000 |
commit | fa654c58a4bfb22536c5568a23dbe93dc8ecdbc0 (patch) | |
tree | aafa81f8735c76c617e6ec31245cb1c3431a7879 /sys/kern | |
parent | d9be247f478f90aa920ebd36fba35df7332439c6 (diff) | |
download | FreeBSD-src-fa654c58a4bfb22536c5568a23dbe93dc8ecdbc0.zip FreeBSD-src-fa654c58a4bfb22536c5568a23dbe93dc8ecdbc0.tar.gz |
Drop the kernel linker lock while running SYSUNINIT routines and removing
sysctls during a linker file unload. We drop the lock when doing similar
operations during a linker file load. To close races, clear the LINKED
flag before dropping the lock so that the linker file is no longer visible
to userland.
MFC after: 1 week
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_linker.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index 1683a5a..c5e3a4e 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -643,8 +643,11 @@ linker_file_unload(linker_file_t file, int flags) * link error. */ if (file->flags & LINKER_FILE_LINKED) { + file->flags &= ~LINKER_FILE_LINKED; + KLD_UNLOCK(); linker_file_sysuninit(file); linker_file_unregister_sysctls(file); + KLD_LOCK(); } TAILQ_REMOVE(&linker_files, file, link); |