]> git.neil.brown.name Git - history.git/commitdiff
sysfs: kill struct sysfs_dir.
authorPatrick Mochel <mochel@osdl.org>
Wed, 30 Oct 2002 04:27:36 +0000 (20:27 -0800)
committerPatrick Mochel <mochel@osdl.org>
Wed, 30 Oct 2002 04:27:36 +0000 (20:27 -0800)
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
include/linux/kobject.h
include/linux/sysfs.h

index a82726460fcaca642e6399e08254ddf04eb167f4..c25cadf77d880edf384fdfc53af71b5ba77881a5 100644 (file)
@@ -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)
index 32dfaaf52d883f39dc359651c82c9636d7dbc431..5b236b6678cbb3e0a13359113b35a64d63cde3e9 100644 (file)
@@ -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 *);
index 066a9ccc0fb480043aa8c65301b8e3ad42ea86a1..7a46c9f0c308f0b194c559d8586b615cc3e2d1c3 100644 (file)
@@ -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;