From 7cd89b3158fa3e1d47837d5aff0fa85a68c5c324 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 21 Feb 2018 15:10:04 -0600 Subject: [PATCH] common/blkdev: identify VDO devices beneath LVM Signed-off-by: Sage Weil --- src/common/blkdev.cc | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/common/blkdev.cc b/src/common/blkdev.cc index 3d3f1e30705c..e88c9e69c105 100644 --- a/src/common/blkdev.cc +++ b/src/common/blkdev.cc @@ -20,11 +20,13 @@ #include "include/uuid.h" #include "blkdev.h" - #ifdef __linux__ #include #include +#include + + #define UUID_LEN 36 static const char *sandbox_dir = ""; @@ -300,7 +302,7 @@ void get_dm_parents(const std::string& dev, std::set *ls) } } -int get_vdo_stats_handle(const char *devname, std::string *vdo_name) +int _get_vdo_stats_handle(const char *devname, std::string *vdo_name) { int vdo_fd = -1; @@ -323,7 +325,7 @@ int get_vdo_stats_handle(const char *devname, std::string *vdo_name) target[r] = 0; if (expect == target) { snprintf(fn, sizeof(fn), "/sys/kvdo/%s/statistics", de->d_name); - vdo_fd = ::open(fn, O_DIRECTORY); + vdo_fd = ::open(fn, O_RDONLY); //DIRECTORY); if (vdo_fd >= 0) { *vdo_name = de->d_name; break; @@ -334,6 +336,25 @@ int get_vdo_stats_handle(const char *devname, std::string *vdo_name) return vdo_fd; } +int get_vdo_stats_handle(const char *devname, std::string *vdo_name) +{ + std::set devs = { devname }; + while (!devs.empty()) { + std::string dev = *devs.begin(); + devs.erase(devs.begin()); + int fd = _get_vdo_stats_handle(dev.c_str(), vdo_name); + if (fd >= 0) { + // yay, it's vdo + return fd; + } + // ok, see if there are constituent devices + if (dev.find("dm-") == 0) { + get_dm_parents(dev, &devs); + } + } + return -1; +} + int64_t get_vdo_stat(int vdo_fd, const char *property) { int64_t ret = 0; -- 2.47.3