summaryrefslogtreecommitdiffstats
path: root/src/utils/lib/sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/lib/sysfs.c')
-rw-r--r--src/utils/lib/sysfs.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/utils/lib/sysfs.c b/src/utils/lib/sysfs.c
index 5b4de2c..3b75a23 100644
--- a/src/utils/lib/sysfs.c
+++ b/src/utils/lib/sysfs.c
@@ -874,7 +874,7 @@ int sysfs_devname_is_hidden(const char *prefix, const char *name)
dev_t __sysfs_devname_to_devno(const char *prefix, const char *name, const char *parent)
{
char buf[PATH_MAX];
- char *_name = NULL; /* name as encoded in sysfs */
+ char *_name = NULL, *_parent = NULL; /* name as encoded in sysfs */
dev_t dev = 0;
int len;
@@ -901,21 +901,20 @@ dev_t __sysfs_devname_to_devno(const char *prefix, const char *name, const char
goto done;
sysfs_devname_dev_to_sys(_name);
+ if (parent) {
+ _parent = strdup(parent);
+ if (!_parent)
+ goto done;
+ }
+
if (parent && strncmp("dm-", name, 3) != 0) {
/*
* Create path to /sys/block/<parent>/<name>/dev
*/
- char *_parent = strdup(parent);
-
- if (!_parent) {
- free(_parent);
- goto done;
- }
sysfs_devname_dev_to_sys(_parent);
len = snprintf(buf, sizeof(buf),
"%s" _PATH_SYS_BLOCK "/%s/%s/dev",
prefix, _parent, _name);
- free(_parent);
if (len < 0 || (size_t) len >= sizeof(buf))
goto done;
@@ -934,10 +933,22 @@ dev_t __sysfs_devname_to_devno(const char *prefix, const char *name, const char
goto done;
dev = read_devno(buf);
+ /*
+ * Read from /sys/block/<parent>/<partition>/dev
+ */
+ if (!dev && parent && startswith(name, parent)) {
+ len = snprintf(buf, sizeof(buf),
+ "%s" _PATH_SYS_BLOCK "/%s/%s/dev",
+ prefix, _parent, _name);
+ if (len < 0 || (size_t) len >= sizeof(buf))
+ goto done;
+ dev = read_devno(buf);
+ }
+
+ /*
+ * Read from /sys/block/<sysname>/device/dev
+ */
if (!dev) {
- /*
- * Read from /sys/block/<sysname>/device/dev
- */
len = snprintf(buf, sizeof(buf),
"%s" _PATH_SYS_BLOCK "/%s/device/dev",
prefix, _name);
@@ -947,6 +958,7 @@ dev_t __sysfs_devname_to_devno(const char *prefix, const char *name, const char
}
done:
free(_name);
+ free(_parent);
return dev;
}