diff options
author | dillon <dillon@FreeBSD.org> | 2001-09-01 19:04:37 +0000 |
---|---|---|
committer | dillon <dillon@FreeBSD.org> | 2001-09-01 19:04:37 +0000 |
commit | ab65c87802bf5b2499357a7731a9d082ee00ea48 (patch) | |
tree | dfb3f2cb530ca520b51a9f324dcc3bad4ac7b15b /sys/kern/kern_module.c | |
parent | 056bad6e37214da97a729e22475476016588e773 (diff) | |
download | FreeBSD-src-ab65c87802bf5b2499357a7731a9d082ee00ea48.zip FreeBSD-src-ab65c87802bf5b2499357a7731a9d082ee00ea48.tar.gz |
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()
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 b9d35d7..3fbdb72 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; } |