diff options
author | maxim <maxim@FreeBSD.org> | 2006-06-15 08:53:09 +0000 |
---|---|---|
committer | maxim <maxim@FreeBSD.org> | 2006-06-15 08:53:09 +0000 |
commit | cd982b5207bedb326e25ab56cd0030918cedb6c2 (patch) | |
tree | 62d29f4b2f9ae1b9174785a841dea097fa319886 /sys/kern/kern_module.c | |
parent | 9755dcd8dbe6b583601673fe7095f34cd82a7e53 (diff) | |
download | FreeBSD-src-cd982b5207bedb326e25ab56cd0030918cedb6c2.zip FreeBSD-src-cd982b5207bedb326e25ab56cd0030918cedb6c2.tar.gz |
o Expand an exclusive lock scope to prevent a race between two
simultaneous module_register().
Original work done by: Alex Lyashkov
Reviewed by: jhb
MFC after: 2 weeks
Diffstat (limited to 'sys/kern/kern_module.c')
-rw-r--r-- | sys/kern/kern_module.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/sys/kern/kern_module.c b/sys/kern/kern_module.c index f92d39c..9731717 100644 --- a/sys/kern/kern_module.c +++ b/sys/kern/kern_module.c @@ -136,20 +136,20 @@ module_register(const moduledata_t *data, linker_file_t container) size_t namelen; module_t newmod; - MOD_SLOCK; + MOD_XLOCK; newmod = module_lookupbyname(data->name); if (newmod != NULL) { - MOD_SUNLOCK; + MOD_XUNLOCK; printf("module_register: module %s already exists!\n", data->name); return (EEXIST); } - MOD_SUNLOCK; namelen = strlen(data->name) + 1; newmod = malloc(sizeof(struct module) + namelen, M_MODULE, M_WAITOK); - if (newmod == NULL) + if (newmod == NULL) { + MOD_XUNLOCK; return (ENOMEM); - MOD_XLOCK; + } newmod->refs = 1; newmod->id = nextid++; newmod->name = (char *)(newmod + 1); |