diff options
author | Tejun Heo <tj@kernel.org> | 2013-11-29 17:18:32 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-11-29 21:21:01 -0500 |
commit | cf9e5a73aaff0204801dd19cb4bd91d32f32026a (patch) | |
tree | 4a63d030a4c2ee08c06b97d348bcf42bdf7a3cd4 /fs/kernfs/kernfs-internal.h | |
parent | fa736a951e456b996a76826ba78ff974414c3b55 (diff) |
sysfs, kernfs: make sysfs_dirent definition public
sysfs_dirent includes some information which should be available to
kernfs users - the type, flags, name and parent pointer. This patch
moves sysfs_dirent definition from kernfs/kernfs-internal.h to
include/linux/kernfs.h so that kernfs users can access them.
The type part of flags is exported as enum kernfs_node_type, the flags
kernfs_node_flag, sysfs_type() and kernfs_enable_ns() are moved to
include/linux/kernfs.h and the former is updated to return the enum
type. sysfs_dirent->s_parent and ->s_name are marked explicitly as
public.
This patch doesn't introduce any functional changes.
v2: Flags exported too and kernfs_enable_ns() definition moved.
v3: While moving kernfs_enable_ns() to include/linux/kernfs.h, v1 and
v2 put the definition outside CONFIG_SYSFS replacing the dummy
implementation with the actual implementation too. Unfortunately,
this can lead to oops when !CONFIG_SYSFS because
kernfs_enable_ns() may be called on a NULL @sd and now tries to
dereference @sd instead of not doing anything. This issue was
reported by Yuanhan Liu.
Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs/kernfs/kernfs-internal.h')
-rw-r--r-- | fs/kernfs/kernfs-internal.h | 85 |
1 files changed, 1 insertions, 84 deletions
diff --git a/fs/kernfs/kernfs-internal.h b/fs/kernfs/kernfs-internal.h index ced0d6dadc7d..f33a7844e8fd 100644 --- a/fs/kernfs/kernfs-internal.h +++ b/fs/kernfs/kernfs-internal.h | |||
@@ -13,102 +13,19 @@ | |||
13 | 13 | ||
14 | #include <linux/lockdep.h> | 14 | #include <linux/lockdep.h> |
15 | #include <linux/fs.h> | 15 | #include <linux/fs.h> |
16 | #include <linux/rbtree.h> | ||
17 | #include <linux/mutex.h> | 16 | #include <linux/mutex.h> |
18 | 17 | ||
19 | #include <linux/kernfs.h> | 18 | #include <linux/kernfs.h> |
20 | 19 | ||
21 | struct sysfs_open_dirent; | ||
22 | |||
23 | /* type-specific structures for sysfs_dirent->s_* union members */ | ||
24 | struct sysfs_elem_dir { | ||
25 | unsigned long subdirs; | ||
26 | /* children rbtree starts here and goes through sd->s_rb */ | ||
27 | struct rb_root children; | ||
28 | |||
29 | /* | ||
30 | * The kernfs hierarchy this directory belongs to. This fits | ||
31 | * better directly in sysfs_dirent but is here to save space. | ||
32 | */ | ||
33 | struct kernfs_root *root; | ||
34 | }; | ||
35 | |||
36 | struct sysfs_elem_symlink { | ||
37 | struct sysfs_dirent *target_sd; | ||
38 | }; | ||
39 | |||
40 | struct sysfs_elem_attr { | ||
41 | const struct kernfs_ops *ops; | ||
42 | struct sysfs_open_dirent *open; | ||
43 | loff_t size; | ||
44 | }; | ||
45 | |||
46 | struct sysfs_inode_attrs { | 20 | struct sysfs_inode_attrs { |
47 | struct iattr ia_iattr; | 21 | struct iattr ia_iattr; |
48 | void *ia_secdata; | 22 | void *ia_secdata; |
49 | u32 ia_secdata_len; | 23 | u32 ia_secdata_len; |
50 | }; | 24 | }; |
51 | 25 | ||
52 | /* | ||
53 | * sysfs_dirent - the building block of sysfs hierarchy. Each and | ||
54 | * every sysfs node is represented by single sysfs_dirent. | ||
55 | * | ||
56 | * As long as s_count reference is held, the sysfs_dirent itself is | ||
57 | * accessible. Dereferencing s_elem or any other outer entity | ||
58 | * requires s_active reference. | ||
59 | */ | ||
60 | struct sysfs_dirent { | ||
61 | atomic_t s_count; | ||
62 | atomic_t s_active; | ||
63 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
64 | struct lockdep_map dep_map; | ||
65 | #endif | ||
66 | struct sysfs_dirent *s_parent; | ||
67 | const char *s_name; | ||
68 | |||
69 | struct rb_node s_rb; | ||
70 | |||
71 | union { | ||
72 | struct completion *completion; | ||
73 | struct sysfs_dirent *removed_list; | ||
74 | } u; | ||
75 | |||
76 | const void *s_ns; /* namespace tag */ | ||
77 | unsigned int s_hash; /* ns + name hash */ | ||
78 | union { | ||
79 | struct sysfs_elem_dir s_dir; | ||
80 | struct sysfs_elem_symlink s_symlink; | ||
81 | struct sysfs_elem_attr s_attr; | ||
82 | }; | ||
83 | |||
84 | void *priv; | ||
85 | |||
86 | unsigned short s_flags; | ||
87 | umode_t s_mode; | ||
88 | unsigned int s_ino; | ||
89 | struct sysfs_inode_attrs *s_iattr; | ||
90 | }; | ||
91 | |||
92 | #define SD_DEACTIVATED_BIAS INT_MIN | 26 | #define SD_DEACTIVATED_BIAS INT_MIN |
93 | 27 | ||
94 | #define SYSFS_TYPE_MASK 0x000f | 28 | /* SYSFS_TYPE_MASK and types are defined in include/linux/kernfs.h */ |
95 | #define SYSFS_DIR 0x0001 | ||
96 | #define SYSFS_KOBJ_ATTR 0x0002 | ||
97 | #define SYSFS_KOBJ_LINK 0x0004 | ||
98 | #define SYSFS_COPY_NAME (SYSFS_DIR | SYSFS_KOBJ_LINK) | ||
99 | #define SYSFS_ACTIVE_REF SYSFS_KOBJ_ATTR | ||
100 | |||
101 | #define SYSFS_FLAG_MASK ~SYSFS_TYPE_MASK | ||
102 | #define SYSFS_FLAG_REMOVED 0x0010 | ||
103 | #define SYSFS_FLAG_NS 0x0020 | ||
104 | #define SYSFS_FLAG_HAS_SEQ_SHOW 0x0040 | ||
105 | #define SYSFS_FLAG_HAS_MMAP 0x0080 | ||
106 | #define SYSFS_FLAG_LOCKDEP 0x0100 | ||
107 | |||
108 | static inline unsigned int sysfs_type(struct sysfs_dirent *sd) | ||
109 | { | ||
110 | return sd->s_flags & SYSFS_TYPE_MASK; | ||
111 | } | ||
112 | 29 | ||
113 | /** | 30 | /** |
114 | * kernfs_root - find out the kernfs_root a sysfs_dirent belongs to | 31 | * kernfs_root - find out the kernfs_root a sysfs_dirent belongs to |