linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] mm/backing-dev: Check return value of the debugfs_create_dir()
@ 2015-08-25  7:54 Alexander Kuleshov
  2015-08-25  8:32 ` Jan Kara
  2015-08-25 21:08 ` Andrew Morton
  0 siblings, 2 replies; 5+ messages in thread
From: Alexander Kuleshov @ 2015-08-25  7:54 UTC (permalink / raw)
  To: Andrew Morton, Tejun Heo, Jan Kara
  Cc: linux-mm, linux-kernel, Alexander Kuleshov

The debugfs_create_dir() function may fail and return error. If the
root directory not created, we can't create anything inside it. This
patch adds check for this case.

Signed-off-by: Alexander Kuleshov <kuleshovmail@gmail.com>
---
 mm/backing-dev.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index dac5bf5..518d26a 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -117,15 +117,21 @@ static const struct file_operations bdi_debug_stats_fops = {
 
 static void bdi_debug_register(struct backing_dev_info *bdi, const char *name)
 {
-	bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root);
-	bdi->debug_stats = debugfs_create_file("stats", 0444, bdi->debug_dir,
-					       bdi, &bdi_debug_stats_fops);
+	if (bdi_debug_root) {
+		bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root);
+		if (bdi->debug_dir)
+			bdi->debug_stats = debugfs_create_file("stats", 0444,
+							bdi->debug_dir, bdi,
+							&bdi_debug_stats_fops);
+	}
 }
 
 static void bdi_debug_unregister(struct backing_dev_info *bdi)
 {
-	debugfs_remove(bdi->debug_stats);
-	debugfs_remove(bdi->debug_dir);
+	if (bdi_debug_root) {
+		debugfs_remove(bdi->debug_stats);
+		debugfs_remove(bdi->debug_dir);
+	}
 }
 #else
 static inline void bdi_debug_init(void)
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] mm/backing-dev: Check return value of the debugfs_create_dir()
  2015-08-25  7:54 [PATCH] mm/backing-dev: Check return value of the debugfs_create_dir() Alexander Kuleshov
@ 2015-08-25  8:32 ` Jan Kara
  2015-08-25 21:08 ` Andrew Morton
  1 sibling, 0 replies; 5+ messages in thread
From: Jan Kara @ 2015-08-25  8:32 UTC (permalink / raw)
  To: Alexander Kuleshov
  Cc: Andrew Morton, Tejun Heo, Jan Kara, linux-mm, linux-kernel

On Tue 25-08-15 13:54:23, Alexander Kuleshov wrote:
> The debugfs_create_dir() function may fail and return error. If the
> root directory not created, we can't create anything inside it. This
> patch adds check for this case.
> 
> Signed-off-by: Alexander Kuleshov <kuleshovmail@gmail.com>

The patch looks good to me. You can add:

Reviewed-by: Jan Kara <jack@suse.com>

								Honza
> ---
>  mm/backing-dev.c | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/mm/backing-dev.c b/mm/backing-dev.c
> index dac5bf5..518d26a 100644
> --- a/mm/backing-dev.c
> +++ b/mm/backing-dev.c
> @@ -117,15 +117,21 @@ static const struct file_operations bdi_debug_stats_fops = {
>  
>  static void bdi_debug_register(struct backing_dev_info *bdi, const char *name)
>  {
> -	bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root);
> -	bdi->debug_stats = debugfs_create_file("stats", 0444, bdi->debug_dir,
> -					       bdi, &bdi_debug_stats_fops);
> +	if (bdi_debug_root) {
> +		bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root);
> +		if (bdi->debug_dir)
> +			bdi->debug_stats = debugfs_create_file("stats", 0444,
> +							bdi->debug_dir, bdi,
> +							&bdi_debug_stats_fops);
> +	}
>  }
>  
>  static void bdi_debug_unregister(struct backing_dev_info *bdi)
>  {
> -	debugfs_remove(bdi->debug_stats);
> -	debugfs_remove(bdi->debug_dir);
> +	if (bdi_debug_root) {
> +		debugfs_remove(bdi->debug_stats);
> +		debugfs_remove(bdi->debug_dir);
> +	}
>  }
>  #else
>  static inline void bdi_debug_init(void)
> -- 
> 2.5.0
> 
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] mm/backing-dev: Check return value of the debugfs_create_dir()
  2015-08-25  7:54 [PATCH] mm/backing-dev: Check return value of the debugfs_create_dir() Alexander Kuleshov
  2015-08-25  8:32 ` Jan Kara
@ 2015-08-25 21:08 ` Andrew Morton
  2015-08-26  9:23   ` Jan Kara
  1 sibling, 1 reply; 5+ messages in thread
From: Andrew Morton @ 2015-08-25 21:08 UTC (permalink / raw)
  To: Alexander Kuleshov; +Cc: Tejun Heo, Jan Kara, linux-mm, linux-kernel

On Tue, 25 Aug 2015 13:54:23 +0600 Alexander Kuleshov <kuleshovmail@gmail.com> wrote:

> The debugfs_create_dir() function may fail and return error. If the
> root directory not created, we can't create anything inside it. This
> patch adds check for this case.
> 
> ...
>
> --- a/mm/backing-dev.c
> +++ b/mm/backing-dev.c
> @@ -117,15 +117,21 @@ static const struct file_operations bdi_debug_stats_fops = {
>  
>  static void bdi_debug_register(struct backing_dev_info *bdi, const char *name)
>  {
> -	bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root);
> -	bdi->debug_stats = debugfs_create_file("stats", 0444, bdi->debug_dir,
> -					       bdi, &bdi_debug_stats_fops);
> +	if (bdi_debug_root) {
> +		bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root);
> +		if (bdi->debug_dir)
> +			bdi->debug_stats = debugfs_create_file("stats", 0444,
> +							bdi->debug_dir, bdi,
> +							&bdi_debug_stats_fops);
> +	}

If debugfs_create_dir() fails, debugfs_create_file() will go ahead and
attempt to create the debugfs file in the debugfs root directory:

: static struct dentry *start_creating(const char *name, struct dentry *parent)
: {
: ...
: 	/* If the parent is not specified, we create it in the root.
: 	 * We need the root dentry to do this, which is in the super
: 	 * block. A pointer to that is in the struct vfsmount that we
: 	 * have around.
: 	 */
: 	if (!parent)
: 		parent = debugfs_mount->mnt_root;

I'm not sure that this is very useful behaviour, and putting the files
in the wrong place is a very obscure way of informing the user that
debugfs_create_dir() failed :(


I don't think it's worth making little changes such as this - handling
debugfs failures needs a deeper rethink.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] mm/backing-dev: Check return value of the debugfs_create_dir()
  2015-08-25 21:08 ` Andrew Morton
@ 2015-08-26  9:23   ` Jan Kara
  2015-08-26 10:11     ` Alexander Kuleshov
  0 siblings, 1 reply; 5+ messages in thread
From: Jan Kara @ 2015-08-26  9:23 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Alexander Kuleshov, Tejun Heo, Jan Kara, linux-mm, linux-kernel

On Tue 25-08-15 14:08:58, Andrew Morton wrote:
> On Tue, 25 Aug 2015 13:54:23 +0600 Alexander Kuleshov <kuleshovmail@gmail.com> wrote:
> 
> > The debugfs_create_dir() function may fail and return error. If the
> > root directory not created, we can't create anything inside it. This
> > patch adds check for this case.
> > 
> > ...
> >
> > --- a/mm/backing-dev.c
> > +++ b/mm/backing-dev.c
> > @@ -117,15 +117,21 @@ static const struct file_operations bdi_debug_stats_fops = {
> >  
> >  static void bdi_debug_register(struct backing_dev_info *bdi, const char *name)
> >  {
> > -	bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root);
> > -	bdi->debug_stats = debugfs_create_file("stats", 0444, bdi->debug_dir,
> > -					       bdi, &bdi_debug_stats_fops);
> > +	if (bdi_debug_root) {
> > +		bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root);
> > +		if (bdi->debug_dir)
> > +			bdi->debug_stats = debugfs_create_file("stats", 0444,
> > +							bdi->debug_dir, bdi,
> > +							&bdi_debug_stats_fops);
> > +	}
> 
> If debugfs_create_dir() fails, debugfs_create_file() will go ahead and
> attempt to create the debugfs file in the debugfs root directory:
> 
> : static struct dentry *start_creating(const char *name, struct dentry *parent)
> : {
> : ...
> : 	/* If the parent is not specified, we create it in the root.
> : 	 * We need the root dentry to do this, which is in the super
> : 	 * block. A pointer to that is in the struct vfsmount that we
> : 	 * have around.
> : 	 */
> : 	if (!parent)
> : 		parent = debugfs_mount->mnt_root;
> 
> I'm not sure that this is very useful behaviour, and putting the files
> in the wrong place is a very obscure way of informing the user that
> debugfs_create_dir() failed :(

But this patch actually makes sure that we don't call debugfs_create_dir()
and debugfs_create_file() with parent == NULL so this patch avoids creation
of entries in debugfs root. So IMHO it really improves the situation. And I
agree with you that falling back to debugfs root is just broken...

> I don't think it's worth making little changes such as this - handling
> debugfs failures needs a deeper rethink.

Well, handling debugfs failures like in this patch is the right way to go,
isn't it? Or what else would you imagine than checking for errors and
bailing out instead of trying to create entries in non-existent dirs?

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] mm/backing-dev: Check return value of the debugfs_create_dir()
  2015-08-26  9:23   ` Jan Kara
@ 2015-08-26 10:11     ` Alexander Kuleshov
  0 siblings, 0 replies; 5+ messages in thread
From: Alexander Kuleshov @ 2015-08-26 10:11 UTC (permalink / raw)
  To: Jan Kara; +Cc: Andrew Morton, Tejun Heo, linux-mm, LKML

Hello Jan,

2015-08-26 15:23 GMT+06:00 Jan Kara <jack@suse.cz>:
> Well, handling debugfs failures like in this patch is the right way to go,
> isn't it? Or what else would you imagine than checking for errors and
> bailing out instead of trying to create entries in non-existent dirs?

I think Andrew talks about this thread https://lkml.org/lkml/2015/8/14/555

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2015-08-26 10:12 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-08-25  7:54 [PATCH] mm/backing-dev: Check return value of the debugfs_create_dir() Alexander Kuleshov
2015-08-25  8:32 ` Jan Kara
2015-08-25 21:08 ` Andrew Morton
2015-08-26  9:23   ` Jan Kara
2015-08-26 10:11     ` Alexander Kuleshov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).