return ret;
}
+std::string get_device_path(const std::string& devname,
+ std::string *err)
+{
+ std::set<std::string> links;
+ int r = easy_readdir("/dev/disk/by-path", &links);
+ if (r < 0) {
+ *err = "unable to list contents of /dev/disk/by-path: "s +
+ cpp_strerror(r);
+ return {};
+ }
+ for (auto& i : links) {
+ char fn[PATH_MAX];
+ char target[PATH_MAX+1];
+ snprintf(fn, sizeof(fn), "/dev/disk/by-path/%s", i.c_str());
+ int r = readlink(fn, target, sizeof(target));
+ if (r < 0 || r >= (int)sizeof(target))
+ continue;
+ target[r] = 0;
+ if ((unsigned)r > devname.size() + 1 &&
+ strncmp(target + r - devname.size(), devname.c_str(), r) == 0 &&
+ target[r - devname.size() - 1] == '/') {
+ return fn;
+ }
+ }
+ *err = "no symlink to "s + devname + " in /dev/disk/by-path";
+ return {};
+}
+
static int block_device_run_smartctl(const string& devname, int timeout,
std::string *result)
{
return std::string();
}
+std::string get_device_path(const std::string& devname,
+ std::string *err)
+{
+ // FIXME: implement me
+ if (err) {
+ *err = "not implemented";
+ }
+ return std::string();
+}
+
#elif defined(__FreeBSD__)
const char *BlkDev::sysfsdir() const {
return std::string();
}
+std::string get_device_path(const std::string& devname,
+ std::string *err)
+{
+ // FIXME: implement me for freebsd
+ if (err) {
+ *err = "not implemented for FreeBSD";
+ }
+ return std::string();
+}
+
int block_device_run_smartctl(const char *device, int timeout,
std::string *result)
{
return std::string();
}
+std::string get_device_path(const std::string& devname,
+ std::string *err)
+{
+ // not implemented
+ if (err) {
+ *err = "not implemented";
+ }
+ return std::string();
+}
+
int block_device_run_smartctl(const char *device, int timeout,
std::string *result)
{
#endif
+
void get_device_metadata(
const std::set<std::string>& devnames,
std::map<std::string,std::string> *pm,
} else {
(*errs)[dev] = " no unique device id for "s + dev + ": " + err;
}
+ string path = get_device_path(dev, &err);
+ if (path.size()) {
+ if (!devpaths.empty()) {
+ devpaths += ",";
+ }
+ devpaths += dev + "=" + path;
+ } else {
+ (*errs)[dev] + " no unique device path for "s + dev + ": " + err;
+ }
}
}
// get $vendor_$model_$serial style device id
extern std::string get_device_id(const std::string& devname,
std::string *err=0);
+
+// get /dev/disk/by-path/... style device id that is stable for a disk slot across reboots etc
+extern std::string get_device_path(const std::string& devname,
+ std::string *err=0);
+
// populate daemon metadata map with device info
extern void get_device_metadata(
const std::set<std::string>& devnames,