aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTsutomu Itoh <t-itoh@jp.fujitsu.com>2013-12-12 19:51:42 -0500
committerChris Mason <clm@fb.com>2014-01-28 16:19:56 -0500
commit5662344b3c0d9ddd9afd48716d795166f982d5e2 (patch)
treef96a684a9d279e0d283ace433f4f72c9c9959d66
parent783577663507411e36e459390ef056556e93ef29 (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.c15
-rw-r--r--fs/btrfs/ioctl.c13
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)
5056static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry, 5056static 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
5065unsigned char btrfs_filetype_table[] = { 5072unsigned 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 }
559out: 566out:
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;
649fail: 656fail: