]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
common/blkdev: add get_raw_devices helper
authorSage Weil <sage@redhat.com>
Fri, 21 Dec 2018 17:20:34 +0000 (11:20 -0600)
committerSage Weil <sage@redhat.com>
Fri, 4 Jan 2019 00:10:26 +0000 (18:10 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/common/blkdev.cc
src/common/blkdev.h

index be5a223419a236374c84b4914a80ef70b1a011de..f55ddbd3b443dbec90fb0efaaadc907d9b86c3de 100644 (file)
@@ -310,6 +310,28 @@ void get_dm_parents(const std::string& dev, std::set<std::string> *ls)
   }
 }
 
+void get_raw_devices(const std::string& in,
+                    std::set<std::string> *ls)
+{
+  if (in.substr(0, 3) == "dm-") {
+    std::set<std::string> o;
+    get_dm_parents(in, &o);
+    for (auto& d : o) {
+      get_raw_devices(d, ls);
+    }
+  } else {
+    BlkDev d(in);
+    std::string wholedisk;
+    if (d.wholedisk(&wholedisk) == 0) {
+      std::cout << " wholedisk of " << in << " is " << wholedisk << std::endl;
+      ls->insert(wholedisk);
+    } else {
+      std::cout << " wholedisk of " << in << " failed" << std::endl;
+      ls->insert(in);
+    }
+  }
+}
+
 int _get_vdo_stats_handle(const char *devname, std::string *vdo_name)
 {
   int vdo_fd = -1;
@@ -641,6 +663,11 @@ void get_dm_parents(const std::string& dev, std::set<std::string> *ls)
 {
 }
 
+void get_raw_devices(const std::string& in,
+                    std::set<std::string> *ls)
+{
+}
+
 int get_vdo_stats_handle(const char *devname, std::string *vdo_name)
 {
   return -1;
@@ -791,6 +818,11 @@ void get_dm_parents(const std::string& dev, std::set<std::string> *ls)
 {
 }
 
+void get_raw_devices(const std::string& in,
+                    std::set<std::string> *ls)
+{
+}
+
 int get_vdo_stats_handle(const char *devname, std::string *vdo_name)
 {
   return -1;
@@ -922,6 +954,11 @@ void get_dm_parents(const std::string& dev, std::set<std::string> *ls)
 {
 }
 
+void get_raw_devices(const std::string& in,
+                    std::set<std::string> *ls)
+{
+}
+
 int get_vdo_stats_handle(const char *devname, std::string *vdo_name)
 {
   return -1;
index e32d806195692f4b8f5fdb1df6b242f29e8f457f..7dc3e422fc3c6bbb40ddc41e8061f17b1f5d5889 100644 (file)
@@ -29,6 +29,11 @@ extern int block_device_run_smartctl(const char *device, int timeout,
 extern int block_device_get_metrics(const char *device, int timeout,
                                    json_spirit::mValue *result);
 
+// do everything to translate a device to the raw physical devices that
+// back it, including partitions -> wholedisks and dm -> constituent devices.
+extern void get_raw_devices(const std::string& in,
+                           std::set<std::string> *ls);
+
 // for VDO
 /// return an op fd for the sysfs stats dir, if this is a VDO device
 extern int get_vdo_stats_handle(const char *devname, std::string *vdo_name);
@@ -59,6 +64,15 @@ public:
   /* virtual for testing purposes */
   virtual const char *sysfsdir() const;
   virtual int wholedisk(char* device, size_t max) const;
+  int wholedisk(std::string *s) const {
+    char out[PATH_MAX] = {0};
+    int r = wholedisk(out, sizeof(out));
+    if (r < 0) {
+      return r;
+    }
+    *s = out;
+    return r;
+  }
 
 protected:
   int64_t get_int_property(blkdev_prop_t prop) const;