diff options
Diffstat (limited to 'drivers/oprofile')
-rw-r--r-- | drivers/oprofile/oprofilefs.c | 46 |
1 files changed, 14 insertions, 32 deletions
diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index 2766a6d3c2e9..789a1a857ddf 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c | |||
@@ -126,50 +126,41 @@ static const struct file_operations ulong_ro_fops = { | |||
126 | }; | 126 | }; |
127 | 127 | ||
128 | 128 | ||
129 | static struct dentry *__oprofilefs_create_file(struct super_block *sb, | 129 | static int __oprofilefs_create_file(struct super_block *sb, |
130 | struct dentry *root, char const *name, const struct file_operations *fops, | 130 | struct dentry *root, char const *name, const struct file_operations *fops, |
131 | int perm) | 131 | int perm, void *priv) |
132 | { | 132 | { |
133 | struct dentry *dentry; | 133 | struct dentry *dentry; |
134 | struct inode *inode; | 134 | struct inode *inode; |
135 | 135 | ||
136 | dentry = d_alloc_name(root, name); | 136 | dentry = d_alloc_name(root, name); |
137 | if (!dentry) | 137 | if (!dentry) |
138 | return NULL; | 138 | return -ENOMEM; |
139 | inode = oprofilefs_get_inode(sb, S_IFREG | perm); | 139 | inode = oprofilefs_get_inode(sb, S_IFREG | perm); |
140 | if (!inode) { | 140 | if (!inode) { |
141 | dput(dentry); | 141 | dput(dentry); |
142 | return NULL; | 142 | return -ENOMEM; |
143 | } | 143 | } |
144 | inode->i_fop = fops; | 144 | inode->i_fop = fops; |
145 | d_add(dentry, inode); | 145 | d_add(dentry, inode); |
146 | return dentry; | 146 | dentry->d_inode->i_private = priv; |
147 | return 0; | ||
147 | } | 148 | } |
148 | 149 | ||
149 | 150 | ||
150 | int oprofilefs_create_ulong(struct super_block *sb, struct dentry *root, | 151 | int oprofilefs_create_ulong(struct super_block *sb, struct dentry *root, |
151 | char const *name, unsigned long *val) | 152 | char const *name, unsigned long *val) |
152 | { | 153 | { |
153 | struct dentry *d = __oprofilefs_create_file(sb, root, name, | 154 | return __oprofilefs_create_file(sb, root, name, |
154 | &ulong_fops, 0644); | 155 | &ulong_fops, 0644, val); |
155 | if (!d) | ||
156 | return -EFAULT; | ||
157 | |||
158 | d->d_inode->i_private = val; | ||
159 | return 0; | ||
160 | } | 156 | } |
161 | 157 | ||
162 | 158 | ||
163 | int oprofilefs_create_ro_ulong(struct super_block *sb, struct dentry *root, | 159 | int oprofilefs_create_ro_ulong(struct super_block *sb, struct dentry *root, |
164 | char const *name, unsigned long *val) | 160 | char const *name, unsigned long *val) |
165 | { | 161 | { |
166 | struct dentry *d = __oprofilefs_create_file(sb, root, name, | 162 | return __oprofilefs_create_file(sb, root, name, |
167 | &ulong_ro_fops, 0444); | 163 | &ulong_ro_fops, 0444, val); |
168 | if (!d) | ||
169 | return -EFAULT; | ||
170 | |||
171 | d->d_inode->i_private = val; | ||
172 | return 0; | ||
173 | } | 164 | } |
174 | 165 | ||
175 | 166 | ||
@@ -189,31 +180,22 @@ static const struct file_operations atomic_ro_fops = { | |||
189 | int oprofilefs_create_ro_atomic(struct super_block *sb, struct dentry *root, | 180 | int oprofilefs_create_ro_atomic(struct super_block *sb, struct dentry *root, |
190 | char const *name, atomic_t *val) | 181 | char const *name, atomic_t *val) |
191 | { | 182 | { |
192 | struct dentry *d = __oprofilefs_create_file(sb, root, name, | 183 | return __oprofilefs_create_file(sb, root, name, |
193 | &atomic_ro_fops, 0444); | 184 | &atomic_ro_fops, 0444, val); |
194 | if (!d) | ||
195 | return -EFAULT; | ||
196 | |||
197 | d->d_inode->i_private = val; | ||
198 | return 0; | ||
199 | } | 185 | } |
200 | 186 | ||
201 | 187 | ||
202 | int oprofilefs_create_file(struct super_block *sb, struct dentry *root, | 188 | int oprofilefs_create_file(struct super_block *sb, struct dentry *root, |
203 | char const *name, const struct file_operations *fops) | 189 | char const *name, const struct file_operations *fops) |
204 | { | 190 | { |
205 | if (!__oprofilefs_create_file(sb, root, name, fops, 0644)) | 191 | return __oprofilefs_create_file(sb, root, name, fops, 0644, NULL); |
206 | return -EFAULT; | ||
207 | return 0; | ||
208 | } | 192 | } |
209 | 193 | ||
210 | 194 | ||
211 | int oprofilefs_create_file_perm(struct super_block *sb, struct dentry *root, | 195 | int oprofilefs_create_file_perm(struct super_block *sb, struct dentry *root, |
212 | char const *name, const struct file_operations *fops, int perm) | 196 | char const *name, const struct file_operations *fops, int perm) |
213 | { | 197 | { |
214 | if (!__oprofilefs_create_file(sb, root, name, fops, perm)) | 198 | return __oprofilefs_create_file(sb, root, name, fops, perm, NULL); |
215 | return -EFAULT; | ||
216 | return 0; | ||
217 | } | 199 | } |
218 | 200 | ||
219 | 201 | ||