btrfs: make btrfs_release_delayed_iref handle the !iref case
Right now we only cleanup the delayed iref if we have BTRFS_DELAYED_NODE_DEL_IREF set on the node. However we have some error conditions that need to cleanup the iref if it still exists, so to make this code cleaner move the test_bit into btrfs_release_delayed_iref itself and unconditionally call it in each of the cases instead. Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
committed by
David Sterba
parent
eb3b505366
commit
a4cb90dc01
@@ -974,14 +974,16 @@ static void btrfs_release_delayed_inode(struct btrfs_delayed_node *delayed_node)
|
|||||||
|
|
||||||
static void btrfs_release_delayed_iref(struct btrfs_delayed_node *delayed_node)
|
static void btrfs_release_delayed_iref(struct btrfs_delayed_node *delayed_node)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (test_and_clear_bit(BTRFS_DELAYED_NODE_DEL_IREF, &delayed_node->flags)) {
|
||||||
struct btrfs_delayed_root *delayed_root;
|
struct btrfs_delayed_root *delayed_root;
|
||||||
|
|
||||||
ASSERT(delayed_node->root);
|
ASSERT(delayed_node->root);
|
||||||
clear_bit(BTRFS_DELAYED_NODE_DEL_IREF, &delayed_node->flags);
|
|
||||||
delayed_node->count--;
|
delayed_node->count--;
|
||||||
|
|
||||||
delayed_root = delayed_node->root->fs_info->delayed_root;
|
delayed_root = delayed_node->root->fs_info->delayed_root;
|
||||||
finish_one_item(delayed_root);
|
finish_one_item(delayed_root);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
|
static int __btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
|
||||||
@@ -1024,7 +1026,7 @@ static int __btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
|
|||||||
btrfs_mark_buffer_dirty(leaf);
|
btrfs_mark_buffer_dirty(leaf);
|
||||||
|
|
||||||
if (!test_bit(BTRFS_DELAYED_NODE_DEL_IREF, &node->flags))
|
if (!test_bit(BTRFS_DELAYED_NODE_DEL_IREF, &node->flags))
|
||||||
goto no_iref;
|
goto out;
|
||||||
|
|
||||||
path->slots[0]++;
|
path->slots[0]++;
|
||||||
if (path->slots[0] >= btrfs_header_nritems(leaf))
|
if (path->slots[0] >= btrfs_header_nritems(leaf))
|
||||||
@@ -1046,7 +1048,6 @@ again:
|
|||||||
btrfs_del_item(trans, root, path);
|
btrfs_del_item(trans, root, path);
|
||||||
out:
|
out:
|
||||||
btrfs_release_delayed_iref(node);
|
btrfs_release_delayed_iref(node);
|
||||||
no_iref:
|
|
||||||
btrfs_release_path(path);
|
btrfs_release_path(path);
|
||||||
err_out:
|
err_out:
|
||||||
btrfs_delayed_inode_release_metadata(fs_info, node, (ret < 0));
|
btrfs_delayed_inode_release_metadata(fs_info, node, (ret < 0));
|
||||||
@@ -1898,7 +1899,6 @@ static void __btrfs_kill_delayed_node(struct btrfs_delayed_node *delayed_node)
|
|||||||
btrfs_release_delayed_item(prev_item);
|
btrfs_release_delayed_item(prev_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_bit(BTRFS_DELAYED_NODE_DEL_IREF, &delayed_node->flags))
|
|
||||||
btrfs_release_delayed_iref(delayed_node);
|
btrfs_release_delayed_iref(delayed_node);
|
||||||
|
|
||||||
if (test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) {
|
if (test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user