* [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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.