]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
lxc: Assign aliases to filesystem and network devices
authorRadoslaw Smigielski <rsmigiel@redhat.com>
Fri, 19 Jun 2026 08:56:02 +0000 (10:56 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 3 Jul 2026 10:32:01 +0000 (12:32 +0200)
LXC domains did not assign device aliases to filesystem and network
interface during domain startup. Only console devices received
aliases.

This change introduces two new functions:
 - virLXCAssignDeviceNetAlias()
 - virLXCAssignDeviceFSAlias()

These functions scan existing devices to find the next available
device index. Also ensure correct alias assignment after network
and block device hotplug/unplug operations when a gap can
be introduced in device numbering.

The new functions are called during:
 - domain startup virLXCProcessStart()
 - device hotplug lxcDomainAttachDeviceNetLive()

Signed-off-by: Radoslaw Smigielski <rsmigiel@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/lxc/lxc_domain.c
src/lxc/lxc_domain.h
src/lxc/lxc_driver.c
src/lxc/lxc_process.c

index afd8d6e9805f57f21ebf423e3dadfadf42fdef6c..8c892a76c51794cc7fbd714c624efd82f54fcbea 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "virlog.h"
 #include "virerror.h"
+#include "virstring.h"
 #include "virtime.h"
 #include "virsystemd.h"
 #include "virinitctl.h"
@@ -375,3 +376,63 @@ virLXCDomainSetRunlevel(virDomainObj *vm,
     g_clear_pointer(&data.st_valid, g_free);
     return ret;
 }
+
+
+void
+virLXCAssignDeviceNetAlias(virDomainDef *def,
+                           virDomainNetDef *net)
+{
+    size_t i;
+    int idx = 0;
+
+    if (net->info.alias)
+        return;
+
+    for (i = 0; i < def->nnets; i++) {
+        const char *alias;
+        int thisidx;
+
+        if (!def->nets[i]->info.alias)
+            continue;
+        if (!(alias = STRSKIP(def->nets[i]->info.alias, "net")))
+            continue;
+
+        if (virStrToLong_i(alias, NULL, 10, &thisidx) < 0)
+            continue;
+
+        if (thisidx >= idx)
+            idx = thisidx + 1;
+    }
+
+    net->info.alias = g_strdup_printf("net%d", idx);
+}
+
+
+void
+virLXCAssignDeviceFSAlias(virDomainDef *def,
+                          virDomainFSDef *fs)
+{
+    size_t i;
+    int idx = 0;
+
+    if (fs->info.alias)
+        return;
+
+    for (i = 0; i < def->nfss; i++) {
+        const char *alias;
+        int thisidx;
+
+        if (!def->fss[i]->info.alias)
+            continue;
+        if (!(alias = STRSKIP(def->fss[i]->info.alias, "fs")))
+            continue;
+
+        if (virStrToLong_i(alias, NULL, 10, &thisidx) < 0)
+            continue;
+
+        if (thisidx >= idx)
+            idx = thisidx + 1;
+    }
+
+    fs->info.alias = g_strdup_printf("fs%d", idx);
+}
index d22c2ea153a5189ef3e00e664c04808dcbf4ef31..a666883979687de6f7ddab5993f68a6e100c50c7 100644 (file)
@@ -79,3 +79,11 @@ virLXCDomainGetMachineName(virDomainDef *def, pid_t pid);
 int
 virLXCDomainSetRunlevel(virDomainObj *vm,
                         int runlevel);
+
+void
+virLXCAssignDeviceNetAlias(virDomainDef *def,
+                           virDomainNetDef *net);
+
+void
+virLXCAssignDeviceFSAlias(virDomainDef *def,
+                          virDomainFSDef *fs);
index b59c080da908cc11536094968711dc2f498f42c7..5be087de922ad92231bacd62dae70c13ed570c56 100644 (file)
@@ -3502,6 +3502,9 @@ lxcDomainAttachDeviceNetLive(virLXCDriver *driver,
     if (virDomainActualNetDefValidate(net) < 0)
         return -1;
 
+    /* Assign alias to the new network interface */
+    virLXCAssignDeviceNetAlias(vm->def, net);
+
     actualType = virDomainNetGetActualType(net);
 
     switch (actualType) {
index cac49af6e2b2aae5a43b02b43ceb0c917a5d13a7..466ce07afd036d43396af7c435c75fd079db1c75 100644 (file)
@@ -1349,6 +1349,14 @@ int virLXCProcessStart(virLXCDriver * driver,
         vm->def->consoles[i]->info.alias = g_strdup_printf("console%zu", i);
     }
 
+    VIR_DEBUG("Setting up filesystem aliases");
+    for (i = 0; i < vm->def->nfss; i++)
+        virLXCAssignDeviceFSAlias(vm->def, vm->def->fss[i]);
+
+    VIR_DEBUG("Setting up network interface aliases");
+    for (i = 0; i < vm->def->nnets; i++)
+        virLXCAssignDeviceNetAlias(vm->def, vm->def->nets[i]);
+
     VIR_DEBUG("Setting up Interfaces");
     if (virLXCProcessSetupInterfaces(driver, vm->def, &veths) < 0)
         goto cleanup;