diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2006-07-10 19:13:45 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2006-07-10 19:13:45 +0000 |
| commit | 0bf8969c60d9847ef5b99e411f90aa39ad18d7ff (patch) | |
| tree | 97b083bc9524157d6b6063118c9e472145bb7102 /sys/kern/kern_linker.c | |
| parent | a4690c931ee98f21c38898b44f7b6be1b3ed6c5a (diff) | |
Notes
Diffstat (limited to 'sys/kern/kern_linker.c')
| -rw-r--r-- | sys/kern/kern_linker.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index 0aeb21c977f2..55ad60e2eecb 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -1274,7 +1274,7 @@ linker_preload(void *arg) caddr_t modptr; const char *modname, *nmodname; char *modtype; - linker_file_t lf; + linker_file_t lf, nlf; linker_class_t lc; int error; linker_file_list_t loaded_files; @@ -1384,10 +1384,10 @@ restart: nver) != NULL) { printf("module %s already" " present!\n", modname); - linker_file_unload(lf, - LINKER_UNLOAD_FORCE); TAILQ_REMOVE(&loaded_files, lf, loaded); + linker_file_unload(lf, + LINKER_UNLOAD_FORCE); /* we changed tailq next ptr */ goto restart; } @@ -1418,7 +1418,7 @@ restart: /* * We made it. Finish off the linking in the order we determined. */ - TAILQ_FOREACH(lf, &depended_files, loaded) { + TAILQ_FOREACH_SAFE(lf, &depended_files, loaded, nlf) { if (linker_kernel_file) { linker_kernel_file->refs++; error = linker_file_add_dependency(lf, @@ -1453,6 +1453,7 @@ restart: */ error = LINKER_LINK_PRELOAD_FINISH(lf); if (error) { + TAILQ_REMOVE(&depended_files, lf, loaded); printf("KLD file %s - could not finalize loading\n", lf->filename); linker_file_unload(lf, LINKER_UNLOAD_FORCE); |
