summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_module.c
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>2001-09-01 19:04:37 +0000
committerdillon <dillon@FreeBSD.org>2001-09-01 19:04:37 +0000
commitab65c87802bf5b2499357a7731a9d082ee00ea48 (patch)
treedfb3f2cb530ca520b51a9f324dcc3bad4ac7b15b /sys/kern/kern_module.c
parent056bad6e37214da97a729e22475476016588e773 (diff)
downloadFreeBSD-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.c71
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;
}
OpenPOWER on IntegriCloud