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 sincea22c6eb
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:
parent
97c68d4204
commit
759b120d85
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue