lib/sysfs: Fix /dev to /sys node name translation

d0dc6c1 introduced translation of /sys names to /dev names, as required
by the kernel linux/drivers/base/core.c: device_get_devnode(). But there
are other places of code that use /dev names in /sys. They need reverse
translation from '/' to '!'.

For example, fdisk -l returns empty list since a22c6eb for device nodes
in subdirectories (used e. g. by cciss driver).

Introduce yet another helper sysfs_dev_name_to_devname() and use it where
appropriate.

Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
This commit is contained in:
Stanislav Brabec 2015-05-27 15:12:08 +02:00 committed by Karel Zak
parent 97c68d4204
commit 759b120d85
2 changed files with 25 additions and 3 deletions

View File

@ -98,7 +98,7 @@ extern int sysfs_scsi_path_contains(struct sysfs_cxt *cxt, const char *pattern);
* Linux kernel linux/drivers/base/core.c: device_get_devnode()
* defines a replacement of '!' in the /sys device name by '/' in the
* /dev device name. This helper replaces all ocurrences of '!' in
* @name by '/'.
* @name by '/' to convert from /sys to /dev.
*/
static inline void sysfs_devname_to_dev_name (char *name)
{
@ -109,4 +109,22 @@ static inline void sysfs_devname_to_dev_name (char *name)
c[0] = '/';
}
/**
* sysfs_dev_name_to_devname:
* @name: devname to be converted in place
*
* Linux kernel linux/drivers/base/core.c: device_get_devnode()
* defines a replacement of '!' in the /sys device name by '/' in the
* /dev device name. This helper replaces all ocurrences of '/' in
* @name by '!' to convert from /dev to /sys.
*/
static inline void sysfs_dev_name_to_devname (char *name)
{
char *c;
if (name)
while ((c = strchr(name, '/')))
c[0] = '!';
}
#endif /* UTIL_LINUX_SYSFS_H */

View File

@ -74,10 +74,14 @@ dev_t sysfs_devname_to_devno(const char *name, const char *parent)
} else if (!dev) {
/*
* Create path to /sys/block/<name>/dev
* Create path to /sys/block/<sysname>/dev
*/
char sysname[PATH_MAX];
strncpy(sysname, name, sizeof(sysname));
sysfs_dev_name_to_devname(sysname);
int len = snprintf(buf, sizeof(buf),
_PATH_SYS_BLOCK "/%s/dev", name);
_PATH_SYS_BLOCK "/%s/dev", sysname);
if (len < 0 || (size_t) len + 1 > sizeof(buf))
return 0;
path = buf;