Index: kern_linker.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_linker.c,v retrieving revision 1.144 diff -u -r1.144 kern_linker.c --- kern_linker.c 6 Nov 2006 13:42:00 -0000 1.144 +++ kern_linker.c 21 Feb 2007 17:00:59 -0000 @@ -435,18 +435,22 @@ linker_file_t *result) { modlist_t mod; - int error; + int error, locked; - KLD_LOCK(); + locked = KLD_LOCKED(); + if (!locked) + KLD_LOCK(); if ((mod = modlist_lookup2(modname, verinfo)) != NULL) { *result = mod->container; (*result)->refs++; - KLD_UNLOCK(); + if (!locked) + KLD_UNLOCK(); return (0); } error = linker_load_module(NULL, modname, NULL, verinfo, result); - KLD_UNLOCK(); + if (!locked) + KLD_UNLOCK(); return (error); } @@ -455,15 +459,18 @@ linker_file_t lf) { modlist_t mod; - int error; + int error, locked; - KLD_LOCK(); + locked = KLD_LOCKED(); + if (!locked) + KLD_LOCK(); if (lf == NULL) { KASSERT(modname != NULL, ("linker_release_module: no file or name")); mod = modlist_lookup2(modname, verinfo); if (mod == NULL) { - KLD_UNLOCK(); + if (!locked) + KLD_UNLOCK(); return (ESRCH); } lf = mod->container; @@ -471,7 +478,8 @@ KASSERT(modname == NULL && verinfo == NULL, ("linker_release_module: both file and name")); error = linker_file_unload(lf, LINKER_UNLOAD_NORMAL); - KLD_UNLOCK(); + if (!locked) + KLD_UNLOCK(); return (error); }