<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From maneesh@in.ibm.com Mon May 30 22:24:58 2005
Date: Tue, 31 May 2005 10:38:12 +0530
From: Maneesh Soni &lt;maneesh@in.ibm.com&gt;
To: greg@kroah.com
Cc: Al Viro &lt;viro@parcelfarce.linux.theplanet.co.uk&gt;,
        Kay Sievers &lt;kay.sievers@vrfy.org&gt;, Jon Smirl &lt;jonsmirl@gmail.com&gt;
Subject: sysfs-iattr: attach sysfs_dirent before new inode
Message-ID: &lt;20050531050812.GB3631@in.ibm.com&gt;

o The following patch makes sure to attach sysfs_dirent to the dentry before
  allocation a new inode through sysfs_create(). This change is done as
  preparatory work for implementing -&gt;i_op-&gt;setattr() functionality for
  sysfs objects.

Signed-off-by: Maneesh Soni &lt;maneesh@in.ibm.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

---
 fs/sysfs/dir.c |   25 +++++++++++++++----------
 1 files changed, 15 insertions(+), 10 deletions(-)

--- gregkh-2.6.orig/fs/sysfs/dir.c	2005-03-01 23:38:07.000000000 -0800
+++ gregkh-2.6/fs/sysfs/dir.c	2005-06-01 13:33:14.000000000 -0700
@@ -101,18 +101,19 @@
 	down(&amp;p-&gt;d_inode-&gt;i_sem);
 	*d = sysfs_get_dentry(p,n);
 	if (!IS_ERR(*d)) {
-		error = sysfs_create(*d, mode, init_dir);
+		error = sysfs_make_dirent(p-&gt;d_fsdata, *d, k, mode, SYSFS_DIR);
 		if (!error) {
-			error = sysfs_make_dirent(p-&gt;d_fsdata, *d, k, mode,
-						SYSFS_DIR);
+			error = sysfs_create(*d, mode, init_dir);
 			if (!error) {
 				p-&gt;d_inode-&gt;i_nlink++;
 				(*d)-&gt;d_op = &amp;sysfs_dentry_ops;
 				d_rehash(*d);
 			}
 		}
-		if (error &amp;&amp; (error != -EEXIST))
+		if (error &amp;&amp; (error != -EEXIST)) {
+			sysfs_put((*d)-&gt;d_fsdata);
 			d_drop(*d);
+		}
 		dput(*d);
 	} else
 		error = PTR_ERR(*d);
@@ -171,17 +172,19 @@
                 init = init_file;
         }
 
+	dentry-&gt;d_fsdata = sysfs_get(sd);
+	sd-&gt;s_dentry = dentry;
 	error = sysfs_create(dentry, (attr-&gt;mode &amp; S_IALLUGO) | S_IFREG, init);
-	if (error)
+	if (error) {
+		sysfs_put(sd);
 		return error;
+	}
 
         if (bin_attr) {
 		dentry-&gt;d_inode-&gt;i_size = bin_attr-&gt;size;
 		dentry-&gt;d_inode-&gt;i_fop = &amp;bin_fops;
 	}
 	dentry-&gt;d_op = &amp;sysfs_dentry_ops;
-	dentry-&gt;d_fsdata = sysfs_get(sd);
-	sd-&gt;s_dentry = dentry;
 	d_rehash(dentry);
 
 	return 0;
@@ -191,13 +194,15 @@
 {
 	int err = 0;
 
+	dentry-&gt;d_fsdata = sysfs_get(sd);
+	sd-&gt;s_dentry = dentry;
 	err = sysfs_create(dentry, S_IFLNK|S_IRWXUGO, init_symlink);
 	if (!err) {
 		dentry-&gt;d_op = &amp;sysfs_dentry_ops;
-		dentry-&gt;d_fsdata = sysfs_get(sd);
-		sd-&gt;s_dentry = dentry;
 		d_rehash(dentry);
-	}
+	} else
+		sysfs_put(sd);
+
 	return err;
 }
 
</pre></body></html>