summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2021-02-09 00:43:13 +0100
committerZdenek Kabelac <zkabelac@redhat.com>2021-02-09 00:49:14 +0100
commit427121efc76f1a11df5d06c11ea4f095305b6333 (patch)
treecaa2f12b5e07bc2acca834cf9777194f66b95f9a
parentef2e0d3d680829ad4f4253787cd7a0db0c4597d6 (diff)
downloadlvm2-427121efc76f1a11df5d06c11ea4f095305b6333.tar.gz
dev-type: sysfs attrs without sectors
Split function for reading attrs in sectors.
-rw-r--r--lib/device/dev-type.c56
1 files changed, 36 insertions, 20 deletions
diff --git a/lib/device/dev-type.c b/lib/device/dev-type.c
index 11add4b6b..b7bca361f 100644
--- a/lib/device/dev-type.c
+++ b/lib/device/dev-type.c
@@ -936,17 +936,16 @@ static int _snprintf_attr(char *buf, size_t buf_size, const char *sysfs_dir,
return 1;
}
-static unsigned long _dev_topology_attribute(struct dev_types *dt,
- const char *attribute,
- struct device *dev,
- unsigned long default_value)
+static int _dev_sysfs_block_attribute(struct dev_types *dt,
+ const char *attribute,
+ struct device *dev,
+ unsigned long *value)
{
const char *sysfs_dir = dm_sysfs_dir();
char path[PATH_MAX], buffer[64];
FILE *fp;
dev_t primary = 0;
- unsigned long result = default_value;
- unsigned long value = 0UL;
+ int ret = 0;
if (!attribute || !*attribute)
goto_out;
@@ -955,7 +954,7 @@ static unsigned long _dev_topology_attribute(struct dev_types *dt,
goto_out;
if (!_snprintf_attr(path, sizeof(path), sysfs_dir, attribute, dev->dev))
- goto_out;
+ goto_out;
/*
* check if the desired sysfs attribute exists
@@ -986,27 +985,42 @@ static unsigned long _dev_topology_attribute(struct dev_types *dt,
goto out_close;
}
- if (sscanf(buffer, "%lu", &value) != 1) {
+ if (sscanf(buffer, "%lu", value) != 1) {
log_warn("WARNING: sysfs file %s not in expected format: %s", path, buffer);
goto out_close;
}
- log_very_verbose("Device %s: %s is %lu%s.",
- dev_name(dev), attribute, value, default_value ? "" : " bytes");
-
- result = value >> SECTOR_SHIFT;
-
- if (!result && value) {
- log_warn("WARNING: Device %s: %s is %lu and is unexpectedly less than sector.",
- dev_name(dev), attribute, value);
- result = 1;
- }
+ ret = 1;
out_close:
if (fclose(fp))
log_sys_debug("fclose", path);
out:
+ return ret;
+}
+
+static unsigned long _dev_topology_attribute(struct dev_types *dt,
+ const char *attribute,
+ struct device *dev,
+ unsigned long default_value)
+{
+ unsigned long result = default_value;
+ unsigned long value = 0UL;
+
+ if (_dev_sysfs_block_attribute(dt, attribute, dev, &value)) {
+ log_very_verbose("Device %s: %s is %lu%s.",
+ dev_name(dev), attribute, value, default_value ? "" : " bytes");
+
+ result = value >> SECTOR_SHIFT;
+
+ if (!result && value) {
+ log_warn("WARNING: Device %s: %s is %lu and is unexpectedly less than sector.",
+ dev_name(dev), attribute, value);
+ result = 1;
+ }
+ }
+
return result;
}
@@ -1037,13 +1051,15 @@ unsigned long dev_discard_granularity(struct dev_types *dt, struct device *dev)
int dev_is_rotational(struct dev_types *dt, struct device *dev)
{
- return (int) _dev_topology_attribute(dt, "queue/rotational", dev, 1UL);
+ unsigned long value;
+ return _dev_sysfs_block_attribute(dt, "queue/rotational", dev, &value) ? (int) value : 1;
}
/* dev is pmem if /sys/dev/block/<major>:<minor>/queue/dax is 1 */
int dev_is_pmem(struct dev_types *dt, struct device *dev)
{
- return (int) _dev_topology_attribute(dt, "queue/dax", dev, 0UL);
+ unsigned long value;
+ return _dev_sysfs_block_attribute(dt, "queue/dax", dev, &value) ? (int) value : 0;
}
#else