From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maneesh Soni Date: Tue, 31 May 2005 05:21:52 +0000 Subject: [patch 3/3] sysfs-iattr: set inode attributes Message-Id: <20050531050952.GD3631@in.ibm.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-hotplug@vger.kernel.org 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 --- 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