aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_module.c
diff options
context:
space:
mode:
authorMatthew Dillon <dillon@FreeBSD.org>2001-09-01 19:04:37 +0000
committerMatthew Dillon <dillon@FreeBSD.org>2001-09-01 19:04:37 +0000
commit835a82ee2d3ecab3628947d1788030d86b1b5c10 (patch)
treedfb3f2cb530ca520b51a9f324dcc3bad4ac7b15b /sys/kern/kern_module.c
parente619430f320edd1b664c795a5b3fbb3741237e66 (diff)
downloadsrc-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.c71
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;
}