Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1498237 > unrolled thread

[PATCH 1/2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUGFS_FS

Started byArnd Bergmann <arnd@arndb.de>
First post2016-10-10 13:20 +0200
Last post2016-10-21 11:30 +0200
Articles 6 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 1/2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUGFS_FS Arnd Bergmann <arnd@arndb.de> - 2016-10-10 13:20 +0200
    Re: [PATCH 1/2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUGFS_FS Nicolai Stange <nicstange@gmail.com> - 2016-10-13 12:10 +0200
      Re: [PATCH 1/2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUGFS_FS Arnd Bergmann <arnd@arndb.de> - 2016-10-13 12:40 +0200
        Re: [PATCH 1/2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUGFS_FS Nicolai Stange <nicstange@gmail.com> - 2016-10-13 12:50 +0200
        [PATCH v2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUG_FS Nicolai Stange <nicstange@gmail.com> - 2016-10-20 22:10 +0200
          Re: [PATCH v2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for  !CONFIG_DEBUG_FS Andy Shevchenko <andriy.shevchenko@linux.intel.com> - 2016-10-21 11:30 +0200

#1498237 — [PATCH 1/2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUGFS_FS

FromArnd Bergmann <arnd@arndb.de>
Date2016-10-10 13:20 +0200
Subject[PATCH 1/2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUGFS_FS
Message-ID<sqGMF-zG-3@gated-at.bofh.it>
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_DEBUGFS_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>
---
 include/linux/debugfs.h | 43 ++++++++++++++++++++-----------------------
 1 file changed, 20 insertions(+), 23 deletions(-)

diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h
index 4d3f0d1aec73..e94f5f8dced3 100644
--- a/include/linux/debugfs.h
+++ b/include/linux/debugfs.h
@@ -62,6 +62,26 @@ static inline const struct file_operations *debugfs_real_fops(struct file *filp)
 	return filp->f_path.dentry->d_fsdata;
 }
 
+ssize_t debugfs_attr_read(struct file *file, char __user *buf,
+			size_t len, loff_t *ppos);
+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,					\
+}
+
 #if defined(CONFIG_DEBUG_FS)
 
 struct dentry *debugfs_create_file(const char *name, umode_t mode,
@@ -94,26 +114,6 @@ int debugfs_use_file_start(const struct dentry *dentry, int *srcu_idx)
 
 void debugfs_use_file_finish(int srcu_idx) __releases(&debugfs_srcu);
 
-ssize_t debugfs_attr_read(struct file *file, char __user *buf,
-			size_t len, loff_t *ppos);
-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,9 +233,6 @@ 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 struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
                 struct dentry *new_dir, char *new_name)
 {
-- 
2.9.0

[toc] | [next] | [standalone]


#1500133

FromNicolai Stange <nicstange@gmail.com>
Date2016-10-13 12:10 +0200
Message-ID<srL7z-24J-1@gated-at.bofh.it>
In reply to#1498237
Hi Arnd,

thanks for this (and sorry for the late reply)!

Arnd Bergmann <arnd@arndb.de> writes:

> 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_DEBUGFS_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>
> ---
>  include/linux/debugfs.h | 43 ++++++++++++++++++++-----------------------
>  1 file changed, 20 insertions(+), 23 deletions(-)
>
> diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h
> index 4d3f0d1aec73..e94f5f8dced3 100644
> --- a/include/linux/debugfs.h
> +++ b/include/linux/debugfs.h
> @@ -62,6 +62,26 @@ static inline const struct file_operations *debugfs_real_fops(struct file *filp)
>  	return filp->f_path.dentry->d_fsdata;
>  }
>  
> +ssize_t debugfs_attr_read(struct file *file, char __user *buf,
> +			size_t len, loff_t *ppos);
> +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,					\

This depends on GCC dead code elimination to always work for this
situation, otherwise we'd get undefined references to
debugfs_attr_read/write(), right?

In order to avoid having to test your patch against all those older
versions of GCC, can we have a safety net here and define some dummy
debugfs_attr_read/write() for the !CONFIG_DEBUGFS case?

If nothing else, it would IMHO make the !CONFIG_DEBUGFS case more
understandable because one had not to figure out that this actually
relies on dead code elimination to work.

Thanks,

Nicolai

[toc] | [prev] | [next] | [standalone]


#1500150

FromArnd Bergmann <arnd@arndb.de>
Date2016-10-13 12:40 +0200
Message-ID<srLAC-2i4-11@gated-at.bofh.it>
In reply to#1500133
On Thursday, October 13, 2016 11:59:54 AM CEST Nicolai Stange wrote:
> >  
> > +ssize_t debugfs_attr_read(struct file *file, char __user *buf,
> > +                     size_t len, loff_t *ppos);
> > +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,                                  \
> 
> This depends on GCC dead code elimination to always work for this
> situation, otherwise we'd get undefined references to
> debugfs_attr_read/write(), right?

Correct.

> In order to avoid having to test your patch against all those older
> versions of GCC, can we have a safety net here and define some dummy
> debugfs_attr_read/write() for the !CONFIG_DEBUGFS case?

The question of dead-code elimination in older gcc versions comes up
occasionally, and I think all versions that are able to build the
kernel these days get this right all the time, otherwise any code
using IS_ENABLED() helpers to control the calling of external interfaces
would be broken.

We could probably use that macro here if you think that's better
and do:

static const struct file_operations __fops = {
    .owner   = THIS_MODULE,
    .open    = IS_ENABLED(CONFIG_DEBUGFS_FS) ? __fops ## _open : NULL,                                     
    ...

> If nothing else, it would IMHO make the !CONFIG_DEBUGFS case more
> understandable because one had not to figure out that this actually
> relies on dead code elimination to work.

Sure, that's fine. Can you do the new version of that patch with
the change then?

	Arnd

[toc] | [prev] | [next] | [standalone]


#1500154

FromNicolai Stange <nicstange@gmail.com>
Date2016-10-13 12:50 +0200
Message-ID<srLKh-2lV-11@gated-at.bofh.it>
In reply to#1500150
Arnd Bergmann <arnd@arndb.de> writes:

> On Thursday, October 13, 2016 11:59:54 AM CEST Nicolai Stange wrote:
>> >  
>> > +ssize_t debugfs_attr_read(struct file *file, char __user *buf,
>> > +                     size_t len, loff_t *ppos);
>> > +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,                                  \
>> 
>> This depends on GCC dead code elimination to always work for this
>> situation, otherwise we'd get undefined references to
>> debugfs_attr_read/write(), right?
>
> Correct.
>
>> In order to avoid having to test your patch against all those older
>> versions of GCC, can we have a safety net here and define some dummy
>> debugfs_attr_read/write() for the !CONFIG_DEBUGFS case?
>
> The question of dead-code elimination in older gcc versions comes up
> occasionally, and I think all versions that are able to build the
> kernel these days get this right all the time, otherwise any code
> using IS_ENABLED() helpers to control the calling of external interfaces
> would be broken.
>
> We could probably use that macro here if you think that's better
> and do:
>
> static const struct file_operations __fops = {
>     .owner   = THIS_MODULE,
>     .open    = IS_ENABLED(CONFIG_DEBUGFS_FS) ? __fops ## _open : NULL,                                     
>     ...
>
>> If nothing else, it would IMHO make the !CONFIG_DEBUGFS case more
>> understandable because one had not to figure out that this actually
>> relies on dead code elimination to work.
>
> Sure, that's fine. Can you do the new version of that patch with
> the change then?

I'd be happy to (won't be able to do this before tomorrow though).

Thanks,

Nicolai

[toc] | [prev] | [next] | [standalone]


#1505226 — [PATCH v2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUG_FS

FromNicolai Stange <nicstange@gmail.com>
Date2016-10-20 22:10 +0200
Subject[PATCH v2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUG_FS
Message-ID<surP4-3PX-31@gated-at.bofh.it>
In reply to#1500150
From: Arnd Bergmann <arnd@arndb.de>

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>
---
Compile-tested on top of next-20161020 with gcc-4.9.0 and gcc-6.2.1,
CONFIG_INTEL_PMC_CORE=y and both, CONFIG_DEBUG_FS=n and CONFIG_DEBUG_FS=y.

I verified that there isn't anything in the intel_pmc_core.o that shouldn'tbe there with CONFIG_DEBUG_FS=n.

Changes to v1:
 - Add dummy implementations of debugfs_attr_read()/debugfs_attr_write()
   for the CONFIG_DEBUG_FS=n case.
 - Fix a typo in the changelog.


 include/linux/debugfs.h | 44 +++++++++++++++++++++++++++-----------------
 1 file changed, 27 insertions(+), 17 deletions(-)

diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h
index 4d3f0d1..1b413a9 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

[toc] | [prev] | [next] | [standalone]


#1505662 — Re: [PATCH v2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUG_FS

FromAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Date2016-10-21 11:30 +0200
SubjectRe: [PATCH v2] debugfs: improve DEFINE_DEBUGFS_ATTRIBUTE for !CONFIG_DEBUG_FS
Message-ID<suEjg-3AW-39@gated-at.bofh.it>
In reply to#1505226
On Thu, 2016-10-20 at 22:07 +0200, Nicolai Stange wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> 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.

Thanks for the fix! Looks good to me.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> 
> 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>
> ---
> Compile-tested on top of next-20161020 with gcc-4.9.0 and gcc-6.2.1,
> CONFIG_INTEL_PMC_CORE=y and both, CONFIG_DEBUG_FS=n and
> CONFIG_DEBUG_FS=y.
> 
> I verified that there isn't anything in the intel_pmc_core.o that
> shouldn'tbe there with CONFIG_DEBUG_FS=n.
> 
> Changes to v1:
>  - Add dummy implementations of
> debugfs_attr_read()/debugfs_attr_write()
>    for the CONFIG_DEBUG_FS=n case.
>  - Fix a typo in the changelog.
> 
> 
>  include/linux/debugfs.h | 44 +++++++++++++++++++++++++++-------------
> ----
>  1 file changed, 27 insertions(+), 17 deletions(-)
> 
> diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h
> index 4d3f0d1..1b413a9 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)

-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web