On 8/18/25 11:34 AM, Phil Sutter wrote: > On Sun, Aug 17, 2025 at 05:54:27PM +0200, Christophe Leroy wrote: >> Le 17/08/2025 à 01:33, Phil Sutter a écrit : >>> [Vous ne recevez pas souvent de courriers de p...@nwl.cc. D?couvrez >>> pourquoi ceci est important ? https://aka.ms/LearnAboutSenderIdentification >>> ] >>> >>> Hi, >>> >>> I admittedly didn't fully analyze the cause, but on my system a call to: >>> >>> # insmod /lib/module/$(uname -r)/kernel/net/netfilter/nf_conntrack_ftp.ko >>> >>> fails with -EEXIST (due to a previous call to 'nfct add helper ftp inet >>> tcp'). A call to: >>> >>> # modprobe nf_conntrack_ftp >>> >>> though returns 0 even though module loading fails. Is there a bug in >>> modprobe error status handling? >>> >> >> Read the man page : https://linux.die.net/man/8/modprobe >> >> In the man page I see: >> >> Normally, modprobe will succeed (and do nothing) if told to >> insert a module which is already present or to remove a module which >> isn't present. > > This is not a case of already inserted module, it is not loaded before > the call to modprobe. It is the module_init callback > nf_conntrack_ftp_init() which returns -EEXIST it received from > nf_conntrack_helpers_register(). > > Can't user space distinguish the two causes of -EEXIST? Or in other > words, is use of -EEXIST in module_init callbacks problematic?
Unfortunately, error return codes from (f)init_module cannot be reliably depended upon. For instance, cpufreq drivers have similar behavior of returning -EEXIST when another cpufreq driver is already registered. Returning this code unexpectedly can then confuse kmod, as it interprets -EEXIST to mean "the module is already loaded" [1]. I have thought about this problem before. We might fix the main problematic occurrences, but we can't really audit all the code that module init functions can invoke. I then wonder if it would make sense for the module loader to warn about any -EEXIST returned by a module's init function and translate it to -EBUSY. Ensuring the reliability of the 0 and -EEXIST return codes from (f)init_module should help user space. [1] https://github.com/kmod-project/kmod/blob/695fd084a727cf76f51b129b67d5a4be1d6db32e/libkmod/libkmod-module.c#L1087 -- Petr