|
@@ -838,9 +838,10 @@ int qcow2_mark_dirty(BlockDriverState *bs);
|
|
int qcow2_mark_corrupt(BlockDriverState *bs);
|
|
int qcow2_mark_corrupt(BlockDriverState *bs);
|
|
int qcow2_update_header(BlockDriverState *bs);
|
|
int qcow2_update_header(BlockDriverState *bs);
|
|
|
|
|
|
-void qcow2_signal_corruption(BlockDriverState *bs, bool fatal, int64_t offset,
|
|
|
|
- int64_t size, const char *message_format, ...)
|
|
|
|
- G_GNUC_PRINTF(5, 6);
|
|
|
|
|
|
+void GRAPH_RDLOCK
|
|
|
|
+qcow2_signal_corruption(BlockDriverState *bs, bool fatal, int64_t offset,
|
|
|
|
+ int64_t size, const char *message_format, ...)
|
|
|
|
+ G_GNUC_PRINTF(5, 6);
|
|
|
|
|
|
int qcow2_validate_table(BlockDriverState *bs, uint64_t offset,
|
|
int qcow2_validate_table(BlockDriverState *bs, uint64_t offset,
|
|
uint64_t entries, size_t entry_len,
|
|
uint64_t entries, size_t entry_len,
|
|
@@ -851,33 +852,41 @@ int qcow2_validate_table(BlockDriverState *bs, uint64_t offset,
|
|
int coroutine_fn GRAPH_RDLOCK qcow2_refcount_init(BlockDriverState *bs);
|
|
int coroutine_fn GRAPH_RDLOCK qcow2_refcount_init(BlockDriverState *bs);
|
|
void qcow2_refcount_close(BlockDriverState *bs);
|
|
void qcow2_refcount_close(BlockDriverState *bs);
|
|
|
|
|
|
-int qcow2_get_refcount(BlockDriverState *bs, int64_t cluster_index,
|
|
|
|
- uint64_t *refcount);
|
|
|
|
|
|
+int GRAPH_RDLOCK qcow2_get_refcount(BlockDriverState *bs, int64_t cluster_index,
|
|
|
|
+ uint64_t *refcount);
|
|
|
|
|
|
-int qcow2_update_cluster_refcount(BlockDriverState *bs, int64_t cluster_index,
|
|
|
|
- uint64_t addend, bool decrease,
|
|
|
|
- enum qcow2_discard_type type);
|
|
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_update_cluster_refcount(BlockDriverState *bs, int64_t cluster_index,
|
|
|
|
+ uint64_t addend, bool decrease,
|
|
|
|
+ enum qcow2_discard_type type);
|
|
|
|
|
|
-int64_t qcow2_refcount_area(BlockDriverState *bs, uint64_t offset,
|
|
|
|
- uint64_t additional_clusters, bool exact_size,
|
|
|
|
- int new_refblock_index,
|
|
|
|
- uint64_t new_refblock_offset);
|
|
|
|
|
|
+int64_t GRAPH_RDLOCK
|
|
|
|
+qcow2_refcount_area(BlockDriverState *bs, uint64_t offset,
|
|
|
|
+ uint64_t additional_clusters, bool exact_size,
|
|
|
|
+ int new_refblock_index,
|
|
|
|
+ uint64_t new_refblock_offset);
|
|
|
|
|
|
-int64_t qcow2_alloc_clusters(BlockDriverState *bs, uint64_t size);
|
|
|
|
-int64_t coroutine_fn qcow2_alloc_clusters_at(BlockDriverState *bs, uint64_t offset,
|
|
|
|
- int64_t nb_clusters);
|
|
|
|
-int64_t coroutine_fn GRAPH_RDLOCK qcow2_alloc_bytes(BlockDriverState *bs, int size);
|
|
|
|
-void qcow2_free_clusters(BlockDriverState *bs,
|
|
|
|
- int64_t offset, int64_t size,
|
|
|
|
- enum qcow2_discard_type type);
|
|
|
|
-void qcow2_free_any_cluster(BlockDriverState *bs, uint64_t l2_entry,
|
|
|
|
- enum qcow2_discard_type type);
|
|
|
|
|
|
+int64_t GRAPH_RDLOCK
|
|
|
|
+qcow2_alloc_clusters(BlockDriverState *bs, uint64_t size);
|
|
|
|
|
|
-int qcow2_update_snapshot_refcount(BlockDriverState *bs,
|
|
|
|
- int64_t l1_table_offset, int l1_size, int addend);
|
|
|
|
|
|
+int64_t GRAPH_RDLOCK coroutine_fn
|
|
|
|
+qcow2_alloc_clusters_at(BlockDriverState *bs, uint64_t offset,
|
|
|
|
+ int64_t nb_clusters);
|
|
|
|
|
|
-int qcow2_flush_caches(BlockDriverState *bs);
|
|
|
|
-int qcow2_write_caches(BlockDriverState *bs);
|
|
|
|
|
|
+int64_t coroutine_fn GRAPH_RDLOCK qcow2_alloc_bytes(BlockDriverState *bs, int size);
|
|
|
|
+void GRAPH_RDLOCK qcow2_free_clusters(BlockDriverState *bs,
|
|
|
|
+ int64_t offset, int64_t size,
|
|
|
|
+ enum qcow2_discard_type type);
|
|
|
|
+void GRAPH_RDLOCK
|
|
|
|
+qcow2_free_any_cluster(BlockDriverState *bs, uint64_t l2_entry,
|
|
|
|
+ enum qcow2_discard_type type);
|
|
|
|
+
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_update_snapshot_refcount(BlockDriverState *bs, int64_t l1_table_offset,
|
|
|
|
+ int l1_size, int addend);
|
|
|
|
+
|
|
|
|
+int GRAPH_RDLOCK qcow2_flush_caches(BlockDriverState *bs);
|
|
|
|
+int GRAPH_RDLOCK qcow2_write_caches(BlockDriverState *bs);
|
|
int coroutine_fn qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
|
|
int coroutine_fn qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
|
|
BdrvCheckMode fix);
|
|
BdrvCheckMode fix);
|
|
|
|
|
|
@@ -885,39 +894,48 @@ void qcow2_process_discards(BlockDriverState *bs, int ret);
|
|
|
|
|
|
int qcow2_check_metadata_overlap(BlockDriverState *bs, int ign, int64_t offset,
|
|
int qcow2_check_metadata_overlap(BlockDriverState *bs, int ign, int64_t offset,
|
|
int64_t size);
|
|
int64_t size);
|
|
-int qcow2_pre_write_overlap_check(BlockDriverState *bs, int ign, int64_t offset,
|
|
|
|
- int64_t size, bool data_file);
|
|
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_pre_write_overlap_check(BlockDriverState *bs, int ign, int64_t offset,
|
|
|
|
+ int64_t size, bool data_file);
|
|
|
|
+
|
|
int coroutine_fn qcow2_inc_refcounts_imrt(BlockDriverState *bs, BdrvCheckResult *res,
|
|
int coroutine_fn qcow2_inc_refcounts_imrt(BlockDriverState *bs, BdrvCheckResult *res,
|
|
void **refcount_table,
|
|
void **refcount_table,
|
|
int64_t *refcount_table_size,
|
|
int64_t *refcount_table_size,
|
|
int64_t offset, int64_t size);
|
|
int64_t offset, int64_t size);
|
|
|
|
|
|
-int qcow2_change_refcount_order(BlockDriverState *bs, int refcount_order,
|
|
|
|
- BlockDriverAmendStatusCB *status_cb,
|
|
|
|
- void *cb_opaque, Error **errp);
|
|
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_change_refcount_order(BlockDriverState *bs, int refcount_order,
|
|
|
|
+ BlockDriverAmendStatusCB *status_cb,
|
|
|
|
+ void *cb_opaque, Error **errp);
|
|
int coroutine_fn GRAPH_RDLOCK qcow2_shrink_reftable(BlockDriverState *bs);
|
|
int coroutine_fn GRAPH_RDLOCK qcow2_shrink_reftable(BlockDriverState *bs);
|
|
-int64_t coroutine_fn qcow2_get_last_cluster(BlockDriverState *bs, int64_t size);
|
|
|
|
|
|
+
|
|
|
|
+int64_t coroutine_fn GRAPH_RDLOCK
|
|
|
|
+qcow2_get_last_cluster(BlockDriverState *bs, int64_t size);
|
|
|
|
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
qcow2_detect_metadata_preallocation(BlockDriverState *bs);
|
|
qcow2_detect_metadata_preallocation(BlockDriverState *bs);
|
|
|
|
|
|
/* qcow2-cluster.c functions */
|
|
/* qcow2-cluster.c functions */
|
|
-int qcow2_grow_l1_table(BlockDriverState *bs, uint64_t min_size,
|
|
|
|
- bool exact_size);
|
|
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_grow_l1_table(BlockDriverState *bs, uint64_t min_size, bool exact_size);
|
|
|
|
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
qcow2_shrink_l1_table(BlockDriverState *bs, uint64_t max_size);
|
|
qcow2_shrink_l1_table(BlockDriverState *bs, uint64_t max_size);
|
|
|
|
|
|
-int qcow2_write_l1_entry(BlockDriverState *bs, int l1_index);
|
|
|
|
|
|
+int GRAPH_RDLOCK qcow2_write_l1_entry(BlockDriverState *bs, int l1_index);
|
|
int qcow2_encrypt_sectors(BDRVQcow2State *s, int64_t sector_num,
|
|
int qcow2_encrypt_sectors(BDRVQcow2State *s, int64_t sector_num,
|
|
uint8_t *buf, int nb_sectors, bool enc, Error **errp);
|
|
uint8_t *buf, int nb_sectors, bool enc, Error **errp);
|
|
|
|
|
|
-int qcow2_get_host_offset(BlockDriverState *bs, uint64_t offset,
|
|
|
|
- unsigned int *bytes, uint64_t *host_offset,
|
|
|
|
- QCow2SubclusterType *subcluster_type);
|
|
|
|
-int coroutine_fn qcow2_alloc_host_offset(BlockDriverState *bs, uint64_t offset,
|
|
|
|
- unsigned int *bytes,
|
|
|
|
- uint64_t *host_offset, QCowL2Meta **m);
|
|
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_get_host_offset(BlockDriverState *bs, uint64_t offset,
|
|
|
|
+ unsigned int *bytes, uint64_t *host_offset,
|
|
|
|
+ QCow2SubclusterType *subcluster_type);
|
|
|
|
+
|
|
|
|
+int coroutine_fn GRAPH_RDLOCK
|
|
|
|
+qcow2_alloc_host_offset(BlockDriverState *bs, uint64_t offset,
|
|
|
|
+ unsigned int *bytes, uint64_t *host_offset,
|
|
|
|
+ QCowL2Meta **m);
|
|
|
|
+
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs, uint64_t offset,
|
|
qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs, uint64_t offset,
|
|
int compressed_size, uint64_t *host_offset);
|
|
int compressed_size, uint64_t *host_offset);
|
|
@@ -927,26 +945,33 @@ void qcow2_parse_compressed_l2_entry(BlockDriverState *bs, uint64_t l2_entry,
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m);
|
|
qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m);
|
|
|
|
|
|
-void coroutine_fn qcow2_alloc_cluster_abort(BlockDriverState *bs, QCowL2Meta *m);
|
|
|
|
-int qcow2_cluster_discard(BlockDriverState *bs, uint64_t offset,
|
|
|
|
- uint64_t bytes, enum qcow2_discard_type type,
|
|
|
|
- bool full_discard);
|
|
|
|
|
|
+void coroutine_fn GRAPH_RDLOCK
|
|
|
|
+qcow2_alloc_cluster_abort(BlockDriverState *bs, QCowL2Meta *m);
|
|
|
|
+
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_cluster_discard(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
|
|
|
|
+ enum qcow2_discard_type type, bool full_discard);
|
|
|
|
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
qcow2_subcluster_zeroize(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
|
|
qcow2_subcluster_zeroize(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
|
|
int flags);
|
|
int flags);
|
|
|
|
|
|
-int qcow2_expand_zero_clusters(BlockDriverState *bs,
|
|
|
|
- BlockDriverAmendStatusCB *status_cb,
|
|
|
|
- void *cb_opaque);
|
|
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_expand_zero_clusters(BlockDriverState *bs,
|
|
|
|
+ BlockDriverAmendStatusCB *status_cb,
|
|
|
|
+ void *cb_opaque);
|
|
|
|
|
|
/* qcow2-snapshot.c functions */
|
|
/* qcow2-snapshot.c functions */
|
|
-int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info);
|
|
|
|
-int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id);
|
|
|
|
-int qcow2_snapshot_delete(BlockDriverState *bs,
|
|
|
|
- const char *snapshot_id,
|
|
|
|
- const char *name,
|
|
|
|
- Error **errp);
|
|
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info);
|
|
|
|
+
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id);
|
|
|
|
+
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_snapshot_delete(BlockDriverState *bs, const char *snapshot_id,
|
|
|
|
+ const char *name, Error **errp);
|
|
|
|
+
|
|
int qcow2_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab);
|
|
int qcow2_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab);
|
|
int qcow2_snapshot_load_tmp(BlockDriverState *bs,
|
|
int qcow2_snapshot_load_tmp(BlockDriverState *bs,
|
|
const char *snapshot_id,
|
|
const char *snapshot_id,
|
|
@@ -956,15 +981,15 @@ int qcow2_snapshot_load_tmp(BlockDriverState *bs,
|
|
void qcow2_free_snapshots(BlockDriverState *bs);
|
|
void qcow2_free_snapshots(BlockDriverState *bs);
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
qcow2_read_snapshots(BlockDriverState *bs, Error **errp);
|
|
qcow2_read_snapshots(BlockDriverState *bs, Error **errp);
|
|
-int qcow2_write_snapshots(BlockDriverState *bs);
|
|
|
|
|
|
+int GRAPH_RDLOCK qcow2_write_snapshots(BlockDriverState *bs);
|
|
|
|
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
int coroutine_fn GRAPH_RDLOCK
|
|
qcow2_check_read_snapshot_table(BlockDriverState *bs, BdrvCheckResult *result,
|
|
qcow2_check_read_snapshot_table(BlockDriverState *bs, BdrvCheckResult *result,
|
|
BdrvCheckMode fix);
|
|
BdrvCheckMode fix);
|
|
|
|
|
|
-int coroutine_fn qcow2_check_fix_snapshot_table(BlockDriverState *bs,
|
|
|
|
- BdrvCheckResult *result,
|
|
|
|
- BdrvCheckMode fix);
|
|
|
|
|
|
+int coroutine_fn GRAPH_RDLOCK
|
|
|
|
+qcow2_check_fix_snapshot_table(BlockDriverState *bs, BdrvCheckResult *result,
|
|
|
|
+ BdrvCheckMode fix);
|
|
|
|
|
|
/* qcow2-cache.c functions */
|
|
/* qcow2-cache.c functions */
|
|
Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables,
|
|
Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables,
|
|
@@ -972,19 +997,23 @@ Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables,
|
|
int qcow2_cache_destroy(Qcow2Cache *c);
|
|
int qcow2_cache_destroy(Qcow2Cache *c);
|
|
|
|
|
|
void qcow2_cache_entry_mark_dirty(Qcow2Cache *c, void *table);
|
|
void qcow2_cache_entry_mark_dirty(Qcow2Cache *c, void *table);
|
|
-int qcow2_cache_flush(BlockDriverState *bs, Qcow2Cache *c);
|
|
|
|
-int qcow2_cache_write(BlockDriverState *bs, Qcow2Cache *c);
|
|
|
|
-int qcow2_cache_set_dependency(BlockDriverState *bs, Qcow2Cache *c,
|
|
|
|
- Qcow2Cache *dependency);
|
|
|
|
|
|
+int GRAPH_RDLOCK qcow2_cache_flush(BlockDriverState *bs, Qcow2Cache *c);
|
|
|
|
+int GRAPH_RDLOCK qcow2_cache_write(BlockDriverState *bs, Qcow2Cache *c);
|
|
|
|
+int GRAPH_RDLOCK qcow2_cache_set_dependency(BlockDriverState *bs, Qcow2Cache *c,
|
|
|
|
+ Qcow2Cache *dependency);
|
|
void qcow2_cache_depends_on_flush(Qcow2Cache *c);
|
|
void qcow2_cache_depends_on_flush(Qcow2Cache *c);
|
|
|
|
|
|
void qcow2_cache_clean_unused(Qcow2Cache *c);
|
|
void qcow2_cache_clean_unused(Qcow2Cache *c);
|
|
-int qcow2_cache_empty(BlockDriverState *bs, Qcow2Cache *c);
|
|
|
|
|
|
+int GRAPH_RDLOCK qcow2_cache_empty(BlockDriverState *bs, Qcow2Cache *c);
|
|
|
|
+
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_cache_get(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
|
|
|
|
+ void **table);
|
|
|
|
+
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_cache_get_empty(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
|
|
|
|
+ void **table);
|
|
|
|
|
|
-int qcow2_cache_get(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
|
|
|
|
- void **table);
|
|
|
|
-int qcow2_cache_get_empty(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
|
|
|
|
- void **table);
|
|
|
|
void qcow2_cache_put(Qcow2Cache *c, void **table);
|
|
void qcow2_cache_put(Qcow2Cache *c, void **table);
|
|
void *qcow2_cache_is_table_offset(Qcow2Cache *c, uint64_t offset);
|
|
void *qcow2_cache_is_table_offset(Qcow2Cache *c, uint64_t offset);
|
|
void qcow2_cache_discard(Qcow2Cache *c, void *table);
|
|
void qcow2_cache_discard(Qcow2Cache *c, void *table);
|
|
@@ -998,17 +1027,22 @@ bool coroutine_fn GRAPH_RDLOCK
|
|
qcow2_load_dirty_bitmaps(BlockDriverState *bs, bool *header_updated, Error **errp);
|
|
qcow2_load_dirty_bitmaps(BlockDriverState *bs, bool *header_updated, Error **errp);
|
|
bool qcow2_get_bitmap_info_list(BlockDriverState *bs,
|
|
bool qcow2_get_bitmap_info_list(BlockDriverState *bs,
|
|
Qcow2BitmapInfoList **info_list, Error **errp);
|
|
Qcow2BitmapInfoList **info_list, Error **errp);
|
|
-int qcow2_reopen_bitmaps_rw(BlockDriverState *bs, Error **errp);
|
|
|
|
|
|
+int GRAPH_RDLOCK qcow2_reopen_bitmaps_rw(BlockDriverState *bs, Error **errp);
|
|
|
|
+int GRAPH_RDLOCK qcow2_reopen_bitmaps_ro(BlockDriverState *bs, Error **errp);
|
|
int coroutine_fn qcow2_truncate_bitmaps_check(BlockDriverState *bs, Error **errp);
|
|
int coroutine_fn qcow2_truncate_bitmaps_check(BlockDriverState *bs, Error **errp);
|
|
-bool qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs,
|
|
|
|
- bool release_stored, Error **errp);
|
|
|
|
-int qcow2_reopen_bitmaps_ro(BlockDriverState *bs, Error **errp);
|
|
|
|
|
|
+
|
|
|
|
+bool GRAPH_RDLOCK
|
|
|
|
+qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs, bool release_stored,
|
|
|
|
+ Error **errp);
|
|
|
|
+
|
|
bool coroutine_fn GRAPH_RDLOCK
|
|
bool coroutine_fn GRAPH_RDLOCK
|
|
qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs, const char *name,
|
|
qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs, const char *name,
|
|
uint32_t granularity, Error **errp);
|
|
uint32_t granularity, Error **errp);
|
|
-int coroutine_fn qcow2_co_remove_persistent_dirty_bitmap(BlockDriverState *bs,
|
|
|
|
- const char *name,
|
|
|
|
- Error **errp);
|
|
|
|
|
|
+
|
|
|
|
+int coroutine_fn GRAPH_RDLOCK
|
|
|
|
+qcow2_co_remove_persistent_dirty_bitmap(BlockDriverState *bs, const char *name,
|
|
|
|
+ Error **errp);
|
|
|
|
+
|
|
bool qcow2_supports_persistent_dirty_bitmap(BlockDriverState *bs);
|
|
bool qcow2_supports_persistent_dirty_bitmap(BlockDriverState *bs);
|
|
uint64_t qcow2_get_persistent_dirty_bitmap_size(BlockDriverState *bs,
|
|
uint64_t qcow2_get_persistent_dirty_bitmap_size(BlockDriverState *bs,
|
|
uint32_t cluster_size);
|
|
uint32_t cluster_size);
|