diff options
author | Oliver Neukum <oliver@neukum.org> | 2006-12-20 04:52:44 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-02-07 13:37:13 -0500 |
commit | 94bebf4d1b8e7719f0f3944c037a21cfd99a4af7 (patch) | |
tree | 25c6ba1836e74f608b4e434b4f0f4d5c28b11de1 /fs/sysfs/sysfs.h | |
parent | cb986b749c7178422bfbc982cd30e04d5db54bbc (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.h | 16 |
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 | ||
36 | struct 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 | |||
48 | struct sysfs_buffer_collection { | ||
49 | struct list_head associates; | ||
50 | }; | ||
51 | |||
36 | static inline struct kobject * to_kobj(struct dentry * dentry) | 52 | static 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; |