mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-21 06:50:25 +00:00
btrfs: remove conditional path allocation in btrfs_read_locked_inode()
Remove conditional path allocation from btrfs_read_locked_inode(). Add an ASSERT(path) to indicate it should never be called with a NULL path. Call btrfs_read_locked_inode() directly from btrfs_iget(). This causes code duplication between btrfs_iget() and btrfs_iget_path(), but I think this is justifiable as it removes the need for conditionally allocating the path inside of btrfs_read_locked_inode(). This makes the code easier to reason about and makes it clear who has the responsibility of allocating and freeing the path. Signed-off-by: Leo Martins <loemra.dev@gmail.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
69673992b1
commit
7c855e16ab
1 changed files with 29 additions and 17 deletions
|
@ -3795,11 +3795,9 @@ static int btrfs_add_inode_to_root(struct btrfs_inode *inode, bool prealloc)
|
||||||
*
|
*
|
||||||
* On failure clean up the inode.
|
* On failure clean up the inode.
|
||||||
*/
|
*/
|
||||||
static int btrfs_read_locked_inode(struct inode *inode,
|
static int btrfs_read_locked_inode(struct inode *inode, struct btrfs_path *path)
|
||||||
struct btrfs_path *in_path)
|
|
||||||
{
|
{
|
||||||
struct btrfs_fs_info *fs_info = inode_to_fs_info(inode);
|
struct btrfs_fs_info *fs_info = inode_to_fs_info(inode);
|
||||||
struct btrfs_path *path = in_path;
|
|
||||||
struct extent_buffer *leaf;
|
struct extent_buffer *leaf;
|
||||||
struct btrfs_inode_item *inode_item;
|
struct btrfs_inode_item *inode_item;
|
||||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||||
|
@ -3819,18 +3817,12 @@ static int btrfs_read_locked_inode(struct inode *inode,
|
||||||
if (!ret)
|
if (!ret)
|
||||||
filled = true;
|
filled = true;
|
||||||
|
|
||||||
if (!path) {
|
ASSERT(path);
|
||||||
path = btrfs_alloc_path();
|
|
||||||
if (!path)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
btrfs_get_inode_key(BTRFS_I(inode), &location);
|
btrfs_get_inode_key(BTRFS_I(inode), &location);
|
||||||
|
|
||||||
ret = btrfs_lookup_inode(NULL, root, path, &location, 0);
|
ret = btrfs_lookup_inode(NULL, root, path, &location, 0);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (path != in_path)
|
|
||||||
btrfs_free_path(path);
|
|
||||||
/*
|
/*
|
||||||
* ret > 0 can come from btrfs_search_slot called by
|
* ret > 0 can come from btrfs_search_slot called by
|
||||||
* btrfs_lookup_inode(), this means the inode was not found.
|
* btrfs_lookup_inode(), this means the inode was not found.
|
||||||
|
@ -3972,8 +3964,6 @@ cache_acl:
|
||||||
btrfs_ino(BTRFS_I(inode)),
|
btrfs_ino(BTRFS_I(inode)),
|
||||||
btrfs_root_id(root), ret);
|
btrfs_root_id(root), ret);
|
||||||
}
|
}
|
||||||
if (path != in_path)
|
|
||||||
btrfs_free_path(path);
|
|
||||||
|
|
||||||
if (!maybe_acls)
|
if (!maybe_acls)
|
||||||
cache_no_acl(inode);
|
cache_no_acl(inode);
|
||||||
|
@ -5579,10 +5569,8 @@ static struct inode *btrfs_iget_locked(u64 ino, struct btrfs_root *root)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get an inode object given its inode number and corresponding root.
|
* Get an inode object given its inode number and corresponding root. Path is
|
||||||
* Path can be preallocated to prevent recursing back to iget through
|
* preallocated to prevent recursing back to iget through allocator.
|
||||||
* allocator. NULL is also valid but may require an additional allocation
|
|
||||||
* later.
|
|
||||||
*/
|
*/
|
||||||
struct inode *btrfs_iget_path(u64 ino, struct btrfs_root *root,
|
struct inode *btrfs_iget_path(u64 ino, struct btrfs_root *root,
|
||||||
struct btrfs_path *path)
|
struct btrfs_path *path)
|
||||||
|
@ -5605,9 +5593,33 @@ struct inode *btrfs_iget_path(u64 ino, struct btrfs_root *root,
|
||||||
return inode;
|
return inode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get an inode object given its inode number and corresponding root.
|
||||||
|
*/
|
||||||
struct inode *btrfs_iget(u64 ino, struct btrfs_root *root)
|
struct inode *btrfs_iget(u64 ino, struct btrfs_root *root)
|
||||||
{
|
{
|
||||||
return btrfs_iget_path(ino, root, NULL);
|
struct inode *inode;
|
||||||
|
struct btrfs_path *path;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
inode = btrfs_iget_locked(ino, root);
|
||||||
|
if (!inode)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
if (!(inode->i_state & I_NEW))
|
||||||
|
return inode;
|
||||||
|
|
||||||
|
path = btrfs_alloc_path();
|
||||||
|
if (!path)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
ret = btrfs_read_locked_inode(inode, path);
|
||||||
|
btrfs_free_path(path);
|
||||||
|
if (ret)
|
||||||
|
return ERR_PTR(ret);
|
||||||
|
|
||||||
|
unlock_new_inode(inode);
|
||||||
|
return inode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct inode *new_simple_dir(struct inode *dir,
|
static struct inode *new_simple_dir(struct inode *dir,
|
||||||
|
|
Loading…
Add table
Reference in a new issue