[lxc-devel] [lxd/master] minor USB fixes
tych0 on Github
lxc-bot at linuxcontainers.org
Thu Aug 25 14:58:54 UTC 2016
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 598 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20160825/60fd7f73/attachment.bin>
-------------- next part --------------
From 9e86e8f6e5cff63f10744f4847f501f623b39320 Mon Sep 17 00:00:00 2001
From: Tycho Andersen <tycho.andersen at canonical.com>
Date: Thu, 25 Aug 2016 10:56:57 -0400
Subject: [PATCH] minor USB fixes
* do a deep copy of the device entry so config doesn't accidentally get
saved in the DB
* remember to remove the bus directory when a USB device goes away
* remove unused param to insertUnixDevice()
Closes #2306
Closes #2312
Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
---
lxd/container_lxc.go | 80 +++++++++++++++++++++++++++++++++++++---------------
lxd/devices.go | 14 ++-------
2 files changed, 59 insertions(+), 35 deletions(-)
diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 67d0068..50a1ec9 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -1130,12 +1130,17 @@ func (c *containerLXC) startCommon() (string, error) {
}
}
- m["major"] = fmt.Sprintf("%d", usb.major)
- m["minor"] = fmt.Sprintf("%d", usb.minor)
- m["path"] = usb.path
+ temp := shared.Device{}
+ if err := shared.DeepCopy(&m, &temp); err != nil {
+ return "", err
+ }
+
+ temp["major"] = fmt.Sprintf("%d", usb.major)
+ temp["minor"] = fmt.Sprintf("%d", usb.minor)
+ temp["path"] = usb.path
/* it's ok to fail, the device might be hot plugged later */
- _, err := c.createUnixDevice(m)
+ _, err := c.createUnixDevice(temp)
if err != nil {
shared.Log.Debug("failed to create usb device", log.Ctx{"err": err, "device": k})
continue
@@ -2516,27 +2521,17 @@ func (c *containerLXC) Update(args containerArgs, userRequested bool) error {
continue
}
- m["major"] = fmt.Sprintf("%d", usb.major)
- m["minor"] = fmt.Sprintf("%d", usb.minor)
- m["path"] = usb.path
-
- err = c.removeUnixDevice(m)
+ err := c.removeUSBDevice(m, usb)
if err != nil {
- shared.Log.Error("failed to remove usb device", log.Ctx{"err": err, "usb": usb, "container": c.Name()})
+ return err
}
-
- /* ok to fail here, there may be other usb
- * devices on this bus still left in the
- * container
- */
- os.Remove(filepath.Dir(usb.path))
}
}
}
for k, m := range addDevices {
if shared.StringInSlice(m["type"], []string{"unix-char", "unix-block"}) {
- err = c.insertUnixDevice(k, m)
+ err = c.insertUnixDevice(m)
if err != nil {
return err
}
@@ -2563,11 +2558,7 @@ func (c *containerLXC) Update(args containerArgs, userRequested bool) error {
continue
}
- m["major"] = fmt.Sprintf("%d", usb.major)
- m["minor"] = fmt.Sprintf("%d", usb.minor)
- m["path"] = usb.path
-
- err = c.insertUnixDevice(k, m)
+ err = c.insertUSBDevice(m, usb)
if err != nil {
shared.Log.Error("failed to insert usb device", log.Ctx{"err": err, "usb": usb, "container": c.Name()})
}
@@ -3788,7 +3779,7 @@ func (c *containerLXC) createUnixDevice(m shared.Device) (string, error) {
return devPath, nil
}
-func (c *containerLXC) insertUnixDevice(name string, m shared.Device) error {
+func (c *containerLXC) insertUnixDevice(m shared.Device) error {
// Check that the container is running
if !c.IsRunning() {
return fmt.Errorf("Can't insert device into stopped container")
@@ -3822,6 +3813,19 @@ func (c *containerLXC) insertUnixDevice(name string, m shared.Device) error {
return nil
}
+func (c *containerLXC) insertUSBDevice(m shared.Device, usb usbDevice) error {
+ temp := shared.Device{}
+ if err := shared.DeepCopy(&m, &temp); err != nil {
+ return err
+ }
+
+ temp["major"] = fmt.Sprintf("%d", usb.major)
+ temp["minor"] = fmt.Sprintf("%d", usb.minor)
+ temp["path"] = usb.path
+
+ return c.insertUnixDevice(temp)
+}
+
func (c *containerLXC) removeUnixDevice(m shared.Device) error {
// Check that the container is running
pid := c.InitPID()
@@ -3876,6 +3880,36 @@ func (c *containerLXC) removeUnixDevice(m shared.Device) error {
return nil
}
+func (c *containerLXC) removeUSBDevice(m shared.Device, usb usbDevice) error {
+ pid := c.InitPID()
+ if pid == -1 {
+ return fmt.Errorf("Can't remove device from stopped container")
+ }
+
+ temp := shared.Device{}
+ if err := shared.DeepCopy(&m, &temp); err != nil {
+ return err
+ }
+
+ temp["major"] = fmt.Sprintf("%d", usb.major)
+ temp["minor"] = fmt.Sprintf("%d", usb.minor)
+ temp["path"] = usb.path
+
+ err := c.removeUnixDevice(temp)
+ if err != nil {
+ shared.Log.Error("failed to remove usb device", log.Ctx{"err": err, "usb": usb, "container": c.Name()})
+ return err
+ }
+
+ /* ok to fail here, there may be other usb
+ * devices on this bus still left in the
+ * container
+ */
+ dir := fmt.Sprintf("/proc/%d/root/%s", pid, filepath.Dir(usb.path))
+ os.Remove(dir)
+ return nil
+}
+
func (c *containerLXC) removeUnixDevices() error {
// Check that we indeed have devices to remove
if !shared.PathExists(c.DevicesPath()) {
diff --git a/lxd/devices.go b/lxd/devices.go
index ab51902..c2d4d78 100644
--- a/lxd/devices.go
+++ b/lxd/devices.go
@@ -491,28 +491,18 @@ func deviceUSBEvent(d *Daemon, usb usbDevice) {
continue
}
- m["major"] = fmt.Sprintf("%d", usb.major)
- m["minor"] = fmt.Sprintf("%d", usb.minor)
- m["path"] = usb.path
-
if usb.action == "add" {
- err := c.insertUnixDevice("unused", m)
+ err := c.insertUSBDevice(m, usb)
if err != nil {
shared.Log.Error("failed to create usb device", log.Ctx{"err": err, "usb": usb, "container": c.Name()})
return
}
} else if usb.action == "remove" {
- err := c.removeUnixDevice(m)
+ err := c.removeUSBDevice(m, usb)
if err != nil {
shared.Log.Error("failed to remove usb device", log.Ctx{"err": err, "usb": usb, "container": c.Name()})
return
}
-
- /* ok to fail here, there may be other usb
- * devices on this bus still left in the
- * container
- */
- os.Remove(filepath.Dir(usb.path))
} else {
shared.Log.Error("unknown action for usb device", log.Ctx{"usb": usb})
continue
More information about the lxc-devel
mailing list