diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-16 15:57:37 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-16 15:57:37 -0400 |
commit | 6fd03301d76bc439382710e449f58efbb233df1b (patch) | |
tree | 3c8a3217aed67319683ffc1debccdb5b3245b16c /fs | |
parent | cd5232bd6be2d215a800f3d88c287ca791debfbe (diff) | |
parent | e4792aa30f9d33584d7192685ed149cc5fee737f (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: (64 commits)
debugfs: use specified mode to possibly mark files read/write only
debugfs: Fix terminology inconsistency of dir name to mount debugfs filesystem.
xen: remove driver_data direct access of struct device from more drivers
usb: gadget: at91_udc: remove driver_data direct access of struct device
uml: remove driver_data direct access of struct device
block/ps3: remove driver_data direct access of struct device
s390: remove driver_data direct access of struct device
parport: remove driver_data direct access of struct device
parisc: remove driver_data direct access of struct device
of_serial: remove driver_data direct access of struct device
mips: remove driver_data direct access of struct device
ipmi: remove driver_data direct access of struct device
infiniband: ehca: remove driver_data direct access of struct device
ibmvscsi: gadget: at91_udc: remove driver_data direct access of struct device
hvcs: remove driver_data direct access of struct device
xen block: remove driver_data direct access of struct device
thermal: remove driver_data direct access of struct device
scsi: remove driver_data direct access of struct device
pcmcia: remove driver_data direct access of struct device
PCIE: remove driver_data direct access of struct device
...
Manually fix up trivial conflicts due to different direct driver_data
direct access fixups in drivers/block/{ps3disk.c,ps3vram.c}
Diffstat (limited to 'fs')
-rw-r--r-- | fs/debugfs/file.c | 65 | ||||
-rw-r--r-- | fs/debugfs/inode.c | 11 | ||||
-rw-r--r-- | fs/sysfs/symlink.c | 5 |
3 files changed, 79 insertions, 2 deletions
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index 33a90120f6ad..4d74fc72c195 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c | |||
@@ -67,6 +67,8 @@ static int debugfs_u8_get(void *data, u64 *val) | |||
67 | return 0; | 67 | return 0; |
68 | } | 68 | } |
69 | DEFINE_SIMPLE_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n"); | 69 | DEFINE_SIMPLE_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n"); |
70 | DEFINE_SIMPLE_ATTRIBUTE(fops_u8_ro, debugfs_u8_get, NULL, "%llu\n"); | ||
71 | DEFINE_SIMPLE_ATTRIBUTE(fops_u8_wo, NULL, debugfs_u8_set, "%llu\n"); | ||
70 | 72 | ||
71 | /** | 73 | /** |
72 | * debugfs_create_u8 - create a debugfs file that is used to read and write an unsigned 8-bit value | 74 | * debugfs_create_u8 - create a debugfs file that is used to read and write an unsigned 8-bit value |
@@ -95,6 +97,13 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n"); | |||
95 | struct dentry *debugfs_create_u8(const char *name, mode_t mode, | 97 | struct dentry *debugfs_create_u8(const char *name, mode_t mode, |
96 | struct dentry *parent, u8 *value) | 98 | struct dentry *parent, u8 *value) |
97 | { | 99 | { |
100 | /* if there are no write bits set, make read only */ | ||
101 | if (!(mode & S_IWUGO)) | ||
102 | return debugfs_create_file(name, mode, parent, value, &fops_u8_ro); | ||
103 | /* if there are no read bits set, make write only */ | ||
104 | if (!(mode & S_IRUGO)) | ||
105 | return debugfs_create_file(name, mode, parent, value, &fops_u8_wo); | ||
106 | |||
98 | return debugfs_create_file(name, mode, parent, value, &fops_u8); | 107 | return debugfs_create_file(name, mode, parent, value, &fops_u8); |
99 | } | 108 | } |
100 | EXPORT_SYMBOL_GPL(debugfs_create_u8); | 109 | EXPORT_SYMBOL_GPL(debugfs_create_u8); |
@@ -110,6 +119,8 @@ static int debugfs_u16_get(void *data, u64 *val) | |||
110 | return 0; | 119 | return 0; |
111 | } | 120 | } |
112 | DEFINE_SIMPLE_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n"); | 121 | DEFINE_SIMPLE_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n"); |
122 | DEFINE_SIMPLE_ATTRIBUTE(fops_u16_ro, debugfs_u16_get, NULL, "%llu\n"); | ||
123 | DEFINE_SIMPLE_ATTRIBUTE(fops_u16_wo, NULL, debugfs_u16_set, "%llu\n"); | ||
113 | 124 | ||
114 | /** | 125 | /** |
115 | * debugfs_create_u16 - create a debugfs file that is used to read and write an unsigned 16-bit value | 126 | * debugfs_create_u16 - create a debugfs file that is used to read and write an unsigned 16-bit value |
@@ -138,6 +149,13 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n"); | |||
138 | struct dentry *debugfs_create_u16(const char *name, mode_t mode, | 149 | struct dentry *debugfs_create_u16(const char *name, mode_t mode, |
139 | struct dentry *parent, u16 *value) | 150 | struct dentry *parent, u16 *value) |
140 | { | 151 | { |
152 | /* if there are no write bits set, make read only */ | ||
153 | if (!(mode & S_IWUGO)) | ||
154 | return debugfs_create_file(name, mode, parent, value, &fops_u16_ro); | ||
155 | /* if there are no read bits set, make write only */ | ||
156 | if (!(mode & S_IRUGO)) | ||
157 | return debugfs_create_file(name, mode, parent, value, &fops_u16_wo); | ||
158 | |||
141 | return debugfs_create_file(name, mode, parent, value, &fops_u16); | 159 | return debugfs_create_file(name, mode, parent, value, &fops_u16); |
142 | } | 160 | } |
143 | EXPORT_SYMBOL_GPL(debugfs_create_u16); | 161 | EXPORT_SYMBOL_GPL(debugfs_create_u16); |
@@ -153,6 +171,8 @@ static int debugfs_u32_get(void *data, u64 *val) | |||
153 | return 0; | 171 | return 0; |
154 | } | 172 | } |
155 | DEFINE_SIMPLE_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n"); | 173 | DEFINE_SIMPLE_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n"); |
174 | DEFINE_SIMPLE_ATTRIBUTE(fops_u32_ro, debugfs_u32_get, NULL, "%llu\n"); | ||
175 | DEFINE_SIMPLE_ATTRIBUTE(fops_u32_wo, NULL, debugfs_u32_set, "%llu\n"); | ||
156 | 176 | ||
157 | /** | 177 | /** |
158 | * debugfs_create_u32 - create a debugfs file that is used to read and write an unsigned 32-bit value | 178 | * debugfs_create_u32 - create a debugfs file that is used to read and write an unsigned 32-bit value |
@@ -181,6 +201,13 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n"); | |||
181 | struct dentry *debugfs_create_u32(const char *name, mode_t mode, | 201 | struct dentry *debugfs_create_u32(const char *name, mode_t mode, |
182 | struct dentry *parent, u32 *value) | 202 | struct dentry *parent, u32 *value) |
183 | { | 203 | { |
204 | /* if there are no write bits set, make read only */ | ||
205 | if (!(mode & S_IWUGO)) | ||
206 | return debugfs_create_file(name, mode, parent, value, &fops_u32_ro); | ||
207 | /* if there are no read bits set, make write only */ | ||
208 | if (!(mode & S_IRUGO)) | ||
209 | return debugfs_create_file(name, mode, parent, value, &fops_u32_wo); | ||
210 | |||
184 | return debugfs_create_file(name, mode, parent, value, &fops_u32); | 211 | return debugfs_create_file(name, mode, parent, value, &fops_u32); |
185 | } | 212 | } |
186 | EXPORT_SYMBOL_GPL(debugfs_create_u32); | 213 | EXPORT_SYMBOL_GPL(debugfs_create_u32); |
@@ -197,6 +224,8 @@ static int debugfs_u64_get(void *data, u64 *val) | |||
197 | return 0; | 224 | return 0; |
198 | } | 225 | } |
199 | DEFINE_SIMPLE_ATTRIBUTE(fops_u64, debugfs_u64_get, debugfs_u64_set, "%llu\n"); | 226 | DEFINE_SIMPLE_ATTRIBUTE(fops_u64, debugfs_u64_get, debugfs_u64_set, "%llu\n"); |
227 | DEFINE_SIMPLE_ATTRIBUTE(fops_u64_ro, debugfs_u64_get, NULL, "%llu\n"); | ||
228 | DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n"); | ||
200 | 229 | ||
201 | /** | 230 | /** |
202 | * debugfs_create_u64 - create a debugfs file that is used to read and write an unsigned 64-bit value | 231 | * debugfs_create_u64 - create a debugfs file that is used to read and write an unsigned 64-bit value |
@@ -225,15 +254,28 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u64, debugfs_u64_get, debugfs_u64_set, "%llu\n"); | |||
225 | struct dentry *debugfs_create_u64(const char *name, mode_t mode, | 254 | struct dentry *debugfs_create_u64(const char *name, mode_t mode, |
226 | struct dentry *parent, u64 *value) | 255 | struct dentry *parent, u64 *value) |
227 | { | 256 | { |
257 | /* if there are no write bits set, make read only */ | ||
258 | if (!(mode & S_IWUGO)) | ||
259 | return debugfs_create_file(name, mode, parent, value, &fops_u64_ro); | ||
260 | /* if there are no read bits set, make write only */ | ||
261 | if (!(mode & S_IRUGO)) | ||
262 | return debugfs_create_file(name, mode, parent, value, &fops_u64_wo); | ||
263 | |||
228 | return debugfs_create_file(name, mode, parent, value, &fops_u64); | 264 | return debugfs_create_file(name, mode, parent, value, &fops_u64); |
229 | } | 265 | } |
230 | EXPORT_SYMBOL_GPL(debugfs_create_u64); | 266 | EXPORT_SYMBOL_GPL(debugfs_create_u64); |
231 | 267 | ||
232 | DEFINE_SIMPLE_ATTRIBUTE(fops_x8, debugfs_u8_get, debugfs_u8_set, "0x%02llx\n"); | 268 | DEFINE_SIMPLE_ATTRIBUTE(fops_x8, debugfs_u8_get, debugfs_u8_set, "0x%02llx\n"); |
269 | DEFINE_SIMPLE_ATTRIBUTE(fops_x8_ro, debugfs_u8_get, NULL, "0x%02llx\n"); | ||
270 | DEFINE_SIMPLE_ATTRIBUTE(fops_x8_wo, NULL, debugfs_u8_set, "0x%02llx\n"); | ||
233 | 271 | ||
234 | DEFINE_SIMPLE_ATTRIBUTE(fops_x16, debugfs_u16_get, debugfs_u16_set, "0x%04llx\n"); | 272 | DEFINE_SIMPLE_ATTRIBUTE(fops_x16, debugfs_u16_get, debugfs_u16_set, "0x%04llx\n"); |
273 | DEFINE_SIMPLE_ATTRIBUTE(fops_x16_ro, debugfs_u16_get, NULL, "0x%04llx\n"); | ||
274 | DEFINE_SIMPLE_ATTRIBUTE(fops_x16_wo, NULL, debugfs_u16_set, "0x%04llx\n"); | ||
235 | 275 | ||
236 | DEFINE_SIMPLE_ATTRIBUTE(fops_x32, debugfs_u32_get, debugfs_u32_set, "0x%08llx\n"); | 276 | DEFINE_SIMPLE_ATTRIBUTE(fops_x32, debugfs_u32_get, debugfs_u32_set, "0x%08llx\n"); |
277 | DEFINE_SIMPLE_ATTRIBUTE(fops_x32_ro, debugfs_u32_get, NULL, "0x%08llx\n"); | ||
278 | DEFINE_SIMPLE_ATTRIBUTE(fops_x32_wo, NULL, debugfs_u32_set, "0x%08llx\n"); | ||
237 | 279 | ||
238 | /* | 280 | /* |
239 | * debugfs_create_x{8,16,32} - create a debugfs file that is used to read and write an unsigned {8,16,32}-bit value | 281 | * debugfs_create_x{8,16,32} - create a debugfs file that is used to read and write an unsigned {8,16,32}-bit value |
@@ -256,6 +298,13 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_x32, debugfs_u32_get, debugfs_u32_set, "0x%08llx\n" | |||
256 | struct dentry *debugfs_create_x8(const char *name, mode_t mode, | 298 | struct dentry *debugfs_create_x8(const char *name, mode_t mode, |
257 | struct dentry *parent, u8 *value) | 299 | struct dentry *parent, u8 *value) |
258 | { | 300 | { |
301 | /* if there are no write bits set, make read only */ | ||
302 | if (!(mode & S_IWUGO)) | ||
303 | return debugfs_create_file(name, mode, parent, value, &fops_x8_ro); | ||
304 | /* if there are no read bits set, make write only */ | ||
305 | if (!(mode & S_IRUGO)) | ||
306 | return debugfs_create_file(name, mode, parent, value, &fops_x8_wo); | ||
307 | |||
259 | return debugfs_create_file(name, mode, parent, value, &fops_x8); | 308 | return debugfs_create_file(name, mode, parent, value, &fops_x8); |
260 | } | 309 | } |
261 | EXPORT_SYMBOL_GPL(debugfs_create_x8); | 310 | EXPORT_SYMBOL_GPL(debugfs_create_x8); |
@@ -273,6 +322,13 @@ EXPORT_SYMBOL_GPL(debugfs_create_x8); | |||
273 | struct dentry *debugfs_create_x16(const char *name, mode_t mode, | 322 | struct dentry *debugfs_create_x16(const char *name, mode_t mode, |
274 | struct dentry *parent, u16 *value) | 323 | struct dentry *parent, u16 *value) |
275 | { | 324 | { |
325 | /* if there are no write bits set, make read only */ | ||
326 | if (!(mode & S_IWUGO)) | ||
327 | return debugfs_create_file(name, mode, parent, value, &fops_x16_ro); | ||
328 | /* if there are no read bits set, make write only */ | ||
329 | if (!(mode & S_IRUGO)) | ||
330 | return debugfs_create_file(name, mode, parent, value, &fops_x16_wo); | ||
331 | |||
276 | return debugfs_create_file(name, mode, parent, value, &fops_x16); | 332 | return debugfs_create_file(name, mode, parent, value, &fops_x16); |
277 | } | 333 | } |
278 | EXPORT_SYMBOL_GPL(debugfs_create_x16); | 334 | EXPORT_SYMBOL_GPL(debugfs_create_x16); |
@@ -290,6 +346,13 @@ EXPORT_SYMBOL_GPL(debugfs_create_x16); | |||
290 | struct dentry *debugfs_create_x32(const char *name, mode_t mode, | 346 | struct dentry *debugfs_create_x32(const char *name, mode_t mode, |
291 | struct dentry *parent, u32 *value) | 347 | struct dentry *parent, u32 *value) |
292 | { | 348 | { |
349 | /* if there are no write bits set, make read only */ | ||
350 | if (!(mode & S_IWUGO)) | ||
351 | return debugfs_create_file(name, mode, parent, value, &fops_x32_ro); | ||
352 | /* if there are no read bits set, make write only */ | ||
353 | if (!(mode & S_IRUGO)) | ||
354 | return debugfs_create_file(name, mode, parent, value, &fops_x32_wo); | ||
355 | |||
293 | return debugfs_create_file(name, mode, parent, value, &fops_x32); | 356 | return debugfs_create_file(name, mode, parent, value, &fops_x32); |
294 | } | 357 | } |
295 | EXPORT_SYMBOL_GPL(debugfs_create_x32); | 358 | EXPORT_SYMBOL_GPL(debugfs_create_x32); |
@@ -419,7 +482,7 @@ static const struct file_operations fops_blob = { | |||
419 | }; | 482 | }; |
420 | 483 | ||
421 | /** | 484 | /** |
422 | * debugfs_create_blob - create a debugfs file that is used to read and write a binary blob | 485 | * debugfs_create_blob - create a debugfs file that is used to read a binary blob |
423 | * @name: a pointer to a string containing the name of the file to create. | 486 | * @name: a pointer to a string containing the name of the file to create. |
424 | * @mode: the permission that the file should have | 487 | * @mode: the permission that the file should have |
425 | * @parent: a pointer to the parent dentry for this file. This should be a | 488 | * @parent: a pointer to the parent dentry for this file. This should be a |
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index 0662ba6de85a..d22438ef7674 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c | |||
@@ -403,6 +403,7 @@ void debugfs_remove_recursive(struct dentry *dentry) | |||
403 | } | 403 | } |
404 | child = list_entry(parent->d_subdirs.next, struct dentry, | 404 | child = list_entry(parent->d_subdirs.next, struct dentry, |
405 | d_u.d_child); | 405 | d_u.d_child); |
406 | next_sibling: | ||
406 | 407 | ||
407 | /* | 408 | /* |
408 | * If "child" isn't empty, walk down the tree and | 409 | * If "child" isn't empty, walk down the tree and |
@@ -417,6 +418,16 @@ void debugfs_remove_recursive(struct dentry *dentry) | |||
417 | __debugfs_remove(child, parent); | 418 | __debugfs_remove(child, parent); |
418 | if (parent->d_subdirs.next == &child->d_u.d_child) { | 419 | if (parent->d_subdirs.next == &child->d_u.d_child) { |
419 | /* | 420 | /* |
421 | * Try the next sibling. | ||
422 | */ | ||
423 | if (child->d_u.d_child.next != &parent->d_subdirs) { | ||
424 | child = list_entry(child->d_u.d_child.next, | ||
425 | struct dentry, | ||
426 | d_u.d_child); | ||
427 | goto next_sibling; | ||
428 | } | ||
429 | |||
430 | /* | ||
420 | * Avoid infinite loop if we fail to remove | 431 | * Avoid infinite loop if we fail to remove |
421 | * one dentry. | 432 | * one dentry. |
422 | */ | 433 | */ |
diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c index a3ba217fbe74..1d897ad808e0 100644 --- a/fs/sysfs/symlink.c +++ b/fs/sysfs/symlink.c | |||
@@ -192,8 +192,11 @@ static void *sysfs_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
192 | { | 192 | { |
193 | int error = -ENOMEM; | 193 | int error = -ENOMEM; |
194 | unsigned long page = get_zeroed_page(GFP_KERNEL); | 194 | unsigned long page = get_zeroed_page(GFP_KERNEL); |
195 | if (page) | 195 | if (page) { |
196 | error = sysfs_getlink(dentry, (char *) page); | 196 | error = sysfs_getlink(dentry, (char *) page); |
197 | if (error < 0) | ||
198 | free_page((unsigned long)page); | ||
199 | } | ||
197 | nd_set_link(nd, error ? ERR_PTR(error) : (char *)page); | 200 | nd_set_link(nd, error ? ERR_PTR(error) : (char *)page); |
198 | return NULL; | 201 | return NULL; |
199 | } | 202 | } |