| From 218b681aa65d4722701e238b521a149b9029bd59 Mon Sep 17 00:00:00 2001 |
| From: Arnd Bergmann <arnd@arndb.de> |
| Date: Thu, 20 Oct 2016 22:07:53 +0200 |
| Subject: [PATCH] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for |
| !CONFIG_DEBUG_FS |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit 7f847dd31736f1284538e54f46cf10e63929eb7f upstream. |
| |
| The slp_s0_residency_usec debugfs file currently uses |
| DEFINE_DEBUGFS_ATTRIBUTE(), but that macro cannot really be used to |
| define files outside of the debugfs code, as it has no reference to |
| the get/set functions if CONFIG_DEBUG_FS is not defined: |
| |
| drivers/platform/x86/intel_pmc_core.c:80:12: error: ‘pmc_core_dev_state_get’ defined but not used [-Werror=unused-function] |
| |
| This fixes the macro to always contain the reference, and instead rely |
| on the stubbed-out debugfs_create_file to not actually refer to |
| its arguments so the compiler can still drop the reference. |
| This works because the attribute definition is always 'static', |
| and the dead-code removal silently drops all static symbols |
| that are not used. |
| |
| Fixes: c64688081490 ("debugfs: add support for self-protecting attribute file fops") |
| Fixes: df2294fb6428 ("intel_pmc_core: Convert to DEFINE_DEBUGFS_ATTRIBUTE") |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| [nicstange@gmail.com: Add dummy implementations of debugfs_attr_read() and |
| debugfs_attr_write() in order to protect against possibly broken dead |
| code elimination and to improve readability. |
| Correct CONFIG_DEBUGFS_FS -> CONFIG_DEBUG_FS typo in changelog.] |
| Signed-off-by: Nicolai Stange <nicstange@gmail.com> |
| Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h |
| index 4d3f0d1aec73..1b413a9aab81 100644 |
| --- a/include/linux/debugfs.h |
| +++ b/include/linux/debugfs.h |
| @@ -62,6 +62,21 @@ static inline const struct file_operations *debugfs_real_fops(struct file *filp) |
| return filp->f_path.dentry->d_fsdata; |
| } |
| |
| +#define DEFINE_DEBUGFS_ATTRIBUTE(__fops, __get, __set, __fmt) \ |
| +static int __fops ## _open(struct inode *inode, struct file *file) \ |
| +{ \ |
| + __simple_attr_check_format(__fmt, 0ull); \ |
| + return simple_attr_open(inode, file, __get, __set, __fmt); \ |
| +} \ |
| +static const struct file_operations __fops = { \ |
| + .owner = THIS_MODULE, \ |
| + .open = __fops ## _open, \ |
| + .release = simple_attr_release, \ |
| + .read = debugfs_attr_read, \ |
| + .write = debugfs_attr_write, \ |
| + .llseek = generic_file_llseek, \ |
| +} |
| + |
| #if defined(CONFIG_DEBUG_FS) |
| |
| struct dentry *debugfs_create_file(const char *name, umode_t mode, |
| @@ -99,21 +114,6 @@ ssize_t debugfs_attr_read(struct file *file, char __user *buf, |
| ssize_t debugfs_attr_write(struct file *file, const char __user *buf, |
| size_t len, loff_t *ppos); |
| |
| -#define DEFINE_DEBUGFS_ATTRIBUTE(__fops, __get, __set, __fmt) \ |
| -static int __fops ## _open(struct inode *inode, struct file *file) \ |
| -{ \ |
| - __simple_attr_check_format(__fmt, 0ull); \ |
| - return simple_attr_open(inode, file, __get, __set, __fmt); \ |
| -} \ |
| -static const struct file_operations __fops = { \ |
| - .owner = THIS_MODULE, \ |
| - .open = __fops ## _open, \ |
| - .release = simple_attr_release, \ |
| - .read = debugfs_attr_read, \ |
| - .write = debugfs_attr_write, \ |
| - .llseek = generic_file_llseek, \ |
| -} |
| - |
| struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry, |
| struct dentry *new_dir, const char *new_name); |
| |
| @@ -233,8 +233,18 @@ static inline void debugfs_use_file_finish(int srcu_idx) |
| __releases(&debugfs_srcu) |
| { } |
| |
| -#define DEFINE_DEBUGFS_ATTRIBUTE(__fops, __get, __set, __fmt) \ |
| - static const struct file_operations __fops = { 0 } |
| +static inline ssize_t debugfs_attr_read(struct file *file, char __user *buf, |
| + size_t len, loff_t *ppos) |
| +{ |
| + return -ENODEV; |
| +} |
| + |
| +static inline ssize_t debugfs_attr_write(struct file *file, |
| + const char __user *buf, |
| + size_t len, loff_t *ppos) |
| +{ |
| + return -ENODEV; |
| +} |
| |
| static inline struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry, |
| struct dentry *new_dir, char *new_name) |
| -- |
| 2.10.1 |
| |