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()
|
* Linux kernel linux/drivers/base/core.c: device_get_devnode()
|
||||||
* defines a replacement of '!' in the /sys device name by '/' in the
|
* defines a replacement of '!' in the /sys device name by '/' in the
|
||||||
* /dev device name. This helper replaces all ocurrences of '!' in
|
* /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)
|
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] = '/';
|
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 */
|
#endif /* UTIL_LINUX_SYSFS_H */
|
||||||
|
|
|
@ -74,10 +74,14 @@ dev_t sysfs_devname_to_devno(const char *name, const char *parent)
|
||||||
|
|
||||||
} else if (!dev) {
|
} 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),
|
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))
|
if (len < 0 || (size_t) len + 1 > sizeof(buf))
|
||||||
return 0;
|
return 0;
|
||||||
path = buf;
|
path = buf;
|
||||||
|
|
Loading…
Reference in New Issue