<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:25:09 2005
Date: Tue, 31 May 2005 10:39:52 +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: [patch 3/3] sysfs-iattr: set inode attributes
Message-ID: &lt;20050531050952.GD3631@in.ibm.com&gt;

o Following patch sets the attributes for newly allocated inodes for sysfs
  objects. If the object has non-default attributes, inode attributes are
  set as saved in sysfs_dirent-&gt;s_iattr, pointer to struct iattr.


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

---
 fs/sysfs/inode.c |   37 +++++++++++++++++++++++++++++++------
 fs/sysfs/mount.c |    4 +++-
 fs/sysfs/sysfs.h |    2 +-
 3 files changed, 35 insertions(+), 8 deletions(-)

--- gregkh-2.6.orig/fs/sysfs/inode.c	2005-06-01 13:33:18.000000000 -0700
+++ gregkh-2.6/fs/sysfs/inode.c	2005-06-01 13:33:21.000000000 -0700
@@ -91,18 +91,42 @@
 	return error;
 }
 
-struct inode * sysfs_new_inode(mode_t mode)
+static inline void set_default_inode_attr(struct inode * inode, mode_t mode)
+{
+	inode-&gt;i_mode = mode;
+	inode-&gt;i_uid = 0;
+	inode-&gt;i_gid = 0;
+	inode-&gt;i_atime = inode-&gt;i_mtime = inode-&gt;i_ctime = CURRENT_TIME;
+}
+
+static inline void set_inode_attr(struct inode * inode, struct iattr * iattr)
+{
+	inode-&gt;i_mode = iattr-&gt;ia_mode;
+	inode-&gt;i_uid = iattr-&gt;ia_uid;
+	inode-&gt;i_gid = iattr-&gt;ia_gid;
+	inode-&gt;i_atime = iattr-&gt;ia_atime;
+	inode-&gt;i_mtime = iattr-&gt;ia_mtime;
+	inode-&gt;i_ctime = iattr-&gt;ia_ctime;
+}
+
+struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent * sd)
 {
 	struct inode * inode = new_inode(sysfs_sb);
 	if (inode) {
-		inode-&gt;i_mode = mode;
-		inode-&gt;i_uid = 0;
-		inode-&gt;i_gid = 0;
 		inode-&gt;i_blksize = PAGE_CACHE_SIZE;
 		inode-&gt;i_blocks = 0;
-		inode-&gt;i_atime = inode-&gt;i_mtime = inode-&gt;i_ctime = CURRENT_TIME;
 		inode-&gt;i_mapping-&gt;a_ops = &amp;sysfs_aops;
 		inode-&gt;i_mapping-&gt;backing_dev_info = &amp;sysfs_backing_dev_info;
+		inode-&gt;i_op = &amp;sysfs_inode_operations;
+
+		if (sd-&gt;s_iattr) {
+			/* sysfs_dirent has non-default attributes
+			 * get them for the new inode from persistent copy
+			 * in sysfs_dirent
+			 */
+			set_inode_attr(inode, sd-&gt;s_iattr);
+		} else
+			set_default_inode_attr(inode, mode);
 	}
 	return inode;
 }
@@ -113,7 +137,8 @@
 	struct inode * inode = NULL;
 	if (dentry) {
 		if (!dentry-&gt;d_inode) {
-			if ((inode = sysfs_new_inode(mode))) {
+			struct sysfs_dirent * sd = dentry-&gt;d_fsdata;
+			if ((inode = sysfs_new_inode(mode, sd))) {
 				if (dentry-&gt;d_parent &amp;&amp; dentry-&gt;d_parent-&gt;d_inode) {
 					struct inode *p_inode = dentry-&gt;d_parent-&gt;d_inode;
 					p_inode-&gt;i_mtime = p_inode-&gt;i_ctime = CURRENT_TIME;
--- gregkh-2.6.orig/fs/sysfs/mount.c	2005-05-27 22:50:37.000000000 -0700
+++ gregkh-2.6/fs/sysfs/mount.c	2005-06-01 13:33:21.000000000 -0700
@@ -28,6 +28,7 @@
 	.s_children	= LIST_HEAD_INIT(sysfs_root.s_children),
 	.s_element	= NULL,
 	.s_type		= SYSFS_ROOT,
+	.s_iattr	= NULL,
 };
 
 static int sysfs_fill_super(struct super_block *sb, void *data, int silent)
@@ -42,7 +43,8 @@
 	sb-&gt;s_time_gran = 1;
 	sysfs_sb = sb;
 
-	inode = sysfs_new_inode(S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO);
+	inode = sysfs_new_inode(S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO,
+				 &amp;sysfs_root);
 	if (inode) {
 		inode-&gt;i_op = &amp;sysfs_dir_inode_operations;
 		inode-&gt;i_fop = &amp;sysfs_dir_operations;
--- gregkh-2.6.orig/fs/sysfs/sysfs.h	2005-06-01 13:33:18.000000000 -0700
+++ gregkh-2.6/fs/sysfs/sysfs.h	2005-06-01 13:33:21.000000000 -0700
@@ -2,7 +2,7 @@
 extern struct vfsmount * sysfs_mount;
 extern kmem_cache_t *sysfs_dir_cachep;
 
-extern struct inode * sysfs_new_inode(mode_t mode);
+extern struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent *);
 extern int sysfs_create(struct dentry *, int mode, int (*init)(struct inode *));
 
 extern int sysfs_make_dirent(struct sysfs_dirent *, struct dentry *, void *,
</pre></body></html>