|
@@ -641,7 +641,7 @@ static inline void set_l2_bitmap(BDRVQcow2State *s, uint64_t *l2_slice,
|
|
l2_slice[idx + 1] = cpu_to_be64(bitmap);
|
|
l2_slice[idx + 1] = cpu_to_be64(bitmap);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline bool has_data_file(BlockDriverState *bs)
|
|
|
|
|
|
+static inline bool GRAPH_RDLOCK has_data_file(BlockDriverState *bs)
|
|
{
|
|
{
|
|
BDRVQcow2State *s = bs->opaque;
|
|
BDRVQcow2State *s = bs->opaque;
|
|
return (s->data_file != bs->file);
|
|
return (s->data_file != bs->file);
|
|
@@ -709,8 +709,8 @@ static inline int64_t qcow2_vm_state_offset(BDRVQcow2State *s)
|
|
return (int64_t)s->l1_vm_state_index << (s->cluster_bits + s->l2_bits);
|
|
return (int64_t)s->l1_vm_state_index << (s->cluster_bits + s->l2_bits);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline QCow2ClusterType qcow2_get_cluster_type(BlockDriverState *bs,
|
|
|
|
- uint64_t l2_entry)
|
|
|
|
|
|
+static inline QCow2ClusterType GRAPH_RDLOCK
|
|
|
|
+qcow2_get_cluster_type(BlockDriverState *bs, uint64_t l2_entry)
|
|
{
|
|
{
|
|
BDRVQcow2State *s = bs->opaque;
|
|
BDRVQcow2State *s = bs->opaque;
|
|
|
|
|
|
@@ -743,7 +743,7 @@ static inline QCow2ClusterType qcow2_get_cluster_type(BlockDriverState *bs,
|
|
* (this checks the whole entry and bitmap, not only the bits related
|
|
* (this checks the whole entry and bitmap, not only the bits related
|
|
* to subcluster @sc_index).
|
|
* to subcluster @sc_index).
|
|
*/
|
|
*/
|
|
-static inline
|
|
|
|
|
|
+static inline GRAPH_RDLOCK
|
|
QCow2SubclusterType qcow2_get_subcluster_type(BlockDriverState *bs,
|
|
QCow2SubclusterType qcow2_get_subcluster_type(BlockDriverState *bs,
|
|
uint64_t l2_entry,
|
|
uint64_t l2_entry,
|
|
uint64_t l2_bitmap,
|
|
uint64_t l2_bitmap,
|
|
@@ -834,9 +834,9 @@ int64_t qcow2_refcount_metadata_size(int64_t clusters, size_t cluster_size,
|
|
int refcount_order, bool generous_increase,
|
|
int refcount_order, bool generous_increase,
|
|
uint64_t *refblock_count);
|
|
uint64_t *refblock_count);
|
|
|
|
|
|
-int qcow2_mark_dirty(BlockDriverState *bs);
|
|
|
|
-int qcow2_mark_corrupt(BlockDriverState *bs);
|
|
|
|
-int qcow2_update_header(BlockDriverState *bs);
|
|
|
|
|
|
+int GRAPH_RDLOCK qcow2_mark_dirty(BlockDriverState *bs);
|
|
|
|
+int GRAPH_RDLOCK qcow2_mark_corrupt(BlockDriverState *bs);
|
|
|
|
+int GRAPH_RDLOCK qcow2_update_header(BlockDriverState *bs);
|
|
|
|
|
|
void GRAPH_RDLOCK
|
|
void GRAPH_RDLOCK
|
|
qcow2_signal_corruption(BlockDriverState *bs, bool fatal, int64_t offset,
|
|
qcow2_signal_corruption(BlockDriverState *bs, bool fatal, int64_t offset,
|
|
@@ -890,10 +890,11 @@ 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);
|
|
|
|
|
|
-void qcow2_process_discards(BlockDriverState *bs, int ret);
|
|
|
|
|
|
+void GRAPH_RDLOCK qcow2_process_discards(BlockDriverState *bs, int ret);
|
|
|
|
|
|
-int qcow2_check_metadata_overlap(BlockDriverState *bs, int ign, int64_t offset,
|
|
|
|
- int64_t size);
|
|
|
|
|
|
+int GRAPH_RDLOCK
|
|
|
|
+qcow2_check_metadata_overlap(BlockDriverState *bs, int ign, int64_t offset,
|
|
|
|
+ int64_t size);
|
|
int GRAPH_RDLOCK
|
|
int GRAPH_RDLOCK
|
|
qcow2_pre_write_overlap_check(BlockDriverState *bs, int ign, int64_t offset,
|
|
qcow2_pre_write_overlap_check(BlockDriverState *bs, int ign, int64_t offset,
|
|
int64_t size, bool data_file);
|
|
int64_t size, bool data_file);
|
|
@@ -939,8 +940,9 @@ qcow2_alloc_host_offset(BlockDriverState *bs, uint64_t offset,
|
|
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);
|
|
-void qcow2_parse_compressed_l2_entry(BlockDriverState *bs, uint64_t l2_entry,
|
|
|
|
- uint64_t *coffset, int *csize);
|
|
|
|
|
|
+void GRAPH_RDLOCK
|
|
|
|
+qcow2_parse_compressed_l2_entry(BlockDriverState *bs, uint64_t l2_entry,
|
|
|
|
+ uint64_t *coffset, int *csize);
|
|
|
|
|
|
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);
|
|
@@ -993,8 +995,9 @@ qcow2_check_fix_snapshot_table(BlockDriverState *bs, BdrvCheckResult *result,
|
|
BdrvCheckMode fix);
|
|
BdrvCheckMode fix);
|
|
|
|
|
|
/* qcow2-cache.c functions */
|
|
/* qcow2-cache.c functions */
|
|
-Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables,
|
|
|
|
- unsigned table_size);
|
|
|
|
|
|
+Qcow2Cache * GRAPH_RDLOCK
|
|
|
|
+qcow2_cache_create(BlockDriverState *bs, int num_tables, unsigned table_size);
|
|
|
|
+
|
|
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);
|
|
@@ -1020,17 +1023,24 @@ 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);
|
|
|
|
|
|
/* qcow2-bitmap.c functions */
|
|
/* qcow2-bitmap.c functions */
|
|
-int coroutine_fn
|
|
|
|
|
|
+int coroutine_fn GRAPH_RDLOCK
|
|
qcow2_check_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
|
|
qcow2_check_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
|
|
void **refcount_table,
|
|
void **refcount_table,
|
|
int64_t *refcount_table_size);
|
|
int64_t *refcount_table_size);
|
|
|
|
+
|
|
bool coroutine_fn GRAPH_RDLOCK
|
|
bool coroutine_fn GRAPH_RDLOCK
|
|
-qcow2_load_dirty_bitmaps(BlockDriverState *bs, bool *header_updated, Error **errp);
|
|
|
|
-bool qcow2_get_bitmap_info_list(BlockDriverState *bs,
|
|
|
|
- Qcow2BitmapInfoList **info_list, Error **errp);
|
|
|
|
|
|
+qcow2_load_dirty_bitmaps(BlockDriverState *bs, bool *header_updated,
|
|
|
|
+ Error **errp);
|
|
|
|
+
|
|
|
|
+bool GRAPH_RDLOCK
|
|
|
|
+qcow2_get_bitmap_info_list(BlockDriverState *bs,
|
|
|
|
+ Qcow2BitmapInfoList **info_list, Error **errp);
|
|
|
|
+
|
|
int GRAPH_RDLOCK 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 GRAPH_RDLOCK qcow2_reopen_bitmaps_ro(BlockDriverState *bs, Error **errp);
|
|
-int coroutine_fn qcow2_truncate_bitmaps_check(BlockDriverState *bs, Error **errp);
|
|
|
|
|
|
+
|
|
|
|
+int coroutine_fn GRAPH_RDLOCK
|
|
|
|
+qcow2_truncate_bitmaps_check(BlockDriverState *bs, Error **errp);
|
|
|
|
|
|
bool GRAPH_RDLOCK
|
|
bool GRAPH_RDLOCK
|
|
qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs, bool release_stored,
|
|
qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs, bool release_stored,
|