* return 0 on success
* return negative error on error
*/
-int64_t get_block_device_string_property(const char *devname,
+static int64_t get_block_device_string_property(const char *devname,
blkdev_prop_t prop,
char *val, size_t maxlen)
{
* return the value (we assume it is positive)
* return negative error on error
*/
-int64_t get_block_device_int_property(const char *devname, blkdev_prop_t prop)
+static int64_t get_block_device_int_property(const char *devname, blkdev_prop_t prop)
{
char buff[256] = {0};
int r = get_block_device_string_property(devname, prop, buff, sizeof(buff));
return ioctl(fd, BLKDISCARD, range);
}
+bool block_device_is_nvme(const char *devname)
+{
+ char vendor[80];
+ // nvme has a device/device/vendor property; infer from that. There is
+ // probably a better way?
+ int r = get_block_device_string_property(devname, BLKDEV_PROP_VENDOR, vendor, 80);
+ return (r > 0);
+}
+
bool block_device_is_rotational(const char *devname)
{
return get_block_device_int_property(devname, BLKDEV_PROP_ROTATIONAL) > 0;
return get_block_device_string_property(devname, BLKDEV_PROP_VENDOR, vendor, max);
}
+int block_device_dev(const char *devname, char *dev, size_t max)
+{
+ return get_block_device_string_property(devname, BLKDEV_PROP_DEV, dev, max);
+}
+
int block_device_model(const char *devname, char *model, size_t max)
{
return get_block_device_string_property(devname, BLKDEV_PROP_MODEL, model,
}
int block_device_serial(const char *devname, char *serial, size_t max)
+{
+ return get_block_device_string_property(devname, BLKDEV_PROP_SERIAL, serial,
+ max);
+}
+
+int get_device_by_uuid(uuid_d dev_uuid, const char* label, char* partition,
+ char* device)
{
return get_block_device_string_property(devname, BLKDEV_PROP_SERIAL, serial, max);
}
return -EOPNOTSUPP;
}
+bool block_device_is_nvme(const char *devname)
+{
+ return false;
+}
+
bool block_device_is_rotational(const char *devname)
{
return false;
return -EOPNOTSUPP;
}
+bool block_device_is_nvme(const char *devname)
+{
+ return false;
+}
+
bool block_device_is_rotational(const char *devname)
{
return false;
return -EOPNOTSUPP;
}
+bool block_device_is_nvme(const char *devname)
+{
+ return false;
+}
+
bool block_device_is_rotational(const char *devname)
{
return false;
extern int get_device_by_fd(int fd, char* partition, char* device, size_t max);
// from a device (e.g., "sdb")
-extern int64_t get_block_device_int_property(
- const char *devname, blkdev_prop_t prop);
-extern int64_t get_block_device_string_property(
- const char *devname, blkdev_prop_t prop,
- char *val, size_t maxlen);
extern bool block_device_support_discard(const char *devname);
+extern bool block_device_is_nvme(const char *devname);
extern bool block_device_is_rotational(const char *devname);
extern int block_device_vendor(const char *devname, char *vendor, size_t max);
extern int block_device_model(const char *devname, char *model, size_t max);
extern int get_vdo_stats_handle(const char *devname, std::string *vdo_name);
extern int64_t get_vdo_stat(int fd, const char *property);
extern bool get_vdo_utilization(int fd, uint64_t *total, uint64_t *avail);
+extern int block_device_dev(const char *devname, char *dev, size_t max);
+extern int block_device_model(const char *devname, char *model, size_t max);
+extern int block_device_serial(const char *devname, char *serial, size_t max);
#endif
path.clear();
}
-static string get_dev_property(const char *dev, blkdev_prop_t property)
-{
- char val[1024] = {0};
- get_block_device_string_property(dev, property, val, sizeof(val));
- return val;
-}
-
int KernelDevice::collect_metadata(const string& prefix, map<string,string> *pm) const
{
(*pm)[prefix + "rotational"] = stringify((int)(bool)rotational);
break;
default:
{
+ char buffer[1024] = {0};
(*pm)[prefix + "partition_path"] = string(partition_path);
(*pm)[prefix + "dev_node"] = string(dev_node);
- (*pm)[prefix + "model"] = get_dev_property(dev_node, BLKDEV_PROP_MODEL);
- (*pm)[prefix + "dev"] = get_dev_property(dev_node, BLKDEV_PROP_DEV);
+ block_device_model(dev_node, buffer, sizeof(buffer));
+ (*pm)[prefix + "model"] = buffer;
+
+ buffer[0] = '\0';
+ block_device_dev(dev_node, buffer, sizeof(buffer));
+ (*pm)[prefix + "dev"] = buffer;
+
// nvme exposes a serial number
- string serial = get_dev_property(dev_node, BLKDEV_PROP_SERIAL);
- if (serial.length()) {
- (*pm)[prefix + "serial"] = serial;
- }
+ buffer[0] = '\0';
+ block_device_serial(dev_node, buffer, sizeof(buffer));
+ (*pm)[prefix + "serial"] = buffer;
- // nvme has a device/device/* structure; infer from that. there
- // is probably a better way?
- string nvme_vendor = get_dev_property(dev_node, BLKDEV_PROP_VENDOR);
- if (nvme_vendor.length()) {
+ if (block_device_is_nvme(dev_node)) {
(*pm)[prefix + "type"] = "nvme";
}
}
path.clear();
}
-static string get_dev_property(const char *dev, blkdev_prop_t property)
-{
- char val[1024] = {0};
- get_block_device_string_property(dev, property, val, sizeof(val));
- return val;
-}
-
int PMEMDevice::collect_metadata(const string& prefix, map<string,string> *pm) const
{
(*pm)[prefix + "rotational"] = stringify((int)(bool)rotational);
break;
default:
{
+ char buffer[1024] = {0};
(*pm)[prefix + "partition_path"] = string(partition_path);
(*pm)[prefix + "dev_node"] = string(dev_node);
- (*pm)[prefix + "model"] = get_dev_property(dev_node, BLKDEV_PROP_MODEL);
- (*pm)[prefix + "dev"] = get_dev_property(dev_node, BLKDEV_PROP_DEV);
+ block_device_model(dev_node, buffer, sizeof(buffer));
+ (*pm)[prefix + "model"] = buffer;
+
+ buffer[0] = '\0';
+ block_device_dev(dev_node, buffer, sizeof(buffer));
+ (*pm)[prefix + "dev"] = buffer;
+
// nvme exposes a serial number
- string serial = get_dev_property(dev_node, BLKDEV_PROP_SERIAL);
- if (serial.length()) {
- (*pm)[prefix + "serial"] = serial;
- }
+ buffer[0] = '\0';
+ block_device_serial(dev_node, buffer, sizeof(buffer));
+ (*pm)[prefix + "serial"] = buffer;
- // nvme has a device/device/* structure; infer from that. there
- // is probably a better way?
- string nvme_vendor = get_dev_property(dev_node, BLKDEV_PROP_VENDOR);
- if (nvme_vendor.length()) {
+ if (block_device_nvme(dev_node)) {
(*pm)[prefix + "type"] = "nvme";
}
}
ASSERT_EQ(0, get_block_device_base(base, buf3, sizeof(buf3)));
printf(" got '%s' expected '%s'\n", buf3, de->d_name);
ASSERT_EQ(0, strcmp(de->d_name, buf3));
- printf(" discard granularity = %lld .. supported = %d\n",
- (long long)get_block_device_int_property(base, BLKDEV_PROP_DISCARD_GRANULARITY),
+ printf(" discard supported = %d\n",
(int)block_device_support_discard(base));
char subdirfn[PATH_MAX];
ASSERT_EQ(0, get_block_device_base(part, buf3, sizeof(buf3)));
printf(" got '%s' expected '%s'\n", buf3, de->d_name);
ASSERT_EQ(0, strcmp(buf3, de->d_name));
- printf(" discard granularity = %lld .. supported = %d\n",
- (long long)get_block_device_int_property(part, BLKDEV_PROP_DISCARD_GRANULARITY),
+ printf(" discard supported = %d\n",
(int)block_device_support_discard(part));
}
ASSERT_EQ(strcmp(model, "myfancymodel"), 0);
}
-TEST(blkdev, get_block_device_string_property)
-{
- const char* env = getenv("CEPH_ROOT");
- ASSERT_NE(env, nullptr) << "Environment Variable CEPH_ROOT not found!";
- string root = string(env) + "/src/test/common/test_blkdev_sys_block";
- set_block_device_sandbox_dir(root.c_str());
-
- char val[1000] = {0};
- int rc = get_block_device_string_property("sda", BLKDEV_PROP_MODEL,
- val, sizeof(val));
- ASSERT_EQ(0, rc);
- printf("val '%s'\n", val);
- ASSERT_EQ(strcmp(val, "myfancymodel"), 0);
-}
-
TEST(blkdev, is_rotational)
{
const char* env = getenv("CEPH_ROOT");
ASSERT_FALSE(block_device_is_rotational("sda"));
ASSERT_TRUE(block_device_is_rotational("sdb"));
}
-
-