diff options
author | Tejun Heo <htejun@gmail.com> | 2007-06-13 14:45:15 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-07-11 19:09:04 -0400 |
commit | 3e5190380ebef77f2b015c9e7a4ca225a3d75021 (patch) | |
tree | 08d17cd0562acf5101063e93c649f5f71f80b3b9 /fs/sysfs/file.c | |
parent | 0c096b507f15397da890051ee73de4266d3941fb (diff) |
sysfs: make sysfs_dirent->s_element a union
Make sd->s_element a union of sysfs_elem_{dir|symlink|attr|bin_attr}
and rename it to s_elem. This is to achieve...
* some level of type checking : changing symlink to point to
sysfs_dirent instead of kobject is much safer and less painful now.
* easier / standardized dereferencing
* allow sysfs_elem_* to contain more than one entry
Where possible, pointer is obtained by directly deferencing from sd
instead of going through other entities. This reduces dependencies to
dentry, inode and kobject. to_attr() and to_bin_attr() are unused now
and removed.
This is in preparation of object reference simplification.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs/sysfs/file.c')
-rw-r--r-- | fs/sysfs/file.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index 8240b1687dd0..04f6b0ebc889 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c | |||
@@ -88,7 +88,6 @@ remove_from_collection(struct sysfs_buffer *buffer, struct inode *node) | |||
88 | static int fill_read_buffer(struct dentry * dentry, struct sysfs_buffer * buffer) | 88 | static int fill_read_buffer(struct dentry * dentry, struct sysfs_buffer * buffer) |
89 | { | 89 | { |
90 | struct sysfs_dirent * sd = dentry->d_fsdata; | 90 | struct sysfs_dirent * sd = dentry->d_fsdata; |
91 | struct attribute * attr = to_attr(dentry); | ||
92 | struct kobject * kobj = to_kobj(dentry->d_parent); | 91 | struct kobject * kobj = to_kobj(dentry->d_parent); |
93 | struct sysfs_ops * ops = buffer->ops; | 92 | struct sysfs_ops * ops = buffer->ops; |
94 | int ret = 0; | 93 | int ret = 0; |
@@ -100,7 +99,7 @@ static int fill_read_buffer(struct dentry * dentry, struct sysfs_buffer * buffer | |||
100 | return -ENOMEM; | 99 | return -ENOMEM; |
101 | 100 | ||
102 | buffer->event = atomic_read(&sd->s_event); | 101 | buffer->event = atomic_read(&sd->s_event); |
103 | count = ops->show(kobj,attr,buffer->page); | 102 | count = ops->show(kobj, sd->s_elem.attr.attr, buffer->page); |
104 | BUG_ON(count > (ssize_t)PAGE_SIZE); | 103 | BUG_ON(count > (ssize_t)PAGE_SIZE); |
105 | if (count >= 0) { | 104 | if (count >= 0) { |
106 | buffer->needs_read_fill = 0; | 105 | buffer->needs_read_fill = 0; |
@@ -199,11 +198,11 @@ fill_write_buffer(struct sysfs_buffer * buffer, const char __user * buf, size_t | |||
199 | static int | 198 | static int |
200 | flush_write_buffer(struct dentry * dentry, struct sysfs_buffer * buffer, size_t count) | 199 | flush_write_buffer(struct dentry * dentry, struct sysfs_buffer * buffer, size_t count) |
201 | { | 200 | { |
202 | struct attribute * attr = to_attr(dentry); | 201 | struct sysfs_dirent *attr_sd = dentry->d_fsdata; |
203 | struct kobject * kobj = to_kobj(dentry->d_parent); | 202 | struct kobject * kobj = to_kobj(dentry->d_parent); |
204 | struct sysfs_ops * ops = buffer->ops; | 203 | struct sysfs_ops * ops = buffer->ops; |
205 | 204 | ||
206 | return ops->store(kobj,attr,buffer->page,count); | 205 | return ops->store(kobj, attr_sd->s_elem.attr.attr, buffer->page, count); |
207 | } | 206 | } |
208 | 207 | ||
209 | 208 | ||
@@ -248,7 +247,8 @@ out: | |||
248 | static int sysfs_open_file(struct inode *inode, struct file *file) | 247 | static int sysfs_open_file(struct inode *inode, struct file *file) |
249 | { | 248 | { |
250 | struct kobject *kobj = sysfs_get_kobject(file->f_path.dentry->d_parent); | 249 | struct kobject *kobj = sysfs_get_kobject(file->f_path.dentry->d_parent); |
251 | struct attribute * attr = to_attr(file->f_path.dentry); | 250 | struct sysfs_dirent *attr_sd = file->f_path.dentry->d_fsdata; |
251 | struct attribute *attr = attr_sd->s_elem.attr.attr; | ||
252 | struct sysfs_buffer_collection *set; | 252 | struct sysfs_buffer_collection *set; |
253 | struct sysfs_buffer * buffer; | 253 | struct sysfs_buffer * buffer; |
254 | struct sysfs_ops * ops = NULL; | 254 | struct sysfs_ops * ops = NULL; |
@@ -341,15 +341,15 @@ static int sysfs_open_file(struct inode *inode, struct file *file) | |||
341 | static int sysfs_release(struct inode * inode, struct file * filp) | 341 | static int sysfs_release(struct inode * inode, struct file * filp) |
342 | { | 342 | { |
343 | struct kobject * kobj = to_kobj(filp->f_path.dentry->d_parent); | 343 | struct kobject * kobj = to_kobj(filp->f_path.dentry->d_parent); |
344 | struct attribute * attr = to_attr(filp->f_path.dentry); | 344 | struct sysfs_dirent *attr_sd = filp->f_path.dentry->d_fsdata; |
345 | struct module * owner = attr->owner; | 345 | struct attribute *attr = attr_sd->s_elem.attr.attr; |
346 | struct sysfs_buffer * buffer = filp->private_data; | 346 | struct sysfs_buffer * buffer = filp->private_data; |
347 | 347 | ||
348 | if (buffer) | 348 | if (buffer) |
349 | remove_from_collection(buffer, inode); | 349 | remove_from_collection(buffer, inode); |
350 | kobject_put(kobj); | 350 | kobject_put(kobj); |
351 | /* After this point, attr should not be accessed. */ | 351 | /* After this point, attr should not be accessed. */ |
352 | module_put(owner); | 352 | module_put(attr->owner); |
353 | 353 | ||
354 | if (buffer) { | 354 | if (buffer) { |
355 | if (buffer->page) | 355 | if (buffer->page) |
@@ -454,11 +454,12 @@ int sysfs_add_file(struct dentry * dir, const struct attribute * attr, int type) | |||
454 | goto out_unlock; | 454 | goto out_unlock; |
455 | } | 455 | } |
456 | 456 | ||
457 | sd = sysfs_new_dirent(attr->name, (void *)attr, mode, type); | 457 | sd = sysfs_new_dirent(attr->name, mode, type); |
458 | if (!sd) { | 458 | if (!sd) { |
459 | error = -ENOMEM; | 459 | error = -ENOMEM; |
460 | goto out_unlock; | 460 | goto out_unlock; |
461 | } | 461 | } |
462 | sd->s_elem.attr.attr = (void *)attr; | ||
462 | sysfs_attach_dirent(sd, parent_sd, NULL); | 463 | sysfs_attach_dirent(sd, parent_sd, NULL); |
463 | 464 | ||
464 | out_unlock: | 465 | out_unlock: |