summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2020-01-11 14:13:19 +0100
committerLubomir Rintel <lkundrak@v3.sk>2020-01-11 14:23:35 +0100
commitfe3bb0e3b85c361945384c9fe0aec8bf7caac967 (patch)
tree345be96672c7eb1e26e19594224504b981b34c3b
parent099cf26271a45f81e87d131b1f80f2ec7da21508 (diff)
downloadNetworkManager-lr/a-pair-of-ibft-fixes.tar.gz
initrd/cmdline: obey rd.iscsi.ibftlr/a-pair-of-ibft-fixes
Do process the connections from the iBFT block if the rd.iscsi.ibft or rd.iscsi.ibft=1 argument is present. This is supposed to fix what was originally reported by Kairui Song <kasong@redhat.com> here: https://github.com/dracutdevs/dracut/pull/697
-rw-r--r--src/initrd/nmi-cmdline-reader.c86
-rw-r--r--src/initrd/tests/test-cmdline-reader.c20
2 files changed, 63 insertions, 43 deletions
diff --git a/src/initrd/nmi-cmdline-reader.c b/src/initrd/nmi-cmdline-reader.c
index c32ef1cfea..619133ca20 100644
--- a/src/initrd/nmi-cmdline-reader.c
+++ b/src/initrd/nmi-cmdline-reader.c
@@ -195,6 +195,48 @@ _base_setting_set (NMConnection *connection, const char *property, const char *v
}
static void
+read_all_connections_from_fw (GHashTable *connections, const char *sysfs_dir)
+{
+ gs_unref_hashtable GHashTable *ibft = NULL;
+ NMConnection *connection;
+ GHashTableIter iter;
+ const char *mac;
+ GHashTable *nic;
+ const char *index;
+ GError *error = NULL;
+
+ ibft = nmi_ibft_read (sysfs_dir);
+
+ g_hash_table_iter_init (&iter, ibft);
+ while (g_hash_table_iter_next (&iter, (gpointer)&mac, (gpointer)&nic)) {
+ connection = nm_simple_connection_new ();
+
+ index = g_hash_table_lookup (nic, "index");
+ if (!index) {
+ _LOGW (LOGD_CORE, "Ignoring an iBFT entry without an index");
+ continue;
+ }
+
+ if (!nmi_ibft_update_connection_from_nic (connection, nic, &error)) {
+ _LOGW (LOGD_CORE, "Unable to merge iBFT configuration: %s", error->message);
+ g_error_free (error);
+ }
+
+ g_hash_table_insert (connections,
+ g_strdup_printf ("ibft%s", index),
+ connection);
+ }
+
+ connection = nmi_dt_reader_parse (sysfs_dir);
+ if (connection) {
+ g_hash_table_insert (connections,
+ g_strdup ("ofw"),
+ connection);
+ }
+}
+
+
+static void
parse_ip (GHashTable *connections, const char *sysfs_dir, char *argument)
{
NMConnection *connection;
@@ -258,44 +300,7 @@ parse_ip (GHashTable *connections, const char *sysfs_dir, char *argument)
if (ifname == NULL && ( g_strcmp0 (kind, "fw") == 0
|| g_strcmp0 (kind, "ibft") == 0)) {
- GHashTableIter iter;
- const char *mac;
- GHashTable *nic;
- const char *index;
-
- /* This is the ip=ibft case. Just take all we got from iBFT
- * and don't process anything else, since there's no ifname
- * specified to apply it to. */
- if (!ibft)
- ibft = nmi_ibft_read (sysfs_dir);
-
- g_hash_table_iter_init (&iter, ibft);
- while (g_hash_table_iter_next (&iter, (gpointer)&mac, (gpointer)&nic)) {
- connection = nm_simple_connection_new ();
-
- index = g_hash_table_lookup (nic, "index");
- if (!index) {
- _LOGW (LOGD_CORE, "Ignoring an iBFT entry without an index");
- continue;
- }
-
- if (!nmi_ibft_update_connection_from_nic (connection, nic, &error)) {
- _LOGW (LOGD_CORE, "Unable to merge iBFT configuration: %s", error->message);
- g_error_free (error);
- }
-
- g_hash_table_insert (connections,
- g_strdup_printf ("ibft%s", index),
- connection);
- }
-
- connection = nmi_dt_reader_parse (sysfs_dir);
- if (connection) {
- g_hash_table_insert (connections,
- g_strdup ("ofw"),
- connection);
- }
-
+ read_all_connections_from_fw (connections, sysfs_dir);
return;
}
@@ -421,8 +426,7 @@ parse_ip (GHashTable *connections, const char *sysfs_dir, char *argument)
if (mac) {
g_strchomp (mac);
mac_up = g_ascii_strup (mac, -1);
- if (!ibft)
- ibft = nmi_ibft_read (sysfs_dir);
+ ibft = nmi_ibft_read (sysfs_dir);
nic = g_hash_table_lookup (ibft, mac_up);
if (!nic)
_LOGW (LOGD_CORE, "No iBFT NIC for %s (%s)", ifname, mac_up);
@@ -838,6 +842,8 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv)
parse_nameserver (connections, argument);
else if (strcmp (tag, "rd.peerdns") == 0)
parse_rd_peerdns (connections, argument);
+ else if (strcmp (tag, "rd.iscsi.ibft") == 0 && _nm_utils_ascii_str_to_bool (argument, TRUE))
+ read_all_connections_from_fw (connections, sysfs_dir);
else if (strcmp (tag, "rd.bootif") == 0)
ignore_bootif = !_nm_utils_ascii_str_to_bool (argument, TRUE);
else if (strcmp (tag, "rd.neednet") == 0)
diff --git a/src/initrd/tests/test-cmdline-reader.c b/src/initrd/tests/test-cmdline-reader.c
index 5ea5e105c0..dbfe5cc9b7 100644
--- a/src/initrd/tests/test-cmdline-reader.c
+++ b/src/initrd/tests/test-cmdline-reader.c
@@ -789,10 +789,9 @@ test_ibft_ip_dev (void)
}
static void
-test_ibft (void)
+_test_ibft_ip (const char *const*ARGV)
{
gs_unref_hashtable GHashTable *connections = NULL;
- const char *const*ARGV = NM_MAKE_STRV ("ip=ibft");
NMConnection *connection;
connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
@@ -813,6 +812,20 @@ test_ibft (void)
}
static void
+test_ibft_ip (void)
+{
+ const char *const*ARGV = NM_MAKE_STRV ("ip=ibft");
+ _test_ibft_ip (ARGV);
+}
+
+static void
+test_ibft_rd_iscsi_ibft (void)
+{
+ const char *const*ARGV = NM_MAKE_STRV ("rd.iscsi.ibft");
+ _test_ibft_ip (ARGV);
+}
+
+static void
test_ignore_extra (void)
{
gs_unref_hashtable GHashTable *connections = NULL;
@@ -1069,7 +1082,8 @@ int main (int argc, char **argv)
g_test_add_func ("/initrd/cmdline/bridge", test_bridge);
g_test_add_func ("/initrd/cmdline/bridge/default", test_bridge_default);
g_test_add_func ("/initrd/cmdline/ibft/ip_dev", test_ibft_ip_dev);
- g_test_add_func ("/initrd/cmdline/ibft", test_ibft);
+ g_test_add_func ("/initrd/cmdline/ibft/ip", test_ibft_ip);
+ g_test_add_func ("/initrd/cmdline/ibft/rd_iscsi_ibft", test_ibft_rd_iscsi_ibft);
g_test_add_func ("/initrd/cmdline/ignore_extra", test_ignore_extra);
g_test_add_func ("/initrd/cmdline/rd_znet", test_rd_znet);
g_test_add_func ("/initrd/cmdline/rd_znet/legacy", test_rd_znet_legacy);