mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
sysfs: sysfs_add_one WARNs with full path to duplicate filename
sysfs: sysfs_add_one WARNs with full path to duplicate filename As a debugging aid, it can be useful to know the full path to a duplicate file being created in sysfs. We now will display warnings such as: sysfs: cannot create duplicate filename '/foo' when attempting to create multiple files named 'foo' in the sysfs root, or: sysfs: cannot create duplicate filename '/bus/pci/slots/5/foo' when attempting to create multiple files named 'foo' under a given directory in sysfs. The path displayed is always a relative path to sysfs_root. The leading '/' in the path name refers to the sysfs_root mount point, and should not be confused with the "real" '/'. Thanks to Alex Williamson for essentially writing sysfs_pathname. Cc: Alex Williamson <alex.williamson@hp.com> Signed-off-by: Alex Chiang <achiang@hp.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
f48f3febb2
commit
425cb02912
1 changed files with 30 additions and 2 deletions
|
@ -433,6 +433,26 @@ int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* sysfs_pathname - return full path to sysfs dirent
|
||||
* @sd: sysfs_dirent whose path we want
|
||||
* @path: caller allocated buffer
|
||||
*
|
||||
* Gives the name "/" to the sysfs_root entry; any path returned
|
||||
* is relative to wherever sysfs is mounted.
|
||||
*
|
||||
* XXX: does no error checking on @path size
|
||||
*/
|
||||
static char *sysfs_pathname(struct sysfs_dirent *sd, char *path)
|
||||
{
|
||||
if (sd->s_parent) {
|
||||
sysfs_pathname(sd->s_parent, path);
|
||||
strcat(path, "/");
|
||||
}
|
||||
strcat(path, sd->s_name);
|
||||
return path;
|
||||
}
|
||||
|
||||
/**
|
||||
* sysfs_add_one - add sysfs_dirent to parent
|
||||
* @acxt: addrm context to use
|
||||
|
@ -458,8 +478,16 @@ int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
|
|||
int ret;
|
||||
|
||||
ret = __sysfs_add_one(acxt, sd);
|
||||
WARN(ret == -EEXIST, KERN_WARNING "sysfs: duplicate filename '%s' "
|
||||
"can not be created\n", sd->s_name);
|
||||
if (ret == -EEXIST) {
|
||||
char *path = kzalloc(PATH_MAX, GFP_KERNEL);
|
||||
WARN(1, KERN_WARNING
|
||||
"sysfs: cannot create duplicate filename '%s'\n",
|
||||
(path == NULL) ? sd->s_name :
|
||||
strcat(strcat(sysfs_pathname(acxt->parent_sd, path), "/"),
|
||||
sd->s_name));
|
||||
kfree(path);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue