@@ -3324,16 +3324,12 @@ static int btrfs_orphan_del(struct btrfs_trans_handle *trans,
struct btrfs_inode *inode)
{
struct btrfs_root *root = inode->root;
- int ret = 0;
if (!test_and_clear_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
&inode->runtime_flags))
return 0;
- if (trans)
- ret = btrfs_del_orphan_item(trans, root, btrfs_ino(inode));
-
- return ret;
+ return btrfs_del_orphan_item(trans, root, btrfs_ino(inode));
}
/*
@@ -5155,12 +5151,10 @@ void btrfs_evict_inode(struct inode *inode)
((btrfs_root_refs(&root->root_item) != 0 &&
root->root_key.objectid != BTRFS_ROOT_TREE_OBJECTID) ||
btrfs_is_free_space_inode(BTRFS_I(inode))))
- goto no_delete;
+ goto out;
- if (is_bad_inode(inode)) {
- btrfs_orphan_del(NULL, BTRFS_I(inode));
- goto no_delete;
- }
+ if (is_bad_inode(inode))
+ goto clear_orphan;
/* do we really want it for ->i_nlink > 0 and zero btrfs_root_refs? */
if (!special_file(inode->i_mode))
btrfs_wait_ordered_range(inode, 0, (u64)-1);
@@ -5170,26 +5164,22 @@ void btrfs_evict_inode(struct inode *inode)
if (test_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags)) {
BUG_ON(test_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
&BTRFS_I(inode)->runtime_flags));
- goto no_delete;
+ goto out;
}
if (inode->i_nlink > 0) {
BUG_ON(btrfs_root_refs(&root->root_item) != 0 &&
root->root_key.objectid != BTRFS_ROOT_TREE_OBJECTID);
- goto no_delete;
+ goto out;
}
ret = btrfs_commit_inode_delayed_inode(BTRFS_I(inode));
- if (ret) {
- btrfs_orphan_del(NULL, BTRFS_I(inode));
- goto no_delete;
- }
+ if (ret)
+ goto clear_orphan;
rsv = btrfs_alloc_block_rsv(fs_info, BTRFS_BLOCK_RSV_TEMP);
- if (!rsv) {
- btrfs_orphan_del(NULL, BTRFS_I(inode));
- goto no_delete;
- }
+ if (!rsv)
+ goto clear_orphan;
rsv->size = min_size;
rsv->failfast = 1;
@@ -5197,11 +5187,8 @@ void btrfs_evict_inode(struct inode *inode)
while (1) {
trans = evict_refill_and_join(root, rsv, min_size);
- if (IS_ERR(trans)) {
- btrfs_orphan_del(NULL, BTRFS_I(inode));
- btrfs_free_block_rsv(fs_info, rsv);
- goto no_delete;
- }
+ if (IS_ERR(trans))
+ goto free_rsv;
trans->block_rsv = rsv;
@@ -5210,11 +5197,8 @@ void btrfs_evict_inode(struct inode *inode)
btrfs_end_transaction(trans);
btrfs_btree_balance_dirty(fs_info);
if (ret) {
- if (ret != -ENOSPC && ret != -EAGAIN) {
- btrfs_orphan_del(NULL, BTRFS_I(inode));
- btrfs_free_block_rsv(fs_info, rsv);
- goto no_delete;
- }
+ if (ret != -ENOSPC && ret != -EAGAIN)
+ goto free_rsv;
} else {
break;
}
@@ -5230,27 +5214,27 @@ void btrfs_evict_inode(struct inode *inode)
* to add a mechanism for retrying these after a commit.
*/
trans = evict_refill_and_join(root, rsv, min_size);
- if (IS_ERR(trans)) {
- btrfs_orphan_del(NULL, BTRFS_I(inode));
- } else {
+ if (!IS_ERR(trans)) {
trans->block_rsv = rsv;
btrfs_orphan_del(trans, BTRFS_I(inode));
trans->block_rsv = &fs_info->trans_block_rsv;
btrfs_end_transaction(trans);
}
- btrfs_free_block_rsv(fs_info, rsv);
-
if (!(root == fs_info->tree_root ||
root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID))
btrfs_return_ino(root, btrfs_ino(BTRFS_I(inode)));
+free_rsv:
+ btrfs_free_block_rsv(fs_info, rsv);
+clear_orphan:
/*
* If we didn't successfully delete, the orphan item will still be in
* the tree and we'll retry on the next mount. Again, we might also want
* to retry these periodically in the future.
*/
-no_delete:
+ clear_bit(BTRFS_INODE_HAS_ORPHAN_ITEM, &BTRFS_I(inode)->runtime_flags);
+out:
btrfs_remove_delayed_node(BTRFS_I(inode));
clear_inode(inode);
}