sysfs-iattr: set inode attributes
PATCH 3/3 sysfs-iattr: set inode attributes
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 <[email protected]>
---
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(-)
fs/sysfs/inode.c renamed from fs/sysfs/inode.c~sysfs-iattr-set-inode-attrs +31 -6
@@ -91,18 +91,42 @@ int sysfs_setattr(struct dentry * dentryreturn 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 ;
fs/sysfs/mount.c renamed from fs/sysfs/mount.c~sysfs-iattr-set-inode-attrs +3 -1
@@ -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;
fs/sysfs/sysfs.h renamed from fs/sysfs/sysfs.h~sysfs-iattr-set-inode-attrs +1 -1
@@ -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 *,
_
Signature · 17 lines
Maneesh Soni Linux Technology Center, IBM India Software Labs, Bangalore, India email: [email protected] 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 [email protected] https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel