|
@@ -75,6 +75,23 @@ void btrfs_put_transaction(struct btrfs_transaction *transaction)
|
|
list_del_init(&em->list);
|
|
list_del_init(&em->list);
|
|
free_extent_map(em);
|
|
free_extent_map(em);
|
|
}
|
|
}
|
|
|
|
+ /*
|
|
|
|
+ * If any block groups are found in ->deleted_bgs then it's
|
|
|
|
+ * because the transaction was aborted and a commit did not
|
|
|
|
+ * happen (things failed before writing the new superblock
|
|
|
|
+ * and calling btrfs_finish_extent_commit()), so we can not
|
|
|
|
+ * discard the physical locations of the block groups.
|
|
|
|
+ */
|
|
|
|
+ while (!list_empty(&transaction->deleted_bgs)) {
|
|
|
|
+ struct btrfs_block_group_cache *cache;
|
|
|
|
+
|
|
|
|
+ cache = list_first_entry(&transaction->deleted_bgs,
|
|
|
|
+ struct btrfs_block_group_cache,
|
|
|
|
+ bg_list);
|
|
|
|
+ list_del_init(&cache->bg_list);
|
|
|
|
+ btrfs_put_block_group_trimming(cache);
|
|
|
|
+ btrfs_put_block_group(cache);
|
|
|
|
+ }
|
|
kmem_cache_free(btrfs_transaction_cachep, transaction);
|
|
kmem_cache_free(btrfs_transaction_cachep, transaction);
|
|
}
|
|
}
|
|
}
|
|
}
|