kld regression

John Baldwin jhb at freebsd.org
Wed Feb 11 14:13:36 PST 2009


On Thursday 31 January 2008 1:00:43 pm Andriy Gapon wrote:
> on 31/01/2008 18:52 John Baldwin said the following:
> > On Thursday 31 January 2008 10:05:57 am Andriy Gapon wrote:
> >> on 31/01/2008 14:39 Andriy Gapon said the following:
> >>> on 31/01/2008 13:07 John Baldwin said the following:
> >>>> On Wednesday 30 January 2008 12:39:14 pm Andriy Gapon wrote:
> >>>>> The problem is as follows:
> >>>>> 1. put udf_load="YES" in loader.conf
> >>>>> 2. you can mount and unmount udf filesystems
> >>>>> 3. you can kldunload udf if no udf filesystems are mounted
> >>>>> 4. now mount udf fs while udf.ko is unloaded
> >>>>> 5. udf is auto loaded and fs is mounted
> >>>>> 6. unmount fs
> >>>>> 7. try to kldunload udf
> >>>>> kldunload: can't unload file: Device busy
> >>>>> kernel message: kldunload: attempt to unload file that was loaded by 
the
> >>>>> kernel
> >>>>>
> >>>>> Yeah, it was loaded by kernel indeed, but WTF - what is the difference
> >>>>> from manual/loader.conf loading and why I can not manage my modules as 
I
> >>>>> wish?
> >>>> Hmm, the relevant code (vfs_init.c) hasn't changed in 6.x since 6.0.  
> > There 
> >>>> were some changes in 7.0, but this should work in both branches.  What 
is 
> > the 
> >>>> previous release that this worked on?
> >>>>
> >>> Maybe I was wrong when I called this regression, but this was very
> >>> surprising behavior for me. And in 5.X I did a lot of udf
> >>> debugging/experimenting and never encountered such a problem. Maybe I
> >>> always did kldload before mount, I can't tell now.
> >>> Anyway, this seems like an annoyance at the very least, pinning a kernel
> >>> module without any important reasons.
> >>>
> >> Hmm, I found one difference with previous setups: in step 1 I also have
> >> udf_iconv_load="YES" and udf_iconv.ko module is what seems to prevent
> >> udf.ko from unloading in step 7. I can actually unload udf_iconv and
> >> then I am able again to unload udf.
> >>
> >> Still don't understand what is a big difference here.
> >>
> >> And if I had UDF_ICONV built into kernel then I wouldn't have this
> >> work-around.
> > 
> > Ah, I don't think we can safely unload modules loaded from the loader 
IIRC.
> > 
> 
> John,
> 
> maybe there is a small misunderstanding:
> 1. udf.ko and udf_iconv.ko are both loaded by loader - I *can* unload udf.ko
> 2. udf_iconv.ko is loaded by loader but udf.ko is auto-loaded (by
> whatever) when I do mount_udf - I can not unload udf.ko unless I unload
> udf_iconv.ko.
> 
> This is inconsistent and there is no obvious reason for things being
> this way.

VFS_DECLARE_ICONV() in <sys/iconv.h> has always made foo_iconv.ko depend on 
foo.ko from the beginning of its existence.  Thus, udf_iconv.ko has always 
depended on udf.ko.  I think if you had UDF_ICONV in your kernel config 
without UDF it would fail to link.  What I do find odd is that udf_iconv.ko 
worked at all, perhaps the linker resolved it and linked it in when udf.ko 
was loaded, as prior to udf.ko being loaded it was missing a symbol in udf.ko 
it has a reference to.  Either that or the loader was loading udf.ko as a 
dependency and you didn't realize it.

-- 
John Baldwin


More information about the freebsd-stable mailing list