sysfs: sysfs_add_one WARNs with full path to duplicate filename

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Thursday, March 26, 2009 - 12:27 pm

Gitweb:     http://git.kernel.org/linus/425cb02912d1095febfeaf8d379af7b2ac9e4a89
Commit:     425cb02912d1095febfeaf8d379af7b2ac9e4a89
Parent:     f48f3febb2cbfd0f2ecee7690835ba745c1034a4
Author:     Alex Chiang <achiang@hp.com>
AuthorDate: Thu Feb 12 10:56:59 2009 -0700
Committer:  Greg Kroah-Hartman <gregkh@suse.de>
CommitDate: Tue Mar 24 16:38:25 2009 -0700

    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>
---
 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 82d3b79..f13d852 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)
 }
 
 /**
+ *	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
  *	@sd: sysfs_dirent to be added
@@ -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;
 }
 
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
sysfs: sysfs_add_one WARNs with full path to duplicate fil ..., Linux Kernel Mailing ..., (Thu Mar 26, 12:27 pm)