linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch 3/3] sysfs-iattr: set inode attributes
@ 2005-05-31  5:21 Maneesh Soni
  0 siblings, 0 replies; only message in thread
From: Maneesh Soni @ 2005-05-31  5:21 UTC (permalink / raw)
  To: linux-hotplug




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->s_iattr, pointer to struct iattr.


Signed-off-by: Maneesh Soni <maneesh@in.ibm.com>
---

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

diff -puN fs/sysfs/inode.c~sysfs-iattr-set-inode-attrs fs/sysfs/inode.c
--- linux-2.6.12-rc5-mm1/fs/sysfs/inode.c~sysfs-iattr-set-inode-attrs	2005-05-31 09:14:53.446456320 +0530
+++ linux-2.6.12-rc5-mm1-maneesh/fs/sysfs/inode.c	2005-05-31 09:18:50.981345528 +0530
@@ -91,18 +91,42 @@ int sysfs_setattr(struct dentry * dentry
 	return error;
 }
 
-struct inode * sysfs_new_inode(mode_t mode)
+static inline void set_default_inode_attr(struct inode * inode, mode_t mode)
+{
+	inode->i_mode = mode;
+	inode->i_uid = 0;
+	inode->i_gid = 0;
+	inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+}
+
+static inline void set_inode_attr(struct inode * inode, struct iattr * iattr)
+{
+	inode->i_mode = iattr->ia_mode;
+	inode->i_uid = iattr->ia_uid;
+	inode->i_gid = iattr->ia_gid;
+	inode->i_atime = iattr->ia_atime;
+	inode->i_mtime = iattr->ia_mtime;
+	inode->i_ctime = iattr->ia_ctime;
+}
+
+struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent * sd)
 {
 	struct inode * inode = new_inode(sysfs_sb);
 	if (inode) {
-		inode->i_mode = mode;
-		inode->i_uid = 0;
-		inode->i_gid = 0;
 		inode->i_blksize = PAGE_CACHE_SIZE;
 		inode->i_blocks = 0;
-		inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 		inode->i_mapping->a_ops = &sysfs_aops;
 		inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info;
+		inode->i_op = &sysfs_inode_operations;
+
+		if (sd->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->s_iattr);
+		} else
+			set_default_inode_attr(inode, mode);
 	}
 	return inode;
 }
@@ -113,7 +137,8 @@ int sysfs_create(struct dentry * dentry,
 	struct inode * inode = NULL;
 	if (dentry) {
 		if (!dentry->d_inode) {
-			if ((inode = sysfs_new_inode(mode))) {
+			struct sysfs_dirent * sd = dentry->d_fsdata;
+			if ((inode = sysfs_new_inode(mode, sd))) {
 				if (dentry->d_parent && dentry->d_parent->d_inode) {
 					struct inode *p_inode = dentry->d_parent->d_inode;
 					p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME;
diff -puN fs/sysfs/mount.c~sysfs-iattr-set-inode-attrs fs/sysfs/mount.c
--- linux-2.6.12-rc5-mm1/fs/sysfs/mount.c~sysfs-iattr-set-inode-attrs	2005-05-31 09:14:58.405702400 +0530
+++ linux-2.6.12-rc5-mm1-maneesh/fs/sysfs/mount.c	2005-05-31 09:19:28.347664984 +0530
@@ -28,6 +28,7 @@ static struct sysfs_dirent sysfs_root = 
 	.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 @@ static int sysfs_fill_super(struct super
 	sb->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,
+				 &sysfs_root);
 	if (inode) {
 		inode->i_op = &sysfs_dir_inode_operations;
 		inode->i_fop = &sysfs_dir_operations;
diff -puN fs/sysfs/sysfs.h~sysfs-iattr-set-inode-attrs fs/sysfs/sysfs.h
--- linux-2.6.12-rc5-mm1/fs/sysfs/sysfs.h~sysfs-iattr-set-inode-attrs	2005-05-31 09:15:03.195974168 +0530
+++ linux-2.6.12-rc5-mm1-maneesh/fs/sysfs/sysfs.h	2005-05-31 09:19:53.200886720 +0530
@@ -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 *,
_
-- 
Maneesh Soni
Linux Technology Center, 
IBM India Software Labs,
Bangalore, India
email: maneesh@in.ibm.com
Phone: 91-80-25044990


-------------------------------------------------------
This SF.Net email is sponsored by Yahoo.
Introducing Yahoo! Search Developer Network - Create apps using Yahoo!
Search APIs Find out how you can build Yahoo! directly into your own
Applications - visit http://developer.yahoo.net/?fr=offad-ysdn-ostg-q22005
_______________________________________________
Linux-hotplug-devel mailing list  http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2005-05-31  5:21 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-05-31  5:21 [patch 3/3] sysfs-iattr: set inode attributes Maneesh Soni

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).