From: Patrick Mochel <mochel@osdl.org>

This is a new patch that includes Martin's, and makes create_dir() return
an int. That matches sysfs_create_file(), and saves a couple of
conversions back and forth between pointer and error. Thoughts? 



 25-akpm/fs/sysfs/dir.c   |   34 ++++++++++++++++------------------
 25-akpm/fs/sysfs/file.c  |    6 +++---
 25-akpm/fs/sysfs/group.c |    6 +++---
 25-akpm/fs/sysfs/sysfs.h |    2 +-
 4 files changed, 23 insertions(+), 25 deletions(-)

diff -puN fs/sysfs/dir.c~sysfs-dput-fix fs/sysfs/dir.c
--- 25/fs/sysfs/dir.c~sysfs-dput-fix	Fri Sep 12 14:01:07 2003
+++ 25-akpm/fs/sysfs/dir.c	Fri Sep 12 14:01:07 2003
@@ -21,32 +21,32 @@ static int init_dir(struct inode * inode
 }
 
 
-static struct dentry * 
-create_dir(struct kobject * k, struct dentry * p, const char * n)
+static int create_dir(struct kobject * k, struct dentry * p,
+		      const char * n, struct dentry ** d)
 {
-	struct dentry * dentry;
+	int error;
 
 	down(&p->d_inode->i_sem);
-	dentry = sysfs_get_dentry(p,n);
-	if (!IS_ERR(dentry)) {
-		int error = sysfs_create(dentry,
+	*d = sysfs_get_dentry(p,n);
+	if (!IS_ERR(*d)) {
+		error = sysfs_create(*d,
 					 S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO,
 					 init_dir);
 		if (!error) {
-			dentry->d_fsdata = k;
+			(*d)->d_fsdata = k;
 			p->d_inode->i_nlink++;
-		} else
-			dentry = ERR_PTR(error);
-		dput(dentry);
-	}
+		}
+		dput(*d);
+	} else
+		error = PTR_ERR(*d);
 	up(&p->d_inode->i_sem);
-	return dentry;
+	return error;
 }
 
 
-struct dentry * sysfs_create_subdir(struct kobject * k, const char * n)
+int sysfs_create_subdir(struct kobject * k, const char * n, struct dentry ** d)
 {
-	return create_dir(k,k->dentry,n);
+	return create_dir(k,k->dentry,n,d);
 }
 
 /**
@@ -71,11 +71,9 @@ int sysfs_create_dir(struct kobject * ko
 	else
 		return -EFAULT;
 
-	dentry = create_dir(kobj,parent,kobject_name(kobj));
-	if (!IS_ERR(dentry))
+	error = create_dir(kobj,parent,kobject_name(kobj),&dentry);
+	if (!error)
 		kobj->dentry = dentry;
-	else
-		error = PTR_ERR(dentry);
 	return error;
 }
 
diff -puN fs/sysfs/file.c~sysfs-dput-fix fs/sysfs/file.c
--- 25/fs/sysfs/file.c~sysfs-dput-fix	Fri Sep 12 14:01:07 2003
+++ 25-akpm/fs/sysfs/file.c	Fri Sep 12 14:01:07 2003
@@ -353,11 +353,11 @@ int sysfs_add_file(struct dentry * dir, 
 	down(&dir->d_inode->i_sem);
 	dentry = sysfs_get_dentry(dir,attr->name);
 	if (!IS_ERR(dentry)) {
-		error = sysfs_create(dentry,(attr->mode & S_IALLUGO) | S_IFREG,init_file);
+		error = sysfs_create(dentry,
+				     (attr->mode & S_IALLUGO) | S_IFREG,
+				     init_file);
 		if (!error)
 			dentry->d_fsdata = (void *)attr;
-		else
-			dentry = ERR_PTR(error);
 		dput(dentry);
 	} else
 		error = PTR_ERR(dentry);
diff -puN fs/sysfs/group.c~sysfs-dput-fix fs/sysfs/group.c
--- 25/fs/sysfs/group.c~sysfs-dput-fix	Fri Sep 12 14:01:07 2003
+++ 25-akpm/fs/sysfs/group.c	Fri Sep 12 14:01:07 2003
@@ -46,9 +46,9 @@ int sysfs_create_group(struct kobject * 
 	int error;
 
 	if (grp->name) {
-		dir = sysfs_create_subdir(kobj,grp->name);
-		if (IS_ERR(dir))
-			return PTR_ERR(dir);
+		error = sysfs_create_subdir(kobj,grp->name,&dir);
+		if (error)
+			return error;
 	} else
 		dir = kobj->dentry;
 	dir = dget(dir);
diff -puN fs/sysfs/sysfs.h~sysfs-dput-fix fs/sysfs/sysfs.h
--- 25/fs/sysfs/sysfs.h~sysfs-dput-fix	Fri Sep 12 14:01:07 2003
+++ 25-akpm/fs/sysfs/sysfs.h	Fri Sep 12 14:01:07 2003
@@ -9,5 +9,5 @@ extern struct dentry * sysfs_get_dentry(
 extern int sysfs_add_file(struct dentry * dir, const struct attribute * attr);
 extern void sysfs_hash_and_remove(struct dentry * dir, const char * name);
 
-extern struct dentry * sysfs_create_subdir(struct kobject *, const char *);
+extern int sysfs_create_subdir(struct kobject *, const char *, struct dentry **);
 extern void sysfs_remove_subdir(struct dentry *);

_