mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
[PATCH] 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 <maneesh@in.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
988d186de5
commit
8215534ce7
@ -91,18 +91,42 @@ int sysfs_setattr(struct dentry * dentry, struct iattr * iattr)
|
|||||||
return error;
|
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);
|
struct inode * inode = new_inode(sysfs_sb);
|
||||||
if (inode) {
|
if (inode) {
|
||||||
inode->i_mode = mode;
|
|
||||||
inode->i_uid = 0;
|
|
||||||
inode->i_gid = 0;
|
|
||||||
inode->i_blksize = PAGE_CACHE_SIZE;
|
inode->i_blksize = PAGE_CACHE_SIZE;
|
||||||
inode->i_blocks = 0;
|
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->a_ops = &sysfs_aops;
|
||||||
inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info;
|
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;
|
return inode;
|
||||||
}
|
}
|
||||||
@ -113,7 +137,8 @@ int sysfs_create(struct dentry * dentry, int mode, int (*init)(struct inode *))
|
|||||||
struct inode * inode = NULL;
|
struct inode * inode = NULL;
|
||||||
if (dentry) {
|
if (dentry) {
|
||||||
if (!dentry->d_inode) {
|
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) {
|
if (dentry->d_parent && dentry->d_parent->d_inode) {
|
||||||
struct inode *p_inode = dentry->d_parent->d_inode;
|
struct inode *p_inode = dentry->d_parent->d_inode;
|
||||||
p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME;
|
p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME;
|
||||||
|
@ -28,6 +28,7 @@ static struct sysfs_dirent sysfs_root = {
|
|||||||
.s_children = LIST_HEAD_INIT(sysfs_root.s_children),
|
.s_children = LIST_HEAD_INIT(sysfs_root.s_children),
|
||||||
.s_element = NULL,
|
.s_element = NULL,
|
||||||
.s_type = SYSFS_ROOT,
|
.s_type = SYSFS_ROOT,
|
||||||
|
.s_iattr = NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int sysfs_fill_super(struct super_block *sb, void *data, int silent)
|
static int sysfs_fill_super(struct super_block *sb, void *data, int silent)
|
||||||
@ -42,7 +43,8 @@ static int sysfs_fill_super(struct super_block *sb, void *data, int silent)
|
|||||||
sb->s_time_gran = 1;
|
sb->s_time_gran = 1;
|
||||||
sysfs_sb = sb;
|
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) {
|
if (inode) {
|
||||||
inode->i_op = &sysfs_dir_inode_operations;
|
inode->i_op = &sysfs_dir_inode_operations;
|
||||||
inode->i_fop = &sysfs_dir_operations;
|
inode->i_fop = &sysfs_dir_operations;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
extern struct vfsmount * sysfs_mount;
|
extern struct vfsmount * sysfs_mount;
|
||||||
extern kmem_cache_t *sysfs_dir_cachep;
|
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_create(struct dentry *, int mode, int (*init)(struct inode *));
|
||||||
|
|
||||||
extern int sysfs_make_dirent(struct sysfs_dirent *, struct dentry *, void *,
|
extern int sysfs_make_dirent(struct sysfs_dirent *, struct dentry *, void *,
|
||||||
|
Loading…
Reference in New Issue
Block a user