diff options
author | Tsutomu Itoh <t-itoh@jp.fujitsu.com> | 2013-12-12 19:51:42 -0500 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2014-01-28 16:19:56 -0500 |
commit | 5662344b3c0d9ddd9afd48716d795166f982d5e2 (patch) | |
tree | f96a684a9d279e0d283ace433f4f72c9c9959d66 | |
parent | 783577663507411e36e459390ef056556e93ef29 (diff) |
Btrfs: fix error check of btrfs_lookup_dentry()
Clean up btrfs_lookup_dentry() to never return NULL, but PTR_ERR(-ENOENT)
instead. This keeps the return value convention consistent.
Callers who use btrfs_lookup_dentry() require a trivial update.
create_snapshot() in particular looks like it can also lose a BUG_ON(!inode)
which is not really needed - there seems less harm in returning ENOENT to
userspace at that point in the stack than there is to crash the machine.
Signed-off-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
Signed-off-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: Chris Mason <clm@fb.com>
-rw-r--r-- | fs/btrfs/inode.c | 15 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 13 |
2 files changed, 21 insertions, 7 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index e889779c9b37..2bd4f7590c83 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -4992,7 +4992,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
4992 | return ERR_PTR(ret); | 4992 | return ERR_PTR(ret); |
4993 | 4993 | ||
4994 | if (location.objectid == 0) | 4994 | if (location.objectid == 0) |
4995 | return NULL; | 4995 | return ERR_PTR(-ENOENT); |
4996 | 4996 | ||
4997 | if (location.type == BTRFS_INODE_ITEM_KEY) { | 4997 | if (location.type == BTRFS_INODE_ITEM_KEY) { |
4998 | inode = btrfs_iget(dir->i_sb, &location, root, NULL); | 4998 | inode = btrfs_iget(dir->i_sb, &location, root, NULL); |
@@ -5056,10 +5056,17 @@ static void btrfs_dentry_release(struct dentry *dentry) | |||
5056 | static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry, | 5056 | static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry, |
5057 | unsigned int flags) | 5057 | unsigned int flags) |
5058 | { | 5058 | { |
5059 | struct dentry *ret; | 5059 | struct inode *inode; |
5060 | 5060 | ||
5061 | ret = d_splice_alias(btrfs_lookup_dentry(dir, dentry), dentry); | 5061 | inode = btrfs_lookup_dentry(dir, dentry); |
5062 | return ret; | 5062 | if (IS_ERR(inode)) { |
5063 | if (PTR_ERR(inode) == -ENOENT) | ||
5064 | inode = NULL; | ||
5065 | else | ||
5066 | return ERR_CAST(inode); | ||
5067 | } | ||
5068 | |||
5069 | return d_splice_alias(inode, dentry); | ||
5063 | } | 5070 | } |
5064 | 5071 | ||
5065 | unsigned char btrfs_filetype_table[] = { | 5072 | unsigned char btrfs_filetype_table[] = { |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 60d3d37ef9a2..89c2f6169b92 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -393,6 +393,7 @@ static noinline int create_subvol(struct inode *dir, | |||
393 | struct btrfs_root *new_root; | 393 | struct btrfs_root *new_root; |
394 | struct btrfs_block_rsv block_rsv; | 394 | struct btrfs_block_rsv block_rsv; |
395 | struct timespec cur_time = CURRENT_TIME; | 395 | struct timespec cur_time = CURRENT_TIME; |
396 | struct inode *inode; | ||
396 | int ret; | 397 | int ret; |
397 | int err; | 398 | int err; |
398 | u64 objectid; | 399 | u64 objectid; |
@@ -554,8 +555,14 @@ fail: | |||
554 | if (err && !ret) | 555 | if (err && !ret) |
555 | ret = err; | 556 | ret = err; |
556 | 557 | ||
557 | if (!ret) | 558 | if (!ret) { |
558 | d_instantiate(dentry, btrfs_lookup_dentry(dir, dentry)); | 559 | inode = btrfs_lookup_dentry(dir, dentry); |
560 | if (IS_ERR(inode)) { | ||
561 | ret = PTR_ERR(inode); | ||
562 | goto out; | ||
563 | } | ||
564 | d_instantiate(dentry, inode); | ||
565 | } | ||
559 | out: | 566 | out: |
560 | btrfs_subvolume_release_metadata(root, &block_rsv, qgroup_reserved); | 567 | btrfs_subvolume_release_metadata(root, &block_rsv, qgroup_reserved); |
561 | return ret; | 568 | return ret; |
@@ -643,7 +650,7 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir, | |||
643 | ret = PTR_ERR(inode); | 650 | ret = PTR_ERR(inode); |
644 | goto fail; | 651 | goto fail; |
645 | } | 652 | } |
646 | BUG_ON(!inode); | 653 | |
647 | d_instantiate(dentry, inode); | 654 | d_instantiate(dentry, inode); |
648 | ret = 0; | 655 | ret = 0; |
649 | fail: | 656 | fail: |