[lxc-devel] [lxd/master] Fix handling of major and minor numbers in device IDs

tejeez on Github lxc-bot at linuxcontainers.org
Tue Aug 29 17:04:17 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 529 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170829/5cb99ee6/attachment.bin>
-------------- next part --------------
From 62d951adfc55f210761ceaa8db55478afddda57d Mon Sep 17 00:00:00 2001
From: Tatu Peltola <tatu.peltola at gmail.com>
Date: Tue, 29 Aug 2017 19:32:53 +0300
Subject: [PATCH] Fix handling of major and minor numbers in device IDs

Signed-off-by: Tatu Peltola <tatu.peltola at gmail.com>
---
 lxd/devices.go       | 12 ++++++------
 shared/util_linux.go | 12 ++++++++++--
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/lxd/devices.go b/lxd/devices.go
index 05cbf0f90..a4290c7f7 100644
--- a/lxd/devices.go
+++ b/lxd/devices.go
@@ -243,8 +243,8 @@ func deviceLoadGpu() ([]gpuDevice, []nvidiaGpuDevices, error) {
 					return nil, nil, err
 				}
 				tmpGpu.nvidia.path = nvidiaPath
-				tmpGpu.nvidia.major = int(stat.Rdev / 256)
-				tmpGpu.nvidia.minor = int(stat.Rdev % 256)
+				tmpGpu.nvidia.major = shared.Major(stat.Rdev)
+				tmpGpu.nvidia.minor = shared.Minor(stat.Rdev)
 				tmpGpu.nvidia.id = strconv.Itoa(tmpGpu.nvidia.minor)
 			}
 			gpus = append(gpus, tmpGpu)
@@ -276,8 +276,8 @@ func deviceLoadGpu() ([]gpuDevice, []nvidiaGpuDevices, error) {
 			}
 			tmpNividiaGpu := nvidiaGpuDevices{
 				path:  nvidiaPath,
-				major: int(stat.Rdev / 256),
-				minor: int(stat.Rdev % 256),
+				major: shared.Major(stat.Rdev),
+				minor: shared.Minor(stat.Rdev),
 			}
 			nvidiaDevices = append(nvidiaDevices, tmpNividiaGpu)
 		}
@@ -914,8 +914,8 @@ func deviceGetAttributes(path string) (string, int, int, error) {
 	}
 
 	// Return the device information
-	major := int(stat.Rdev / 256)
-	minor := int(stat.Rdev % 256)
+	major := shared.Major(stat.Rdev)
+	minor := shared.Minor(stat.Rdev)
 	return dType, major, minor, nil
 }
 
diff --git a/shared/util_linux.go b/shared/util_linux.go
index 33747f191..44935a2b7 100644
--- a/shared/util_linux.go
+++ b/shared/util_linux.go
@@ -448,6 +448,14 @@ again:
 
 // --- pure Go functions ---
 
+func Major(dev uint64) int {
+	return int(((dev >> 8) & 0xfff) | ((dev >> 32) & (0xfffff000)))
+}
+
+func Minor(dev uint64) int {
+	return int((dev & 0xff) | ((dev >> 12) & (0xfff00)))
+}
+
 func GetFileStat(p string) (uid int, gid int, major int, minor int,
 	inode uint64, nlink int, err error) {
 	var stat syscall.Stat_t
@@ -462,8 +470,8 @@ func GetFileStat(p string) (uid int, gid int, major int, minor int,
 	major = -1
 	minor = -1
 	if stat.Mode&syscall.S_IFBLK != 0 || stat.Mode&syscall.S_IFCHR != 0 {
-		major = int(stat.Rdev / 256)
-		minor = int(stat.Rdev % 256)
+		major = Major(stat.Rdev)
+		minor = Minor(stat.Rdev)
 	}
 
 	return


More information about the lxc-devel mailing list