aboutsummaryrefslogtreecommitdiffstats
path: root/fs/sysfs/sysfs.h
diff options
context:
space:
mode:
authorOliver Neukum <oliver@neukum.org>2006-12-20 04:52:44 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2007-02-07 13:37:13 -0500
commit94bebf4d1b8e7719f0f3944c037a21cfd99a4af7 (patch)
tree25c6ba1836e74f608b4e434b4f0f4d5c28b11de1 /fs/sysfs/sysfs.h
parentcb986b749c7178422bfbc982cd30e04d5db54bbc (diff)
Driver core: fix race in sysfs between sysfs_remove_file() and read()/write()
This patch prevents a race between IO and removing a file from sysfs. It introduces a list of sysfs_buffers associated with a file at the inode. Upon removal of a file the list is walked and the buffers marked orphaned. IO to orphaned buffers fails with -ENODEV. The driver can safely free associated data structures or be unloaded. Signed-off-by: Oliver Neukum <oliver@neukum.name> Acked-by: Maneesh Soni <maneesh@in.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs/sysfs/sysfs.h')
-rw-r--r--fs/sysfs/sysfs.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/sysfs/sysfs.h b/fs/sysfs/sysfs.h
index bd7cec295dab..39c623fdc277 100644
--- a/fs/sysfs/sysfs.h
+++ b/fs/sysfs/sysfs.h
@@ -33,6 +33,22 @@ struct sysfs_symlink {
33 struct kobject * target_kobj; 33 struct kobject * target_kobj;
34}; 34};
35 35
36struct sysfs_buffer {
37 struct list_head associates;
38 size_t count;
39 loff_t pos;
40 char * page;
41 struct sysfs_ops * ops;
42 struct semaphore sem;
43 int orphaned;
44 int needs_read_fill;
45 int event;
46};
47
48struct sysfs_buffer_collection {
49 struct list_head associates;
50};
51
36static inline struct kobject * to_kobj(struct dentry * dentry) 52static inline struct kobject * to_kobj(struct dentry * dentry)
37{ 53{
38 struct sysfs_dirent * sd = dentry->d_fsdata; 54 struct sysfs_dirent * sd = dentry->d_fsdata;