diff options
author | Matthew Dillon <dillon@FreeBSD.org> | 2001-09-01 19:04:37 +0000 |
---|---|---|
committer | Matthew Dillon <dillon@FreeBSD.org> | 2001-09-01 19:04:37 +0000 |
commit | 835a82ee2d3ecab3628947d1788030d86b1b5c10 (patch) | |
tree | dfb3f2cb530ca520b51a9f324dcc3bad4ac7b15b /sys/kern/kern_module.c | |
parent | e619430f320edd1b664c795a5b3fbb3741237e66 (diff) | |
download | src-835a82ee2d3ecab3628947d1788030d86b1b5c10.tar.gz src-835a82ee2d3ecab3628947d1788030d86b1b5c10.zip |
Giant Pushdown. Saved the worst P4 tree breakage for last.
reboot() getpriority() setpriority() rtprio() osetrlimit() ogetrlimit()
setrlimit() getrlimit() getrusage() getpid() getppid() getpgrp()
getpgid() getsid() getgid() getegid() getgroups() setsid() setpgid()
setuid() seteuid() setgid() setegid() setgroups() setreuid() setregid()
setresuid() setresgid() getresuid() getresgid () __setugid() getlogin()
setlogin() modnext() modfnext() modstat() modfind() kldload() kldunload()
kldfind() kldnext() kldstat() kldfirstmod() kldsym() getdtablesize()
dup2() dup() fcntl() close() ofstat() fstat() nfsstat() fpathconf()
flock()
Notes
Notes:
svn path=/head/; revision=82749
Diffstat (limited to 'sys/kern/kern_module.c')
-rw-r--r-- | sys/kern/kern_module.c | 71 |
1 files changed, 52 insertions, 19 deletions
diff --git a/sys/kern/kern_module.c b/sys/kern/kern_module.c index b9d35d7bb870..3fbdb723156e 100644 --- a/sys/kern/kern_module.c +++ b/sys/kern/kern_module.c @@ -36,6 +36,8 @@ #include <sys/module.h> #include <sys/linker.h> #include <sys/proc.h> +#include <sys/lock.h> +#include <sys/mutex.h> static MALLOC_DEFINE(M_MODULE, "module", "module data structures"); @@ -216,48 +218,67 @@ module_setspecific(module_t mod, modspecific_t *datap) /* * Syscalls. */ +/* + * MPSAFE + */ int modnext(struct proc* p, struct modnext_args* uap) { module_t mod; + int error = 0; + + mtx_lock(&Giant); p->p_retval[0] = -1; if (SCARG(uap, modid) == 0) { mod = TAILQ_FIRST(&modules); - if (mod) { + if (mod) p->p_retval[0] = mod->id; - return 0; - } else - return ENOENT; + else + error = ENOENT; + goto done2; } mod = module_lookupbyid(SCARG(uap, modid)); - if (!mod) - return ENOENT; + if (mod == NULL) { + error = ENOENT; + goto done2; + } if (TAILQ_NEXT(mod, link)) p->p_retval[0] = TAILQ_NEXT(mod, link)->id; else p->p_retval[0] = 0; - return 0; +done2: + mtx_unlock(&Giant); + return (error); } +/* + * MPSAFE + */ int modfnext(struct proc* p, struct modfnext_args* uap) { module_t mod; + int error; p->p_retval[0] = -1; - mod = module_lookupbyid(SCARG(uap, modid)); - if (!mod) - return ENOENT; + mtx_lock(&Giant); - if (TAILQ_NEXT(mod, flink)) - p->p_retval[0] = TAILQ_NEXT(mod, flink)->id; - else - p->p_retval[0] = 0; - return 0; + mod = module_lookupbyid(SCARG(uap, modid)); + if (mod == NULL) { + error = ENOENT; + } else { + error = 0; + if (TAILQ_NEXT(mod, flink)) + p->p_retval[0] = TAILQ_NEXT(mod, flink)->id; + else + p->p_retval[0] = 0; + } + mtx_unlock(&Giant); + return (error); } struct module_stat_v1 { @@ -267,6 +288,9 @@ struct module_stat_v1 { int id; }; +/* + * MPSAFE + */ int modstat(struct proc* p, struct modstat_args* uap) { @@ -276,9 +300,13 @@ modstat(struct proc* p, struct modstat_args* uap) int version; struct module_stat* stat; + mtx_lock(&Giant); + mod = module_lookupbyid(SCARG(uap, modid)); - if (!mod) - return ENOENT; + if (mod == NULL) { + error = ENOENT; + goto out; + } stat = SCARG(uap, stat); @@ -315,9 +343,13 @@ modstat(struct proc* p, struct modstat_args* uap) p->p_retval[0] = 0; out: + mtx_unlock(&Giant); return error; } +/* + * MPSAFE + */ int modfind(struct proc* p, struct modfind_args* uap) { @@ -328,12 +360,13 @@ modfind(struct proc* p, struct modfind_args* uap) if ((error = copyinstr(SCARG(uap, name), name, sizeof name, 0)) != 0) goto out; + mtx_lock(&Giant); mod = module_lookupbyname(name); - if (!mod) + if (mod == NULL) error = ENOENT; else p->p_retval[0] = mod->id; - + mtx_unlock(&Giant); out: return error; } |