diff options
Diffstat (limited to 'fs/debugfs/inode.c')
-rw-r--r-- | fs/debugfs/inode.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index b1e7f35f3cd4..2905dd160575 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c | |||
@@ -27,9 +27,14 @@ | |||
27 | #include <linux/parser.h> | 27 | #include <linux/parser.h> |
28 | #include <linux/magic.h> | 28 | #include <linux/magic.h> |
29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
30 | #include <linux/srcu.h> | ||
31 | |||
32 | #include "internal.h" | ||
30 | 33 | ||
31 | #define DEBUGFS_DEFAULT_MODE 0700 | 34 | #define DEBUGFS_DEFAULT_MODE 0700 |
32 | 35 | ||
36 | DEFINE_SRCU(debugfs_srcu); | ||
37 | |||
33 | static struct vfsmount *debugfs_mount; | 38 | static struct vfsmount *debugfs_mount; |
34 | static int debugfs_mount_count; | 39 | static int debugfs_mount_count; |
35 | static bool debugfs_registered; | 40 | static bool debugfs_registered; |
@@ -341,8 +346,12 @@ struct dentry *debugfs_create_file(const char *name, umode_t mode, | |||
341 | return failed_creating(dentry); | 346 | return failed_creating(dentry); |
342 | 347 | ||
343 | inode->i_mode = mode; | 348 | inode->i_mode = mode; |
344 | inode->i_fop = fops ? fops : &debugfs_file_operations; | ||
345 | inode->i_private = data; | 349 | inode->i_private = data; |
350 | |||
351 | inode->i_fop = fops ? &debugfs_open_proxy_file_operations | ||
352 | : &debugfs_noop_file_operations; | ||
353 | dentry->d_fsdata = (void *)fops; | ||
354 | |||
346 | d_instantiate(dentry, inode); | 355 | d_instantiate(dentry, inode); |
347 | fsnotify_create(d_inode(dentry->d_parent), dentry); | 356 | fsnotify_create(d_inode(dentry->d_parent), dentry); |
348 | return end_creating(dentry); | 357 | return end_creating(dentry); |
@@ -570,6 +579,7 @@ void debugfs_remove(struct dentry *dentry) | |||
570 | inode_unlock(d_inode(parent)); | 579 | inode_unlock(d_inode(parent)); |
571 | if (!ret) | 580 | if (!ret) |
572 | simple_release_fs(&debugfs_mount, &debugfs_mount_count); | 581 | simple_release_fs(&debugfs_mount, &debugfs_mount_count); |
582 | synchronize_srcu(&debugfs_srcu); | ||
573 | } | 583 | } |
574 | EXPORT_SYMBOL_GPL(debugfs_remove); | 584 | EXPORT_SYMBOL_GPL(debugfs_remove); |
575 | 585 | ||
@@ -647,6 +657,7 @@ void debugfs_remove_recursive(struct dentry *dentry) | |||
647 | if (!__debugfs_remove(child, parent)) | 657 | if (!__debugfs_remove(child, parent)) |
648 | simple_release_fs(&debugfs_mount, &debugfs_mount_count); | 658 | simple_release_fs(&debugfs_mount, &debugfs_mount_count); |
649 | inode_unlock(d_inode(parent)); | 659 | inode_unlock(d_inode(parent)); |
660 | synchronize_srcu(&debugfs_srcu); | ||
650 | } | 661 | } |
651 | EXPORT_SYMBOL_GPL(debugfs_remove_recursive); | 662 | EXPORT_SYMBOL_GPL(debugfs_remove_recursive); |
652 | 663 | ||