diff options
-rw-r--r-- | fs/btrfs/disk-io.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index bd48bf21118e..8140cb01951f 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -3615,11 +3615,11 @@ int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans, | |||
3615 | } | 3615 | } |
3616 | 3616 | ||
3617 | while ((node = rb_first(&delayed_refs->root)) != NULL) { | 3617 | while ((node = rb_first(&delayed_refs->root)) != NULL) { |
3618 | ref = rb_entry(node, struct btrfs_delayed_ref_node, rb_node); | 3618 | struct btrfs_delayed_ref_head *head = NULL; |
3619 | 3619 | ||
3620 | ref = rb_entry(node, struct btrfs_delayed_ref_node, rb_node); | ||
3620 | atomic_set(&ref->refs, 1); | 3621 | atomic_set(&ref->refs, 1); |
3621 | if (btrfs_delayed_ref_is_head(ref)) { | 3622 | if (btrfs_delayed_ref_is_head(ref)) { |
3622 | struct btrfs_delayed_ref_head *head; | ||
3623 | 3623 | ||
3624 | head = btrfs_delayed_node_to_head(ref); | 3624 | head = btrfs_delayed_node_to_head(ref); |
3625 | if (!mutex_trylock(&head->mutex)) { | 3625 | if (!mutex_trylock(&head->mutex)) { |
@@ -3641,10 +3641,12 @@ int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans, | |||
3641 | delayed_refs->num_heads_ready--; | 3641 | delayed_refs->num_heads_ready--; |
3642 | list_del_init(&head->cluster); | 3642 | list_del_init(&head->cluster); |
3643 | } | 3643 | } |
3644 | |||
3644 | ref->in_tree = 0; | 3645 | ref->in_tree = 0; |
3645 | rb_erase(&ref->rb_node, &delayed_refs->root); | 3646 | rb_erase(&ref->rb_node, &delayed_refs->root); |
3646 | delayed_refs->num_entries--; | 3647 | delayed_refs->num_entries--; |
3647 | 3648 | if (head) | |
3649 | mutex_unlock(&head->mutex); | ||
3648 | spin_unlock(&delayed_refs->lock); | 3650 | spin_unlock(&delayed_refs->lock); |
3649 | btrfs_put_delayed_ref(ref); | 3651 | btrfs_put_delayed_ref(ref); |
3650 | 3652 | ||