From: Omar Sandoval <osan...@fb.com>

We have the same error handling code duplicated all over the place. Put
it all in one place, and while we're here, get rid of the weird
btrfs_orphan_del() trans == NULL case and just clear the orphan item bit
directly since that's all it does anymore.

Signed-off-by: Omar Sandoval <osan...@fb.com>
---
 fs/btrfs/inode.c | 56 +++++++++++++++++-------------------------------
 1 file changed, 20 insertions(+), 36 deletions(-)

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 207e1d139b31..b28d5f251661 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -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);
 }
-- 
2.17.0

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to