Index: sys/kern/kern_linker.c =================================================================== --- sys/kern/kern_linker.c +++ sys/kern/kern_linker.c @@ -89,7 +89,8 @@ /* * Find a currently loaded file given its filename. */ -static linker_file_t linker_find_file_by_name(const char* _filename); +#define LFFBN_IGNORE_INCOMPLETE 0x1 +static linker_file_t linker_find_file_by_name(const char* _filename, int flag); /* * Find a currently loaded file given its file id. @@ -397,7 +398,7 @@ return (EPERM); sx_assert(&kld_sx, SA_XLOCKED); - lf = linker_find_file_by_name(filename); + lf = linker_find_file_by_name(filename, 0); if (lf) { KLD_DPF(FILE, ("linker_load_file: file %s is already loaded," " incrementing refs\n", filename)); @@ -522,7 +523,7 @@ } static linker_file_t -linker_find_file_by_name(const char *filename) +linker_find_file_by_name(const char *filename, int flag) { linker_file_t lf; char *koname; @@ -532,9 +533,11 @@ sx_assert(&kld_sx, SA_XLOCKED); TAILQ_FOREACH(lf, &linker_files, link) { - if (strcmp(lf->filename, koname) == 0) - break; - if (strcmp(lf->filename, filename) == 0) + if (strcmp(lf->filename, koname) != 0 && + strcmp(lf->filename, filename) != 0) + continue; + if ((lf->flags & LINKER_FILE_LINKED) != 0 || + (flag & LFFBN_IGNORE_INCOMPLETE) == 0) break; } free(koname, M_LINKER); @@ -1150,7 +1153,7 @@ filename = linker_basename(pathname); sx_xlock(&kld_sx); - lf = linker_find_file_by_name(filename); + lf = linker_find_file_by_name(filename, LFFBN_IGNORE_INCOMPLETE); if (lf) td->td_retval[0] = lf->id; else @@ -2018,7 +2021,7 @@ * provide different versions of the same modules. */ filename = linker_basename(pathname); - if (linker_find_file_by_name(filename)) + if (linker_find_file_by_name(filename, 0)) error = EEXIST; else do { error = linker_load_file(pathname, &lfdep);