diff options
Diffstat (limited to 'fs/debugfs')
-rw-r--r-- | fs/debugfs/file.c | 22 | ||||
-rw-r--r-- | fs/debugfs/inode.c | 35 |
2 files changed, 20 insertions, 37 deletions
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index 0210898458b2..90f76575c056 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c | |||
@@ -43,6 +43,7 @@ const struct file_operations debugfs_file_operations = { | |||
43 | .read = default_read_file, | 43 | .read = default_read_file, |
44 | .write = default_write_file, | 44 | .write = default_write_file, |
45 | .open = default_open, | 45 | .open = default_open, |
46 | .llseek = noop_llseek, | ||
46 | }; | 47 | }; |
47 | 48 | ||
48 | static void *debugfs_follow_link(struct dentry *dentry, struct nameidata *nd) | 49 | static void *debugfs_follow_link(struct dentry *dentry, struct nameidata *nd) |
@@ -427,26 +428,17 @@ static ssize_t write_file_bool(struct file *file, const char __user *user_buf, | |||
427 | size_t count, loff_t *ppos) | 428 | size_t count, loff_t *ppos) |
428 | { | 429 | { |
429 | char buf[32]; | 430 | char buf[32]; |
430 | int buf_size; | 431 | size_t buf_size; |
432 | bool bv; | ||
431 | u32 *val = file->private_data; | 433 | u32 *val = file->private_data; |
432 | 434 | ||
433 | buf_size = min(count, (sizeof(buf)-1)); | 435 | buf_size = min(count, (sizeof(buf)-1)); |
434 | if (copy_from_user(buf, user_buf, buf_size)) | 436 | if (copy_from_user(buf, user_buf, buf_size)) |
435 | return -EFAULT; | 437 | return -EFAULT; |
436 | 438 | ||
437 | switch (buf[0]) { | 439 | if (strtobool(buf, &bv) == 0) |
438 | case 'y': | 440 | *val = bv; |
439 | case 'Y': | 441 | |
440 | case '1': | ||
441 | *val = 1; | ||
442 | break; | ||
443 | case 'n': | ||
444 | case 'N': | ||
445 | case '0': | ||
446 | *val = 0; | ||
447 | break; | ||
448 | } | ||
449 | |||
450 | return count; | 442 | return count; |
451 | } | 443 | } |
452 | 444 | ||
@@ -454,6 +446,7 @@ static const struct file_operations fops_bool = { | |||
454 | .read = read_file_bool, | 446 | .read = read_file_bool, |
455 | .write = write_file_bool, | 447 | .write = write_file_bool, |
456 | .open = default_open, | 448 | .open = default_open, |
449 | .llseek = default_llseek, | ||
457 | }; | 450 | }; |
458 | 451 | ||
459 | /** | 452 | /** |
@@ -498,6 +491,7 @@ static ssize_t read_file_blob(struct file *file, char __user *user_buf, | |||
498 | static const struct file_operations fops_blob = { | 491 | static const struct file_operations fops_blob = { |
499 | .read = read_file_blob, | 492 | .read = read_file_blob, |
500 | .open = default_open, | 493 | .open = default_open, |
494 | .llseek = default_llseek, | ||
501 | }; | 495 | }; |
502 | 496 | ||
503 | /** | 497 | /** |
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index 30a87b3dbcac..e7a7a2f07324 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c | |||
@@ -13,9 +13,6 @@ | |||
13 | * | 13 | * |
14 | */ | 14 | */ |
15 | 15 | ||
16 | /* uncomment to get debug messages from the debug filesystem, ah the irony. */ | ||
17 | /* #define DEBUG */ | ||
18 | |||
19 | #include <linux/module.h> | 16 | #include <linux/module.h> |
20 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
21 | #include <linux/mount.h> | 18 | #include <linux/mount.h> |
@@ -40,6 +37,7 @@ static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t d | |||
40 | struct inode *inode = new_inode(sb); | 37 | struct inode *inode = new_inode(sb); |
41 | 38 | ||
42 | if (inode) { | 39 | if (inode) { |
40 | inode->i_ino = get_next_ino(); | ||
43 | inode->i_mode = mode; | 41 | inode->i_mode = mode; |
44 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 42 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
45 | switch (mode & S_IFMT) { | 43 | switch (mode & S_IFMT) { |
@@ -134,17 +132,17 @@ static int debug_fill_super(struct super_block *sb, void *data, int silent) | |||
134 | return simple_fill_super(sb, DEBUGFS_MAGIC, debug_files); | 132 | return simple_fill_super(sb, DEBUGFS_MAGIC, debug_files); |
135 | } | 133 | } |
136 | 134 | ||
137 | static int debug_get_sb(struct file_system_type *fs_type, | 135 | static struct dentry *debug_mount(struct file_system_type *fs_type, |
138 | int flags, const char *dev_name, | 136 | int flags, const char *dev_name, |
139 | void *data, struct vfsmount *mnt) | 137 | void *data) |
140 | { | 138 | { |
141 | return get_sb_single(fs_type, flags, data, debug_fill_super, mnt); | 139 | return mount_single(fs_type, flags, data, debug_fill_super); |
142 | } | 140 | } |
143 | 141 | ||
144 | static struct file_system_type debug_fs_type = { | 142 | static struct file_system_type debug_fs_type = { |
145 | .owner = THIS_MODULE, | 143 | .owner = THIS_MODULE, |
146 | .name = "debugfs", | 144 | .name = "debugfs", |
147 | .get_sb = debug_get_sb, | 145 | .mount = debug_mount, |
148 | .kill_sb = kill_litter_super, | 146 | .kill_sb = kill_litter_super, |
149 | }; | 147 | }; |
150 | 148 | ||
@@ -309,7 +307,7 @@ struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent, | |||
309 | } | 307 | } |
310 | EXPORT_SYMBOL_GPL(debugfs_create_symlink); | 308 | EXPORT_SYMBOL_GPL(debugfs_create_symlink); |
311 | 309 | ||
312 | static void __debugfs_remove(struct dentry *dentry, struct dentry *parent) | 310 | static int __debugfs_remove(struct dentry *dentry, struct dentry *parent) |
313 | { | 311 | { |
314 | int ret = 0; | 312 | int ret = 0; |
315 | 313 | ||
@@ -332,6 +330,7 @@ static void __debugfs_remove(struct dentry *dentry, struct dentry *parent) | |||
332 | dput(dentry); | 330 | dput(dentry); |
333 | } | 331 | } |
334 | } | 332 | } |
333 | return ret; | ||
335 | } | 334 | } |
336 | 335 | ||
337 | /** | 336 | /** |
@@ -350,7 +349,8 @@ static void __debugfs_remove(struct dentry *dentry, struct dentry *parent) | |||
350 | void debugfs_remove(struct dentry *dentry) | 349 | void debugfs_remove(struct dentry *dentry) |
351 | { | 350 | { |
352 | struct dentry *parent; | 351 | struct dentry *parent; |
353 | 352 | int ret; | |
353 | |||
354 | if (!dentry) | 354 | if (!dentry) |
355 | return; | 355 | return; |
356 | 356 | ||
@@ -359,9 +359,10 @@ void debugfs_remove(struct dentry *dentry) | |||
359 | return; | 359 | return; |
360 | 360 | ||
361 | mutex_lock(&parent->d_inode->i_mutex); | 361 | mutex_lock(&parent->d_inode->i_mutex); |
362 | __debugfs_remove(dentry, parent); | 362 | ret = __debugfs_remove(dentry, parent); |
363 | mutex_unlock(&parent->d_inode->i_mutex); | 363 | mutex_unlock(&parent->d_inode->i_mutex); |
364 | simple_release_fs(&debugfs_mount, &debugfs_mount_count); | 364 | if (!ret) |
365 | simple_release_fs(&debugfs_mount, &debugfs_mount_count); | ||
365 | } | 366 | } |
366 | EXPORT_SYMBOL_GPL(debugfs_remove); | 367 | EXPORT_SYMBOL_GPL(debugfs_remove); |
367 | 368 | ||
@@ -539,17 +540,5 @@ static int __init debugfs_init(void) | |||
539 | 540 | ||
540 | return retval; | 541 | return retval; |
541 | } | 542 | } |
542 | |||
543 | static void __exit debugfs_exit(void) | ||
544 | { | ||
545 | debugfs_registered = false; | ||
546 | |||
547 | simple_release_fs(&debugfs_mount, &debugfs_mount_count); | ||
548 | unregister_filesystem(&debug_fs_type); | ||
549 | kobject_put(debug_kobj); | ||
550 | } | ||
551 | |||
552 | core_initcall(debugfs_init); | 543 | core_initcall(debugfs_init); |
553 | module_exit(debugfs_exit); | ||
554 | MODULE_LICENSE("GPL"); | ||
555 | 544 | ||