diff options
author | Alex Chiang <achiang@hp.com> | 2009-02-12 12:56:59 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-03-24 19:38:25 -0400 |
commit | 425cb02912d1095febfeaf8d379af7b2ac9e4a89 (patch) | |
tree | d7cbd6309c280714a3dc45d968129128d649be22 | |
parent | f48f3febb2cbfd0f2ecee7690835ba745c1034a4 (diff) |
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>
-rw-r--r-- | fs/sysfs/dir.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 82d3b79d0e08..f13d852ab3c1 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
@@ -434,6 +434,26 @@ int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) | |||
434 | } | 434 | } |
435 | 435 | ||
436 | /** | 436 | /** |
437 | * sysfs_pathname - return full path to sysfs dirent | ||
438 | * @sd: sysfs_dirent whose path we want | ||
439 | * @path: caller allocated buffer | ||
440 | * | ||
441 | * Gives the name "/" to the sysfs_root entry; any path returned | ||
442 | * is relative to wherever sysfs is mounted. | ||
443 | * | ||
444 | * XXX: does no error checking on @path size | ||
445 | */ | ||
446 | static char *sysfs_pathname(struct sysfs_dirent *sd, char *path) | ||
447 | { | ||
448 | if (sd->s_parent) { | ||
449 | sysfs_pathname(sd->s_parent, path); | ||
450 | strcat(path, "/"); | ||
451 | } | ||
452 | strcat(path, sd->s_name); | ||
453 | return path; | ||
454 | } | ||
455 | |||
456 | /** | ||
437 | * sysfs_add_one - add sysfs_dirent to parent | 457 | * sysfs_add_one - add sysfs_dirent to parent |
438 | * @acxt: addrm context to use | 458 | * @acxt: addrm context to use |
439 | * @sd: sysfs_dirent to be added | 459 | * @sd: sysfs_dirent to be added |
@@ -458,8 +478,16 @@ int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) | |||
458 | int ret; | 478 | int ret; |
459 | 479 | ||
460 | ret = __sysfs_add_one(acxt, sd); | 480 | ret = __sysfs_add_one(acxt, sd); |
461 | WARN(ret == -EEXIST, KERN_WARNING "sysfs: duplicate filename '%s' " | 481 | if (ret == -EEXIST) { |
462 | "can not be created\n", sd->s_name); | 482 | char *path = kzalloc(PATH_MAX, GFP_KERNEL); |
483 | WARN(1, KERN_WARNING | ||
484 | "sysfs: cannot create duplicate filename '%s'\n", | ||
485 | (path == NULL) ? sd->s_name : | ||
486 | strcat(strcat(sysfs_pathname(acxt->parent_sd, path), "/"), | ||
487 | sd->s_name)); | ||
488 | kfree(path); | ||
489 | } | ||
490 | |||
463 | return ret; | 491 | return ret; |
464 | } | 492 | } |
465 | 493 | ||