diff options
Diffstat (limited to 'fs/debugfs/file.c')
| -rw-r--r-- | fs/debugfs/file.c | 41 | 
1 files changed, 25 insertions, 16 deletions
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index db987b5110a9..ae49a55bda00 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c @@ -18,6 +18,7 @@  #include <linux/slab.h>  #include <linux/atomic.h>  #include <linux/device.h> +#include <linux/pm_runtime.h>  #include <linux/poll.h>  #include <linux/security.h> @@ -175,8 +176,13 @@ static int open_proxy_open(struct inode *inode, struct file *filp)  	if (r)  		goto out; -	real_fops = fops_get(real_fops); -	if (!real_fops) { +	if (!fops_get(real_fops)) { +#ifdef MODULE +		if (real_fops->owner && +		    real_fops->owner->state == MODULE_STATE_GOING) +			goto out; +#endif +  		/* Huh? Module did not clean up after itself at exit? */  		WARN(1, "debugfs file owner did not clean up at exit: %pd",  			dentry); @@ -305,8 +311,13 @@ static int full_proxy_open(struct inode *inode, struct file *filp)  	if (r)  		goto out; -	real_fops = fops_get(real_fops); -	if (!real_fops) { +	if (!fops_get(real_fops)) { +#ifdef MODULE +		if (real_fops->owner && +		    real_fops->owner->state == MODULE_STATE_GOING) +			goto out; +#endif +  		/* Huh? Module did not cleanup after itself at exit? */  		WARN(1, "debugfs file owner did not clean up at exit: %pd",  			dentry); @@ -495,20 +506,11 @@ DEFINE_DEBUGFS_ATTRIBUTE(fops_u32_wo, NULL, debugfs_u32_set, "%llu\n");   * This function creates a file in debugfs with the given name that   * contains the value of the variable @value.  If the @mode variable is so   * set, it can be read from, and written to. - * - * This function will return a pointer to a dentry if it succeeds.  This - * pointer must be passed to the debugfs_remove() function when the file is - * to be removed (no automatic cleanup happens if your module is unloaded, - * you are responsible here.)  If an error occurs, ERR_PTR(-ERROR) will be - * returned. - * - * If debugfs is not enabled in the kernel, the value ERR_PTR(-ENODEV) will - * be returned.   */ -struct dentry *debugfs_create_u32(const char *name, umode_t mode, -				 struct dentry *parent, u32 *value) +void debugfs_create_u32(const char *name, umode_t mode, struct dentry *parent, +			u32 *value)  { -	return debugfs_create_mode_unsafe(name, mode, parent, value, &fops_u32, +	debugfs_create_mode_unsafe(name, mode, parent, value, &fops_u32,  				   &fops_u32_ro, &fops_u32_wo);  }  EXPORT_SYMBOL_GPL(debugfs_create_u32); @@ -1060,7 +1062,14 @@ static int debugfs_show_regset32(struct seq_file *s, void *data)  {  	struct debugfs_regset32 *regset = s->private; +	if (regset->dev) +		pm_runtime_get_sync(regset->dev); +  	debugfs_print_regs32(s, regset->regs, regset->nregs, regset->base, ""); + +	if (regset->dev) +		pm_runtime_put(regset->dev); +  	return 0;  }  |