]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
common/blkdev: use ID_MODEL + _ + ID_SERIAL_SHORT for device_id
authorJan Fajerski <jfajerski@suse.com>
Wed, 21 Nov 2018 12:14:25 +0000 (13:14 +0100)
committerJan Fajerski <jfajerski@suse.com>
Wed, 21 Nov 2018 12:53:39 +0000 (13:53 +0100)
This is hopefully more stable then using ID_SERIAL. While often
ID_SERIAL contains the model name and serial, in some cases it only
contains something close to the actual serial number.

Signed-off-by: Jan Fajerski <jfajerski@suse.com>
src/common/blkdev.cc

index 8ddffda55f0fcae70931c16a3cd0e1fa5b890052..9af1866ac39f9c3b25fc1e3e484f40114a08d4ca 100644 (file)
@@ -397,6 +397,7 @@ std::string get_device_id(const std::string& devname)
   struct udev_device *dev;
   static struct udev *udev;
   const char *data;
+  std::string device_model;
   std::string device_id;
 
   udev = udev_new();
@@ -409,9 +410,14 @@ std::string get_device_id(const std::string& devname)
     return {};
   }
 
+  data = udev_device_get_property_value(dev, "ID_MODEL");
+  if (data) {
+    device_model = data;
+  }
+
   // "ID_SERIAL_SHORT" returns only the serial number;
-  // "ID_SERIAL" returns vendor model_serial.
-  data = udev_device_get_property_value(dev, "ID_SERIAL");
+  // "ID_SERIAL" returns vendor model_serial but can be unreliable and return.
+  data = udev_device_get_property_value(dev, "ID_SERIAL_SHORT");
   if (data) {
     device_id = data;
   }
@@ -419,9 +425,10 @@ std::string get_device_id(const std::string& devname)
   udev_device_unref(dev);
   udev_unref(udev);
 
-  if (!device_id.empty()) {
+  if (!device_id.empty() and !device_model.empty()) {
+    std::replace(device_model.begin(), device_model.end(), ' ', '_');
     std::replace(device_id.begin(), device_id.end(), ' ', '_');
-    return device_id;
+    return device_model + '_' + device_id;
   }
 
   // either udev_device_get_property_value() failed, or succeeded but