From cec2a2910fe49ca792eb0228fd84c65dd82ac6c3 Mon Sep 17 00:00:00 2001 From: Kadin Sayani Date: Wed, 30 Oct 2024 05:54:17 -0600 Subject: [PATCH] lxd/device: Add support for discovering multiple unix hotplug devices Signed-off-by: Kadin Sayani --- lxd/device/unix_hotplug.go | 45 ++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/lxd/device/unix_hotplug.go b/lxd/device/unix_hotplug.go index fdd259879028..8741e2474682 100644 --- a/lxd/device/unix_hotplug.go +++ b/lxd/device/unix_hotplug.go @@ -149,29 +149,31 @@ func (d *unixHotplug) Start() (*deviceConfig.RunConfig, error) { runConf := deviceConfig.RunConfig{} runConf.PostHooks = []func() error{d.Register} - device := d.loadUnixDevice() - if d.isRequired() && device == nil { + devices := d.loadUnixDevices() + if d.isRequired() && devices == nil { return nil, fmt.Errorf("Required Unix Hotplug device not found") } - if device == nil { + if devices == nil { return &runConf, nil } - devnum := device.Devnum() - major := uint32(devnum.Major()) - minor := uint32(devnum.Minor()) - - // setup device - var err error - if device.Subsystem() == "block" { - err = unixDeviceSetupBlockNum(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, major, minor, device.Devnode(), false, &runConf) - } else { - err = unixDeviceSetupCharNum(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, major, minor, device.Devnode(), false, &runConf) - } + for _, device := range devices { + devnum := device.Devnum() + major := uint32(devnum.Major()) + minor := uint32(devnum.Minor()) + + // setup device + var err error + if device.Subsystem() == "block" { + err = unixDeviceSetupBlockNum(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, major, minor, device.Devnode(), false, &runConf) + } else { + err = unixDeviceSetupCharNum(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, major, minor, device.Devnode(), false, &runConf) + } - if err != nil { - return nil, err + if err != nil { + return nil, err + } } return &runConf, nil @@ -203,9 +205,9 @@ func (d *unixHotplug) postStop() error { return nil } -// loadUnixDevice scans the host machine for unix devices with matching product/vendor ids -// and returns the first matching device with the subsystem type char or block. -func (d *unixHotplug) loadUnixDevice() *udev.Device { +// loadUnixDevices scans the host machine for unix devices with matching product/vendor ids +// and returns the matching devices with subsystem types of char or block. +func (d *unixHotplug) loadUnixDevices() []*udev.Device { // Find device if exists u := udev.Udev{} e := u.NewEnumerate() @@ -230,6 +232,7 @@ func (d *unixHotplug) loadUnixDevice() *udev.Device { } devices, _ := e.Devices() + var matchingDevices []*udev.Device var device *udev.Device for i := range devices { device = devices[i] @@ -248,9 +251,9 @@ func (d *unixHotplug) loadUnixDevice() *udev.Device { } if !strings.HasPrefix(device.Subsystem(), "usb") { - return device + matchingDevices = append(matchingDevices, device) } } - return nil + return matchingDevices }