All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] btrfs: Handle NULL inode return from btrfs_lookup_dentry()
@ 2011-08-05 16:48 Mark Fasheh
  2011-08-09  4:45 ` Tsutomu Itoh
  0 siblings, 1 reply; 2+ messages in thread
From: Mark Fasheh @ 2011-08-05 16:48 UTC (permalink / raw)
  To: linux-btrfs; +Cc: chris.mason

Right now in create_snapshot(), we'll BUG() if btrfs_lookup_dentry() returns
a NULL inode (negative dentry). Getting a negative dentry here probably
isn't ever expected to happen however two things lead me to believe that we
should trap this anyway:

- I don't see any possiblity of serious fs corruption from handling the
  error.  I do wonder though if we could have an "orphaned" snapshot?  Even
  if we did that doesn't strike me as needing to crash the machine. (Q:
  Perhaps going read-only is the eventual solution here?)

- It's very trivial to pass an -ENOENT back to userspace as we're pretty
  high up the call path at this point.

Signed-off-by: Mark Fasheh <mfasheh@suse.com>
---
 fs/btrfs/ioctl.c |    8 +++++---
 1 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 7cf0133..fc9525f 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -498,14 +498,16 @@ static int create_snapshot(struct btrfs_root *root, struct dentry *dentry,
 	if (ret)
 		goto fail;
 
+	ret = 0;
 	inode = btrfs_lookup_dentry(dentry->d_parent->d_inode, dentry);
 	if (IS_ERR(inode)) {
 		ret = PTR_ERR(inode);
 		goto fail;
-	}
-	BUG_ON(!inode);
+	} else if (inode == NULL)
+		ret = -ENOENT;
+
 	d_instantiate(dentry, inode);
-	ret = 0;
+
 fail:
 	kfree(pending_snapshot);
 	return ret;
-- 
1.7.6


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

* Re: [PATCH] btrfs: Handle NULL inode return from btrfs_lookup_dentry()
  2011-08-05 16:48 [PATCH] btrfs: Handle NULL inode return from btrfs_lookup_dentry() Mark Fasheh
@ 2011-08-09  4:45 ` Tsutomu Itoh
  0 siblings, 0 replies; 2+ messages in thread
From: Tsutomu Itoh @ 2011-08-09  4:45 UTC (permalink / raw)
  To: Mark Fasheh; +Cc: linux-btrfs, chris.mason

Hi, Mark,

(2011/08/06 1:48), Mark Fasheh wrote:
> Right now in create_snapshot(), we'll BUG() if btrfs_lookup_dentry() returns
> a NULL inode (negative dentry). Getting a negative dentry here probably
> isn't ever expected to happen however two things lead me to believe that we
> should trap this anyway:
> 
> - I don't see any possiblity of serious fs corruption from handling the
>   error.  I do wonder though if we could have an "orphaned" snapshot?  Even
>   if we did that doesn't strike me as needing to crash the machine. (Q:
>   Perhaps going read-only is the eventual solution here?)
> 
> - It's very trivial to pass an -ENOENT back to userspace as we're pretty
>   high up the call path at this point.

I have already posted the same purpose patch. Please look at the following.

 http://marc.info/?l=linux-btrfs&m=130932339824237&w=2

Thanks,
Tsutomu

> 
> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
> ---
>  fs/btrfs/ioctl.c |    8 +++++---
>  1 files changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
> index 7cf0133..fc9525f 100644
> --- a/fs/btrfs/ioctl.c
> +++ b/fs/btrfs/ioctl.c
> @@ -498,14 +498,16 @@ static int create_snapshot(struct btrfs_root *root, struct dentry *dentry,
>  	if (ret)
>  		goto fail;
>  
> +	ret = 0;
>  	inode = btrfs_lookup_dentry(dentry->d_parent->d_inode, dentry);
>  	if (IS_ERR(inode)) {
>  		ret = PTR_ERR(inode);
>  		goto fail;
> -	}
> -	BUG_ON(!inode);
> +	} else if (inode == NULL)
> +		ret = -ENOENT;
> +
>  	d_instantiate(dentry, inode);
> -	ret = 0;
> +
>  fail:
>  	kfree(pending_snapshot);
>  	return ret;



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

end of thread, other threads:[~2011-08-09  4:45 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-05 16:48 [PATCH] btrfs: Handle NULL inode return from btrfs_lookup_dentry() Mark Fasheh
2011-08-09  4:45 ` Tsutomu Itoh

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.