diff options
| author | Manuel Bentele | 2020-12-02 13:08:58 +0100 |
|---|---|---|
| committer | Manuel Bentele | 2020-12-02 13:08:58 +0100 |
| commit | 9fc030ed9bffec9f9715595dd5a205a353912d3c (patch) | |
| tree | 8137142e94abf7cd4eefd3b591c487d034b57e50 /src/utils/lib/sysfs.c | |
| parent | Setup xloop device with XLOOP_CONFIGURE ioctl call (diff) | |
| download | xloop-9fc030ed9bffec9f9715595dd5a205a353912d3c.tar.gz xloop-9fc030ed9bffec9f9715595dd5a205a353912d3c.tar.xz xloop-9fc030ed9bffec9f9715595dd5a205a353912d3c.zip | |
Update xlosetup's 'lib' and 'libsmartcol' from util-linux 2.36.1
Diffstat (limited to 'src/utils/lib/sysfs.c')
| -rw-r--r-- | src/utils/lib/sysfs.c | 34 |
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; } |
