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>
This commit is contained in:
parent
7835776635
commit
5662344b3c
|
@ -4992,7 +4992,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry)
|
|||
return ERR_PTR(ret);
|
||||
|
||||
if (location.objectid == 0)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
if (location.type == BTRFS_INODE_ITEM_KEY) {
|
||||
inode = btrfs_iget(dir->i_sb, &location, root, NULL);
|
||||
|
@ -5056,10 +5056,17 @@ static void btrfs_dentry_release(struct dentry *dentry)
|
|||
static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct dentry *ret;
|
||||
struct inode *inode;
|
||||
|
||||
ret = d_splice_alias(btrfs_lookup_dentry(dir, dentry), dentry);
|
||||
return ret;
|
||||
inode = btrfs_lookup_dentry(dir, dentry);
|
||||
if (IS_ERR(inode)) {
|
||||
if (PTR_ERR(inode) == -ENOENT)
|
||||
inode = NULL;
|
||||
else
|
||||
return ERR_CAST(inode);
|
||||
}
|
||||
|
||||
return d_splice_alias(inode, dentry);
|
||||
}
|
||||
|
||||
unsigned char btrfs_filetype_table[] = {
|
||||
|
|
|
@ -393,6 +393,7 @@ static noinline int create_subvol(struct inode *dir,
|
|||
struct btrfs_root *new_root;
|
||||
struct btrfs_block_rsv block_rsv;
|
||||
struct timespec cur_time = CURRENT_TIME;
|
||||
struct inode *inode;
|
||||
int ret;
|
||||
int err;
|
||||
u64 objectid;
|
||||
|
@ -554,8 +555,14 @@ fail:
|
|||
if (err && !ret)
|
||||
ret = err;
|
||||
|
||||
if (!ret)
|
||||
d_instantiate(dentry, btrfs_lookup_dentry(dir, dentry));
|
||||
if (!ret) {
|
||||
inode = btrfs_lookup_dentry(dir, dentry);
|
||||
if (IS_ERR(inode)) {
|
||||
ret = PTR_ERR(inode);
|
||||
goto out;
|
||||
}
|
||||
d_instantiate(dentry, inode);
|
||||
}
|
||||
out:
|
||||
btrfs_subvolume_release_metadata(root, &block_rsv, qgroup_reserved);
|
||||
return ret;
|
||||
|
@ -643,7 +650,7 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir,
|
|||
ret = PTR_ERR(inode);
|
||||
goto fail;
|
||||
}
|
||||
BUG_ON(!inode);
|
||||
|
||||
d_instantiate(dentry, inode);
|
||||
ret = 0;
|
||||
fail:
|
||||
|
|
Loading…
Reference in New Issue