From 332ad69da7aca8bdcd3f873bb2bfeb9d9a6d1f98 Mon Sep 17 00:00:00 2001 From: Patrick Mochel Date: Tue, 29 Oct 2002 20:27:36 -0800 Subject: sysfs: kill struct sysfs_dir. Previously, sysfs read() and write() calls looked for sysfs_ops in the struct sysfs_dir, in the kobject. Since objects belong to a subsystem, and is a member of a group of like devices, the sysfs_ops have been moved to struct subsystem, and are referenced from there. The only remaining member of struct sysfs_dir is the dentry of the object's directory. That is moved out of the dir struct and directly into struct kobject. That saves us 4 bytes/object. All of the sysfs functions that referenced the struct have been changed to just reference the dentry. --- fs/sysfs/inode.c | 26 +++++++++++--------------- include/linux/kobject.h | 2 +- include/linux/sysfs.h | 5 ----- 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index a82726460fca..c25cadf77d88 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c @@ -179,9 +179,8 @@ sysfs_read_file(struct file *file, char *buf, size_t count, loff_t *ppos) ssize_t retval = 0; kobj = file->f_dentry->d_parent->d_fsdata; - if (kobj) - ops = kobj->dir.ops; - + if (kobj && kobj->subsys) + ops = kobj->subsys->sysfs_ops; if (!ops || !ops->show) return 0; @@ -241,8 +240,8 @@ sysfs_write_file(struct file *file, const char *buf, size_t count, loff_t *ppos) char * page; kobj = file->f_dentry->d_parent->d_fsdata; - if (kobj) - ops = kobj->dir.ops; + if (kobj && kobj->subsys) + ops = kobj->subsys->sysfs_ops; if (!ops || !ops->store) return 0; @@ -404,7 +403,7 @@ int sysfs_create_dir(struct kobject * kobj) return -EINVAL; if (kobj->parent) - parent = kobj->parent->dir.dentry; + parent = kobj->parent->dentry; else if (sysfs_mount && sysfs_mount->mnt_sb) parent = sysfs_mount->mnt_sb->s_root; else @@ -414,7 +413,7 @@ int sysfs_create_dir(struct kobject * kobj) dentry = get_dentry(parent,kobj->name); if (!IS_ERR(dentry)) { dentry->d_fsdata = (void *)kobj; - kobj->dir.dentry = dentry; + kobj->dentry = dentry; error = sysfs_mkdir(parent->d_inode,dentry, (S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO)); } else @@ -440,10 +439,7 @@ int sysfs_create_file(struct kobject * kobj, struct attribute * attr) if (!kobj || !attr) return -EINVAL; - if (kobj->parent) - parent = kobj->parent->dir.dentry; - else - return -ENOENT; + parent = kobj->dentry; down(&parent->d_inode->i_sem); dentry = get_dentry(parent,attr->name); @@ -499,7 +495,7 @@ static void fill_object_path(struct kobject * kobj, char * buffer, int length) */ int sysfs_create_link(struct kobject * kobj, struct kobject * target, char * name) { - struct dentry * dentry = kobj->dir.dentry; + struct dentry * dentry = kobj->dentry; struct dentry * d; int error = 0; int size; @@ -562,7 +558,7 @@ static void hash_and_remove(struct dentry * dir, const char * name) void sysfs_remove_file(struct kobject * kobj, struct attribute * attr) { - hash_and_remove(kobj->dir.dentry,attr->name); + hash_and_remove(kobj->dentry,attr->name); } @@ -574,7 +570,7 @@ void sysfs_remove_file(struct kobject * kobj, struct attribute * attr) void sysfs_remove_link(struct kobject * kobj, char * name) { - hash_and_remove(kobj->dir.dentry,name); + hash_and_remove(kobj->dentry,name); } @@ -590,7 +586,7 @@ void sysfs_remove_link(struct kobject * kobj, char * name) void sysfs_remove_dir(struct kobject * kobj) { struct list_head * node, * next; - struct dentry * dentry = kobj->dir.dentry; + struct dentry * dentry = kobj->dentry; struct dentry * parent; if (!dentry) diff --git a/include/linux/kobject.h b/include/linux/kobject.h index 32dfaaf52d88..5b236b6678cb 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h @@ -18,7 +18,7 @@ struct kobject { struct list_head entry; struct kobject * parent; struct subsystem * subsys; - struct sysfs_dir dir; + struct dentry * dentry; }; extern void kobject_init(struct kobject *); diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index 066a9ccc0fb4..7a46c9f0c308 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h @@ -18,11 +18,6 @@ struct sysfs_ops { ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t, loff_t); }; -struct sysfs_dir { - struct dentry * dentry; - struct sysfs_ops * ops; -}; - struct attribute { char * name; mode_t mode; -- cgit v1.2.3