@@ -47,6 +47,7 @@
<arg><option>-C <replaceable>config-file</replaceable></option></arg>
<arg><option>-n</option></arg>
<arg><option>-i</option></arg>
+ <arg><option>-I</option></arg>
<arg><option>-q</option></arg>
<arg><option>-b</option></arg>
<arg><replaceable>modulename</replaceable></arg>
@@ -58,6 +59,7 @@
<arg><option>-v</option></arg>
<arg><option>-n</option></arg>
<arg><option>-i</option></arg>
+ <arg><option>-I</option></arg>
<arg rep='repeat'><option><replaceable>modulename</replaceable></option></arg>
</cmdsynopsis>
<cmdsynopsis>
@@ -318,6 +320,20 @@
</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term>
+ <option>-I</option>
+ </term>
+ <term>
+ <option>--ignore-cmdline</option>
+ </term>
+ <listitem>
+ <para>
+ This option causes <command>modprobe</command> to ignore
+ any configuration specified via the kernel command line.
+ </para>
+ </listitem>
+ </varlistentry>
<varlistentry>
<term>
<option>-n</option>
@@ -59,7 +59,7 @@ static int remove_holders = 0;
static unsigned long long wait_msec = 0;
static int quiet_inuse = 0;
-static const char cmdopts_s[] = "arw:RibfDcnC:d:S:sqvVh";
+static const char cmdopts_s[] = "arw:RiIbfDcnC:d:S:sqvVh";
static const struct option cmdopts[] = {
{"all", no_argument, 0, 'a'},
@@ -72,6 +72,7 @@ static const struct option cmdopts[] = {
{"first-time", no_argument, 0, 3},
{"ignore-install", no_argument, 0, 'i'},
{"ignore-remove", no_argument, 0, 'i'},
+ {"ignore-cmdline", no_argument, 0, 'I'},
{"use-blacklist", no_argument, 0, 'b'},
{"force", no_argument, 0, 'f'},
{"force-modversion", no_argument, 0, 2},
@@ -835,6 +836,7 @@ static int do_modprobe(int argc, char **orig_argv)
const char *dirname = NULL;
const char *root = NULL;
const char *kversion = NULL;
+ int ignore_cmdline = 0;
int use_all = 0;
int do_remove = 0;
int do_show_config = 0;
@@ -881,6 +883,9 @@ static int do_modprobe(int argc, char **orig_argv)
case 'i':
ignore_commands = 1;
break;
+ case 'I':
+ ignore_cmdline = 1;
+ break;
case 'b':
use_blacklist = 1;
break;
@@ -1004,7 +1009,7 @@ static int do_modprobe(int argc, char **orig_argv)
dirname = dirname_buf;
}
- ctx = kmod_new(dirname, config_paths);
+ ctx = kmod_new_flags(dirname, config_paths, ignore_cmdline ? KMOD_NEW_IGNORE_CMDLINE : 0);
if (!ctx) {
ERR("kmod_new() failed!\n");
err = -1;
Previously, if you'd misconfigured the cmdline your system would be completely poisoned. In this real scenario, ixgbe.allow_supported_sfp=1,1,1,1 was set. This yielded [ 3852.901900] ixgbe: `1,1,1,1' invalid for parameter `allow_unsupported_sfp' [ 3852.904595] ixgbe: unknown parameter 'allow_supported_sfp' ignored and # modprobe -r ixgbe # modprobe ixgbe allow_supported_sfp=1 since, indeed, # modprobe -nv ixgbe insmod /lib/modules/5.16.0-1-amd64/kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko allow_unsupported_sfp=1,1,1,1 # modprobe -nv ixgbe allow_supported_sfp=1 insmod /lib/modules/5.16.0-1-amd64/kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko allow_unsupported_sfp=1,1,1,1 allow_supported_sfp=1 this leaves you with a tens-of-minutes-long reboot (or with an explicit insmod, which no-one came up with at the time, and which requires manual dependency-chasing). With -I, the module can be correctly loaded since the cmdline-derived parameter no longer stops the module loading: # modprobe -nvI ixgbe allow_supported_sfp=1 insmod /lib/modules/5.16.0-1-amd64/kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko allow_supported_sfp=1 # modprobe -I ixgbe allow_supported_sfp=1 [ 4497.032342] ixgbe: Intel(R) 10 Gigabit PCI Express Network Driver [ 4497.034624] ixgbe: Copyright (c) 1999-2016 Intel Corporation. This in many ways mirrors -C /dev/null and -i. You could, I s'pose, unshare -m and mount --bind /dev/null /proc/cmdline. But you could say the same of -C in general. Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz> --- man/modprobe.xml | 16 ++++++++++++++++ tools/modprobe.c | 9 +++++++-- 2 files changed, 23 insertions(+), 2 deletions(-)